如何在项目获得空字段时重试请求n次?

Chi*_*Abs 12 scrapy

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

eLR*_*uLL 25

您可以使用自定义重试中间件执行此操作,您只需要覆盖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
Run Code Online (Sandbox Code Playgroud)

然后启用它,而不是默认的RetryMiddlewaresettings.py:

DOWNLOADER_MIDDLEWARES = {
    'scrapy.downloadermiddlewares.retry.RetryMiddleware': None,
    'myproject.middlewarefilepath.CustomRetryMiddleware': 550,
}
Run Code Online (Sandbox Code Playgroud)

现在您有了一个中间件,您可以xpath使用以下属性配置在蜘蛛内部重试retry_xpath:

class MySpider(Spider):
    name = "myspidername"

    retry_xpath = '//h2[@class="tadasdop-cat"]'
    ...
Run Code Online (Sandbox Code Playgroud)

当Item的字段为空时,这不一定会重试,但您可以在此retry_xpath属性中指定该字段的相同路径以使其工作.


Gra*_*rus 6

您可以将RETRY_TIMES设置设置settings.py为希望重试页面的次数。默认为2倍。

在RetryMiddleware上查看更多