我在刮新闻文章并使用urllib2。它会自动处理重定向,并且我可以通过geturl()获得解析后的url。()如何解决所有重定向解决之后但使用urllib2进行页面下载之前的请求?
但是我想停止请求,如果解析后的url位于某个列表中,以避免花费时间和带宽下载页面。
解答任何一个问题就足够了
是否urllib.opener.open()
下载的页面,还是当你调用response.read()
发生的?
是否有方法要求urllib2
只是为了解决重定向?
我在刮新闻文章并使用urllib2。它会自动处理重定向,并且我可以通过geturl()获得解析后的url。()如何解决所有重定向解决之后但使用urllib2进行页面下载之前的请求?
但是我想停止请求,如果解析后的url位于某个列表中,以避免花费时间和带宽下载页面。
解答任何一个问题就足够了
是否urllib.opener.open()
下载的页面,还是当你调用response.read()
发生的?
是否有方法要求urllib2
只是为了解决重定向?
经过一些快速和肮脏的实验,我想我可以说我找到了你的问题的部分答案。 opener.open()
和urlopen()
默认情况下的行为方式相同。即使您只能通过read()
函数读取输出,它们也会下载您重定向到的页面。
但是,您可以使用自己的处理程序覆盖这些默认值,并将其传递给build_opener()
。例如,为了使重定向到一些网址的失败,你可以做一些类似的,通过继承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块中的调用块捕获该异常。我想可能有办法解决这个问题,让处理更好,但我不确定。
无论如何,你检查文档here了解更多详情。
希望它有帮助。
编辑:
其实,你可能希望覆盖redirect_request
覆盖其他重定向代码也(不只是302)。根据this,它应该是要走的路。
非常感谢! – user1552512
我如何确定给定的请求是否是最终的重定向?每个重定向都会调用redirect_request(可能有多个,并且在新闻站点上有点常见) – user1552512
除非您阅读最后一个,否则无法知道它是最后一个。这是因为重定向是通过头文件完成的,如果没有实际的内容就不能下载(据我所知)。你可以做的一件事是,只有当你期望在最后一个URL中看到特定的模式(例如/ news/xxxx/xxxx,就是这样,停止重定向)时,才会到达期望的页面URL时停止重定向。 – jadkik94