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?
7
A
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ş.
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
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
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
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