2016-04-10 23 views
0

Örümcem bağlantılarını takip etmede sorun yaşıyorum. Scrapy öğreticisini defalarca okudum ve biraz arandım, ama hala kafam karıştı.Scrub parse_dir_contents ile ilgili bağlantıları takip etmiyor Geri arama

Bazı nedenlerden dolayı, yaklaşık 15-20 sayfalık yüzlerce sonuç yayılmış olsa da, örümcekim her zaman 5 - 7 sonuç döndürüyor ve tamamlandı diyor.

Her ikisi de parse_dir_contents yöntemim çağrılmadan hemen önce ve çalışmaya başladıkça sağda bazı baskı ifadeleri yerleştirdim. Bir sebepten ötürü, 40 kez (iki takım 20) denir ve sadece 5 - 7 kez çalışır. Her sayfa için yaklaşık 20 sonuç var ve her seferinde gezinmekte olduğu URL'yi yazdırıyorsam, sayfa 1'i asla geçmemesidir.

Eminim ki daha iyi yapabileceğim pek çok şey vardır bu kod Herhangi bir yardım, gerçekten takdir edilecektir. Bu işi yapmak için gerçekten çok çalışıyorum.

Burada, gerçekten işleri karıştırmaya yetecek miktarda "yardımcı" kod var. Özür dilerim, ancak size en iyi çözümü almak için kullanacağım kodları vermek istedim.

Her sayfada, her sayfa için çoğaltılan bir dizi "vip" listesi vardır. Bu yüzden sadece bir kez kazımak istedim ve numPages hesaplamasına katmalarını istemedim.

cevap

1

Sorunu işaret etmek gerçekten zor çünkü verdiğiniz kodla hatayı yeniden oluşturamıyorum. Ben sorunun koduyla tam olarak ne olduğunu bilmiyorum ama kodunuzu iyileştirmeye size bazı ipuçları verebilir: xpath veya css seçici, daha da hızlı kazıma sopa zaman

for regularListingContainer in body.xpath('//div[@class="search-item regular-ad"]'): 
     link = str(regularListingContainer.re('href="(.*)" class="title">')) 

Birden zaman arayabilirsin scrapy kütüphaneye size sadece extract() o

for regularListingContainer in body.xpath('//div[@class="search-item regular-ad"]'): 
     link = regularListingContainer.xpath('a[contains(@class, "title")]/@href').extract_first() 

o urljoin() yapmak daha iyi en çok bağlantıları yönetmenin, scrapy izin ağır işi ve göreli yollar veya mutlak yolları

01 işlemek dize almak için body.xpath().xpath().css() yapabilirsiniz
link = regularListingContainer.xpath('a[contains(@class, "title")]/@href').extract_first() 
yield Request(urljoin(link), callback=self.parse_dir_contents) 

Scrapy, her şeyi verdiğiniz her zaman çoklu iş parçacığı anlamını kullanır, bir iş parçacığı açar ve birbiriyle eşzamansız olarak çalıştırılmasını sağlar. Bu, ilk önce hangi kodun çalıştırılacağı akış üzerinde herhangi bir kontrolünüz olmadığı anlamına gelir. En iyi bahse girerim, küresel değişkenlerinizin sizin düşündüğünüzü değiştirmedikleri şeklindedir.

örneğin konuları arasında ben daha sormaya çekinmeyin yardımcı

link = regularListingContainer.xpath('a[contains(@class, "title")]/@href').extract_first() 
request=Request(urljoin(link), callback=self.anotherFunc) 
request['string']="I'm going on a journy" 
yield request 

def anotherFunc(self, response) 
    foo=response['string'] 
    print foo 

çıktısı verir

I'm going on a journy 

Umut bilgi alışverişi için meta[] etiketi kullanabilirsiniz Bunu çözmek için

+0

Ben ipuçlarını ve yorumlarınızı takdir ediyorum. Ben sadece bu örümcek elde etmek istiyorum ve istekliliğinizi t atmak istemiyorum gibi tam örümcek kod dahil kod güncellendi o yardım. Lütfen hata ayıklamaya yardımcı olmak için tüm çaylak kodunu ve rastgele yazdırma ifadelerini affedin. –

+0

Oops, sizi yorumda etiketlemediğimi fark ettim. –