Threading veya MultiProcessing kullanarak web scraping mümkün mü?

Merhaba herkese iyi forumlar. Benim sorum şu şekilde threading veya multiprocessing kullanarak bir websitesindeki her bir kategoriyi aynı anda dolaşıp veri çekebilmek mümkün mü? Eğer mümkünse nasıl yapılabilir bu konu hakkında görüşlerinizi benimle paylaşırsanız çok sevinirim.

https://python-istihza.yazbel.com/standart_moduller/threading.html
Threading için burayı araştırabilirsin. Web sitesinin içeriğini çekmek için requests, içeriği ayıklamak içinse beautifulsoup veya re modüllerini kullanarak yapabilirsin

Mümkün.

Kategorilerin sadece birinden veri çekebiliyor musunuz şu anda?

1 Beğeni

Şöyle diyeyim elimde kategori linkleri mevcut ve ben bu linkleri veri çekme fonksiyonuna for döngüsüyle tek tek gönderiyorum. Bütün kategorilerden veri çekebiliyorum ama sırasıyla bunu aynı anda yaptırmak istiyorum.

1 Beğeni

Threading modülünü kullanmayı öğrenirseniz bunu kolayca yapabilirsiniz. Benzer bir problem daha önce forumda da çözülmüştü, onu da inceleyebilirsiniz:

Biraz geç oldu ama cevap olarak attığınız konuya yeni bakabildim istediğim şeyi yaptım fakat şöyle bir sorun oluştu thread sayısını 2 yapsam bile verileri çekerken hata alıyorum. Bunu bir çok kez denedim ve çektiğim ürünlerin toplam sayısı hiçbir zaman birbirini tutmadı acaba sorun ne olabilir.

Kodu yanlis yazmis olabilirsin.

Hata ne peki? Kodunuzu da atın istiyorasanız.


import requests

from bs4 import BeautifulSoup

import threading

import datetime

products = []

links = [

    "https://www.vatanbilgisayar.com/islemciler/?stk=true",

    "https://www.vatanbilgisayar.com/hard-disk/?stk=true",

    "https://www.vatanbilgisayar.com/sogutma-sistemleri/?stk=true",

    "https://www.vatanbilgisayar.com/klavyeler/?stk=true",

    "https://www.vatanbilgisayar.com/bilgisayar-kasasi/?stk=true",

    "https://www.vatanbilgisayar.com/ekran-kartlari/?stk=true",

    "https://www.vatanbilgisayar.com/harici-diskler/?stk=true",

    "https://www.vatanbilgisayar.com/solid-state-disk/?stk=true",

    "https://www.vatanbilgisayar.com/bilgisayar-mouse/?stk=true",

    "https://www.vatanbilgisayar.com/anakart/?stk=true",

    "https://www.vatanbilgisayar.com/bilgisayar-ram-bellek/?stk=true",

    "https://www.vatanbilgisayar.com/bilgisayar-monitorleri/?stk=true",

    "https://www.vatanbilgisayar.com/usb-bellek/?stk=true",

    "https://www.vatanbilgisayar.com/guc-kaynaklari-power/?stk=true",

    "https://www.vatanbilgisayar.com/bluetooth-kulaklik-mikrofon/?stk=true",

    "https://www.vatanbilgisayar.com/oyuncu-koltuklari/?stk=true",

    "https://www.vatanbilgisayar.com/mouse-pad/?stk=true",

    "https://www.vatanbilgisayar.com/notebook/?stk=true"

]

baslangic = datetime.datetime.now()

i = 0

threads = 10

number = 0

def vatan(b):

    global threads,number

    page = 1

    controller = 2

    

    while page <= controller:

        

        link = f"{b}&page={page}"

        response = requests.get(link)

        response = response.content

        soup = BeautifulSoup(response,"html.parser")

        productCategory = soup.find("p",{"class":"wrapper-detailpage-header__text"}).strong.span.text       

        controller = (int(soup.find("p",{"class":"wrapper-detailpage-header__text"}).strong.span.next_sibling.next_sibling.text) / 24 ) + 0.99  

        #toplam ürün sayısını 24'e yani her bir sayfadaki ürün sayısına bölüp kaç sayfa ilerleyeceğimi buluyorum

        productList = soup.find("div",{"class":"wrapper-product wrapper-product--list-page clearfix"}).find_all("div",{"class":"product-list product-list--list-page"})

        for product in productList:

            productName = (product.find("div",{"class":"product-list__product-name"}).text).strip()

            productPrice = product.find("span",{"class":"product-list__price"}).text

            productLink = product.find("a",{"class":"product-list__image-safe-link sld"}).get("href")

            productLink = f"https://www.vatanbilgisayar.com{productLink}"

            productImage = product.find("a",{"class":"product-list__image-safe-link sld"}).div.img.get("data-src")

            producTpl = (

                        productName,

                        productPrice,

                        productLink,

                        productImage,

                        productCategory,

                        10,

            )

            if producTpl in products:            

                pass

            else:

                products.append(producTpl)

                

            number += 1

            print(number,productName,productPrice,"VATAN")

        page += 1

    page = 1

    threads -= 1

def threadings():

    global i

    global threads

    while i < len(links):

        if threads < 20:

            site = links[i]    

            

            t = threading.Thread(target=vatan, args=(site,))

            t.start() 

                

            i += 1

            threads += 1

threadings()

bitis = datetime.datetime.now()

print(bitis - baslangic) 

Kod bu şekilde ayrıca datetime ile programın ne kadar sürdüğüne bakmak istiyorum. Hiçbir şekilde çıktı alamıyorum.