2016-01-20 22 views
9

Yazar adı: Bu gönderi içeriğinin veya bilgilerinin eksik olduğunu düşünebilirsiniz, bunun nedeni yalnızca nereden başlayacağımı bilmem. İsteğiniz üzerine ek bilgilerle memnuniyetle düzenleyeceğim.Scrapy hatası indir ve remove_request hatası

ERROR: Error downloading <GET http://www.fifa.com/fifa-tournaments/players-coaches/people=44630/index.html> 
Traceback (most recent call last): 
    File "/Library/Python/2.7/site-packages/twisted/internet/defer.py", line 588, in _runCallbacks 
    current.result = callback(current.result, *args, **kw) 
    File "/Library/Python/2.7/site-packages/scrapy/core/downloader/__init__.py", line 75, in _deactivate 
    self.active.remove(request) 
KeyError: <GET http://www.fifa.com/fifa-tournaments/players-coaches/people=44630/index.html> 
2016-01-19 15:57:20 [scrapy] INFO: Error while removing request from slot 
Traceback (most recent call last): 
    File "/Library/Python/2.7/site-packages/twisted/internet/defer.py", line 588, in _runCallbacks 
    current.result = callback(current.result, *args, **kw) 
    File "/Library/Python/2.7/site-packages/scrapy/core/engine.py", line 140, in <lambda> 
    d.addBoth(lambda _: slot.remove_request(request)) 
    File "/Library/Python/2.7/site-packages/scrapy/core/engine.py", line 38, in remove_request 
    self.inprogress.remove(request) 
KeyError: <GET http://www.fifa.com/fifa-tournaments/players-coaches/people=44630/index.html> 

ben sadece bu tek URL üzerinde kavgacı çalıştırdığınızda kullanarak:

scrappy shell http://www.fifa.com/fifa-tournaments/players-coaches/people=44630/index.html 

yok hatalardır


Running scrapy ben kazıma am tüm bağlantı arasında aşağıdaki hatayı bakın meydana gelen. Ben, binlerce benzer bağlantıyı sorunsuz bir şekilde karıştırıyorum ama bu sorunu ~ 10 bağlantıda görüyorum. Scrappy varsayılan 180 saniye indirme zaman aşımı kullanıyorum. Web tarayıcımda da bu bağlantılarla ilgili yanlış bir şey göremiyorum.

request = Request(url_nrd,meta = {'item' : item},callback=self.parse_player,dont_filter=True) 

fonksiyonlarda ele alınır: Ayrıca

def parse_player(self, response): 
    if response.status == 404: 
     #doing stuff here 
     yield item 
    else: 
     #doing stuff there 
     request = Request(url_new,meta = {'item' : item},callback=self.parse_more,dont_filter=True) 
     yield request 

    def parse_more(self, response): 
    #parsing more stuff here 
    return item 

:

ayrıştırma isteği tarafından başlatılır ben kavgacı içinde indirme yeniden deneme için varsayılan ayarları değişmedi (ama günlük dosyamda herhangi bir yeniden deneme görmüyorum).

ek notlar: benim kazıma tamamlanarak dont_filter=True beri önceki ve sonraki isteklerde çağırdığında bir noktada önceki hatayla indirmek için başarısız bağlantıları, başarısız olmadı görebilirsiniz sonra.

Olası cevap: Ben örümcekler birinde bir KeyError alıyorum ve bu örümceğin o tahsis sökme (remove_request) başarısız olduğunu görüyoruz. dont_filter=True'u ayarlıyorum ve aynı URL'de birkaç istekte bulunmam ve örümceğin anahtarının o URL gibi görünmesi olası mı? Örümcek, aynı URL'de bir önceki, eşzamanlı istek tarafından tahsis edildi mi?

Bu durumda, istek başına benzersiz bir anahtar nasıl olmalı ve URL'de dizine eklenmemiş?


DÜZENLEME

ben beri benim kodunu düzenledi çünkü kesin bilmiyorum parse_player benim kod sorun olduğunu düşünüyorum, ama yield request üzerinde kötü girinti gördüğümü hatırlamıyorum. Soruna neden olabileceğini düşündüğünüzde, bize bildirin.

+0

çok ilginç bir problem, daha fazla örümcek kodunu ve belki de bunları kullanırken biraz orta sınıflar paylaşmanız gerektiğini düşünüyorum. – eLRuLL

+0

@eLRuLL Ne yazık ki bu yazıdan beri scrapy kodumu tamamen değiştirdim.Şimdi tüm isteğimi filtreliyorum, ki bu daha iyi ve ben bu konuyu artık görmüyorum (bu yüzden bir şekilde "dont_filter" ın suçlu olduğunu düşünüyorum. Kodumu düzenlerken, soruna neden olabilecek bir sorun olduğunu hatırlıyorum. : - parse_player'da bir istek oluşturmak ve asla üretmemek. - ya da ben hiç bir yerde yaratmadığım bir istek vermekteydim. Maalesef kod yapım çok farklı olduğu için size daha fazla bilgi veremiyorum Bu soruyu kapatmaktan çekinmeyin – vrleboss

+0

Sorunun ne olduğunu yansıtmayı denemek için gönderimi düzenliyorum – vrleboss

cevap

5

Ve hataları basitçe görmezden misiniz?

 
def parse_player(self, response): 
    if response.status == 200: 
     paths = sel.xpath('some path extractor here') 
     for path in paths: 
     if (some_condition): 
      #doing stuff there 
      request = Request(url_new,meta = {'item' : item},callback=self.parse_more,dont_filter=True) 
     # Bad indent of yield request here! 
     yield request 
+0

Ve ... Çok basit bir cevap lütuf olsun. İyi strateji ve şans var –