【发布时间】:2020-10-04 14:05:42
【问题描述】:
我创建了一个使用scrapy 解析网站内容的脚本。脚本运行良好。但是,当蜘蛛中使用的 url 被重定向(导致一些验证码页面)时,我希望该蜘蛛重试,这就是我创建重试中间件的原因。
我试图理解为什么这部分 or response 在 process_response() 这一行 return self._retry(request, reason, spider) or response 中就位,因为我希望这种方法重试,而不是在该块内返回响应。
这是我目前的做法:
def _retry(self, request, spider):
check_url = request.url
r = request.copy()
r.dont_filter = True
return r
def process_response(self, request, response, spider):
if ("some_redirected_url" in response.url) and (response.status in RETRY_HTTP_CODES):
return self._retry(request, spider) or response
return response
【问题讨论】:
-
您可以使用
request.replace使用原始URL 创建一个新请求,您可以将其传递给_retry。这就是你要找的吗? -
你的问题不是很清楚。看起来你已经从
scrapy中的默认RetryMiddleware复制了这个(我不确定你想添加什么)。因为有一个最大的重试次数,如果达到,它将只返回response(可能已经失败)。这就是self.retry(...) or response部分的含义 -
我的问题可能不太清楚,但您似乎以正确的方式回答了它。我忘记了即使我没有明确定义重试也是有限制的。所以,这部分
or response会在最大退休人数达到其限制时发挥作用,对吧?如果您发布一个,我将很高兴接受您的回答。但是,我已经编辑了我的帖子以使其更清晰。谢谢@tomjn。
标签: python python-3.x web-scraping scrapy