python - 返回“或响应”时会产生什么响应“process_response()”?
问题描述
我创建了一个使用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
解决方案
在这种情况下,这return x or y
是一个不错的小捷径
if x:
return x
else:
return y
在标准RetryMiddleware
中,该_retry
方法有两个分支
if retries <= retry_times:
...
return retryreq
else:
...
else
分支不返回任何内容,如果方法到达末尾没有返回,则隐None
式返回。这意味着
return self._retry(request, reason, spider) or response
线评估为
return None or response
在这种情况下,将按bool(None)
原样False
返回。response
另一方面,如果retry_times
没有超过,_retry
将返回retryreq
哪个将评估True
并且将从中返回process_response
。
在您的代码中_retry
始终返回 a Response
,因此or response
永远不会到达该部分。
推荐阅读
- ios - 当视图模型@Published 更改时,SwiftUI 列表因“NSRangeException”而崩溃
- r-markdown - 使用 R markdown 时,有没有办法抑制图形标题中的块名称?
- r - 创建两个分类和数值变量的数据透视表
- laravel - 下载 S3 资产的响应?
- nginx - Nginx 重定向/重写 url
- tcl - 更改txt文件中的数字
- azure - SPA 调用资源服务器受两个不同的身份提供者保护
- javascript - Javascript文本动画未触发
- javascript - 使元素向中心隐藏,React.js
- apache - .htaccess 用问号重写 URL