Scrapy 当一个项目得到一个空字段时,如何重试请求n次?
我正在尝试废弃一系列网页,但我发现了漏洞,有时看起来网站无法正确发送html响应。这将导致csv输出文件中出现空行。当响应上的xpath选择器为空时,如何重试n次请求和解析?请注意,我没有任何HTTP错误。您可以在Scrapy 当一个项目得到一个空字段时,如何重试请求n次?,scrapy,Scrapy,我正在尝试废弃一系列网页,但我发现了漏洞,有时看起来网站无法正确发送html响应。这将导致csv输出文件中出现空行。当响应上的xpath选择器为空时,如何重试n次请求和解析?请注意,我没有任何HTTP错误。您可以在settings.py中将重试次数设置为您希望重试页面的次数。默认为2次 请参见您可以使用自定义重试中间件执行此操作,只需覆盖当前 然后启用它,而不是settings.py中的默认RetryMiddleware: DOWNLOADER_MIDDLEWARES = { 'scra
settings.py
中将重试次数设置为您希望重试页面的次数。默认为2次
请参见您可以使用自定义重试中间件执行此操作,只需覆盖当前
然后启用它,而不是settings.py
中的默认RetryMiddleware
:
DOWNLOADER_MIDDLEWARES = {
'scrapy.downloadermiddlewares.retry.RetryMiddleware': None,
'myproject.middlewarefilepath.CustomRetryMiddleware': 550,
}
现在,您有了一个中间件,可以在其中配置xpath
以在spider中使用属性retry\u xpath
重试:
class MySpider(Spider):
name = "myspidername"
retry_xpath = '//h2[@class="tadasdop-cat"]'
...
当您的项目字段为空时,这不一定会重试,但您可以在此重试\u xpath
属性中指定该字段的相同路径以使其正常工作。您能向我解释一下什么是self吗,检查xpath是否为空的测试在哪里,以及为什么我不必为第三个参数提供process\u response
爬行器的名称?谢谢你如何创造你自己的。关于_retry和其他类方法,请记住我们是从RetryMiddleware继承的,所以我们只是覆盖它的方法(答案中的链接)。关于spider参数,这是当前的spider实例,不需要名称。好的,谢谢。顺便说一句,我将if response.status==200和response.xpath(spider.retry\u xpath)
替换为if len(response.xpath(spider.retry\u xpath))==0
您为什么没有这样做?奇怪的是,如果retry\u时间设置为0,它仍然会重试一次。我一直尝试将其设置为1,但它会重试两次。@chainstair您可以尝试使用retry\u ENABLED=False
设置禁用重试中间件,请看我已经尝试过了,但是我遇到了一个问题,它甚至没有重试一次。奇怪。。。
class MySpider(Spider):
name = "myspidername"
retry_xpath = '//h2[@class="tadasdop-cat"]'
...