首页 > 解决方案 > 返回“或响应”时会产生什么响应“process_response()”?

问题描述

我创建了一个使用scrapy 解析网站内容的脚本。脚本运行良好。但是,当蜘蛛中使用的 url 被重定向(导致一些验证码页面)时,我希望该蜘蛛重试,这就是我创建重试中间件的原因。

我试图理解为什么这部分or responseprocess_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

标签: pythonpython-3.xweb-scrapingscrapy

解决方案


在这种情况下,这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永远不会到达该部分。


推荐阅读