我正在抓取新闻文章并使用 urllib2。它会自动处理重定向,我可以使用 geturl() 从响应中获取解析的 url
但是如果解析的 url 在某个列表中,我想停止请求,以避免花费时间和带宽下载页面。
回答这些问题中的任何一个就足够了
是否urllib.opener.open()
下载页面,或者当您调用时会发生这种情况response.read()
?
有没有一种方法可以要求urllib2
仅解决重定向?
经过一些快速而肮脏的实验,我想我可以说我找到了你问题的部分答案。opener.open()
并且urlopen()
默认情况下两者的行为方式相同。他们将下载您重定向到的页面,即使您只能通过该read()
功能读取输出。
但是,您可以使用自己的处理程序覆盖这些默认值,传递给build_opener()
. 例如,要使对某些 URL 的重定向失败,您可以通过子类化 HTTPRedirectHandler来执行类似的操作:
class MyRedirectHandler(urllib2.HTTPRedirectHandler):
def http_error_302(self, req, fp, code, msg, hdrs):
if fp.geturl().startswith('http://www.facebook.com/'):
# This will raise an exception similar to this:
# urllib2.HTTPError: HTTP Error 302: FOUND
return None
else:
# Let the default handling occur
return super(MyRedirectHandler, self).http_error_302(req, fp, code, msg, hdrs)
你会这样使用它:
opener = urllib2.build_handler(MyRedirectHandler)
try:
fp = opener.open(url)
except urllib2.HTTPError:
content = None
print 'This URL is not allowed or something'
else:
content = fp.read()
当然,您必须将调用块放在 try/except 块中才能捕获该异常。我想可能有办法克服这个问题,让处理更好,但我不确定。
无论如何,您可以在此处查看文档以获取更多详细信息。
希望能帮助到你。
编辑:
实际上,您可能还想redirect_request
覆盖其他重定向代码(不仅是 302)。据此,这应该是要走的路。