Scrapy ile dinamik url listesi tarama

Merhabalar.

Scrapy kullanarak bir web sitesinden veri almak ve dosyaya kaydetmek istiyorum. Yalnız verilerin bulunduğu ilgili sayfaların linklerini ana sayfadan almam gerekiyor. Dolayısıyla öncelikle ana sayfayı tarayıp linkleri ayrıştırdıktan sonra (link sayısı her taramada değişiyor) bu linkleri birer birer taramam gerekiyor. Ana sayfayı tarıyorum, sorun yok. Linkleri ayrıştırıp bir dizi halinde alıyorum (farklı yapılarda da alabilirim) ancak bu linkleri taradığımda (örneğin 200 adet link var) sadece son linkten dönen veriyi kayıt edebiliyorum. Scrapy nin xpath yada css seçicileriyle işim yok çünkü ana sayfa javascript çalıştırıyor ve tarama sonrası bana json verisi döndürüyor. Linkleri bu json verisinden seçiyorum.

Örneğin:

www siteadresi com

Taramadan sonra ayrıştırdığım linkler:

www siteadresi com/123
www siteadresi com/456
www siteadresi com/789

Bu linkleri birer birer taramam ve dönen değeri kaydetmem gerekiyor. Scrapy yapısına çok hakim olamadığım için (belgelere göz gezdirmeme rağmen) nasıl bir yol izleyeceğimi bilemiyorum. Yardımcı olabilecek kimse var mı acaba? Şimdiden teşekkürler…

1 Beğeni

Sorunumu çözdüm arkadaşlar. Aynı sorunla karşılaşanlar için kısaca açıklamam gerekirse:

Scrapy nin parse fonksiyonuna bir geri dönüş değeri atamam gerekti. Daha doğrusu başka bir fonksiyona işaret etmem gerekti diyebilirim. Kaydetmek istediğim verileri bu fonksiyon içinde işleme koydum.

Kısa bir örnek:

start_urls = ‘https //www siteadresi com/’# Ana Sayfa

def parse(self, response):
    results = json.loads(response.body)

    # Sayfa numaralarını barındıran anahtar adı (data)
    for i in results['data']:

        # Sayfa numarası (id)
        page_num = i['id']
        page = 'https://www.siteadresi.com/sayfa/'

        # Veri almak istediğim sayfa (https://www.siteadresi.com/sayfa/123)
        url = urljoin(response.url, (page + str(page_num)))

        # Fonksiyon çağrısı (callback)
        yield scrapy.Request(url, callback=self.parse_product)

def parse_product(self, response):
    result = json.loads(response.body)

   # Veri
    val = result['value']# Veri
    
    print("{}".format(val))

Şimdilik bu şekilde çözülmüş görünüyor. İstediğim verilerin tamamını alabiliyorum. Daha pratik yada daha sağlıklı bir çözüm öneriniz olur ise bildirirseniz sevinirim. Herkese iyi çalışmalar…