我试图删除一系列网页,但我遇到漏洞,有时看起来网站无法正确发送HTML回复。这导致csv输出文件具有空行。当响应中的xpath选择器为空时,如何重试n次请求和解析?请注意,我没有任何HTTP错误。
答案 0 :(得分:22)
您可以使用自定义重试中间件执行此操作,只需覆盖当前Retry Middleware的process_response
方法:
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
然后在RetryMiddleware
中启用它而不是默认settings.py
:
DOWNLOADER_MIDDLEWARES = {
'scrapy.downloadermiddlewares.retry.RetryMiddleware': None,
'myproject.middlewarefilepath.CustomRetryMiddleware': 550,
}
现在您有了一个中间件,您可以使用属性xpath
配置retry_xpath
在蜘蛛内重试:
class MySpider(Spider):
name = "myspidername"
retry_xpath = '//h2[@class="tadasdop-cat"]'
...
当您的项目字段为空时,这不一定会重试,但您可以在此retry_xpath
属性中指定该字段的相同路径,以使其有效。
答案 1 :(得分:4)
您可以将RETRY_TIMES
中的settings.py
设置设置为您希望重试页面的次数。默认为2次。