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

标签 scrapy

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

最佳答案

你可以使用自定义重试中间件来做到这一点,你只需要覆盖 process_response当前的方法Retry Middleware :

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

然后启用它而不是默认的 RetryMiddlewaresettings.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 中指定该字段的相同路径属性使其工作。

关于scrapy - 如何在项目获取空字段时重试请求 n 次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41404281/

相关文章:

python - 如何使用 Spidermon 监控特定的蜘蛛?

python - 如何加载带参数的起始 URL?

python - scrapy 如何制作我自己的调度程序中间件

python - 无法弄清楚这只蜘蛛出了什么问题

python-2.7 - 如何在命令行上在scrapy shell中传递表单数据

python - scrapy 过滤重复请求

python - Scrapy:仅关注外部链接

python - Scrapy:创建对不在 allowed_domains 中的站点的请求

python - Scrapy 打印字段但不填充 XML 文件

python-3.x - 如何使用 python 获取 Instagram 帖子的正确视频 url