2016-12-31 37 views
7

Bir dizi web sayfası oluşturmaya çalışıyorum ama deliklerim var, bazen web sitesi html yanıtını doğru şekilde göndermiyor gibi görünüyor. Bu, csv çıktı dosyasında boş satırlara sahip olur. Yanıtın xpath seçicisi boş olduğunda, n yeniden istek ve ayrıştırmayı n kez yinelemek? Herhangi bir HTTP hatası almadığımı unutmayın.Bir öğe boş alan aldığında n kez isteği yeniden denenir?

cevap

11

bunu Özel Yeniden Deneme Middleware ile bu yapabileceğini görün :

DOWNLOADER_MIDDLEWARES = { 
    'scrapy.downloadermiddlewares.retry.RetryMiddleware': None, 
    'myproject.middlewarefilepath.CustomRetryMiddleware': 550, 
} 

Artık birlikte kullanabileceğiniz bir ara katman var. öznitelik retry_xpath ile örümceğin içine yeniden denemek xpath nfigure: En öğesinin alan boş olduğunda

class MySpider(Spider): 
    name = "myspidername" 

    retry_xpath = '//h2[@class="tadasdop-cat"]' 
    ... 

Bu ille denenecek değildir, ama bunu yapmak için bu retry_xpath özelliğindeki bu alanın aynı yolu belirtebilirsiniz iş.

+0

Bana ne diyebilirim, 'self._retry' nedir, xpath'ın boş olup olmadığını kontrol eden test nerede ve neden üçüncü prosesi için' process_response 'örümümün adını vermek zorunda değilim? Teşekkürler – ChiseledAbs

+0

Kendi [downloader ara katman yazılımı] 'nı nasıl oluşturacağınızı kontrol edin (https://doc.scrapy.org/en/latest/topics/downloader-middleware.html#downloader-middleware). _retry ve diğer sınıf yöntemleri hakkında, RetryMiddleware'den miras aldığımızı hatırlayın, bu yüzden sadece yöntemlerini geçersiz kılıyoruz (yanıtta bağlantı). Örümcek argümanı hakkında, şu anki örümcek vakası, adına gerek yok. – eLRuLL

+0

Tamam teşekkürler. Btw, eğer response.status == 200 ve response.xpath (spider.retry_xpath) 'ile değiştirildiyse, eğer' if (response.xpath (spider.retry_xpath)) == 0 'yerine bunun yerine neden bunu yapmadınız? – ChiseledAbs

1

ayarını settings.py ayarında, sayfaların yeniden denenmesini istediğiniz sayıda ayarlayabilirsiniz. Varsayılan olarak 2 kez. Sonra

from scrapy.downloadermiddlewares.retry import RetryMiddleware 
from scrapy.utils.response import response_status_message 


class CustomRetryMiddleware(RetryMiddleware): 

    def process_response(self, request, response, spider): 
     if request.meta.get('dont_retry', False): 
      return response 
     if response.status in self.retry_http_codes: 
      reason = response_status_message(response.status) 
      return self._retry(request, reason, spider) or response 

     # this is your check 
     if response.status == 200 and response.xpath(spider.retry_xpath): 
      return self._retry(request, 'response got xpath "{}"'.format(spider.retry_xpath), spider) or response 
     return response 

settings.py varsayılan RetryMiddleware yerine etkinleştirmek:

sadece şimdiki Retry Middleware ait process_response yöntemini geçersiz gerekir more on RetryMiddleware