Scrapy 当一个项目得到一个空字段时,如何重试请求n次?

Scrapy 当一个项目得到一个空字段时,如何重试请求n次?,scrapy,Scrapy,我正在尝试废弃一系列网页,但我发现了漏洞,有时看起来网站无法正确发送html响应。这将导致csv输出文件中出现空行。当响应上的xpath选择器为空时,如何重试n次请求和解析?请注意,我没有任何HTTP错误。您可以在settings.py中将重试次数设置为您希望重试页面的次数。默认为2次 请参见您可以使用自定义重试中间件执行此操作,只需覆盖当前 然后启用它,而不是settings.py中的默认RetryMiddleware: DOWNLOADER_MIDDLEWARES = { 'scra

我正在尝试废弃一系列网页,但我发现了漏洞,有时看起来网站无法正确发送html响应。这将导致csv输出文件中出现空行。当响应上的xpath选择器为空时,如何重试n次请求和解析?请注意,我没有任何HTTP错误。

您可以在
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"]'
    ...