2012-09-18 114 views
2

我在刮新闻文章并使用urllib2。它会自动处理重定向,并且我可以通过geturl()获得解析后的url。()如何解决所有重定向解决之后但使用urllib2进行页面下载之前的请求?

但是我想停止请求,如果解析后的url位于某个列表中,以避免花费时间和带宽下载页面。

解答任何一个问题就足够了

是否urllib.opener.open()下载的页面,还是当你调用response.read()发生的?

是否有方法要求urllib2只是为了解决重定向?

回答

1

经过一些快速和肮脏的实验,我想我可以说我找到了你的问题的部分答案。 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,它应该是要走的路。

+0

非常感谢! – user1552512

+0

我如何确定给定的请求是否是最终的重定向?每个重定向都会调用redirect_request(可能有多个,并且在新闻站点上有点常见) – user1552512

+0

除非您阅读最后一个,否则无法知道它是最后一个。这是因为重定向是通过头文件完成的,如果没有实际的内容就不能下载(据我所知)。你可以做的一件事是,只有当你期望在最后一个URL中看到特定的模式(例如/ news/xxxx/xxxx,就是这样,停止重定向)时,才会到达期望的页面URL时停止重定向。 – jadkik94

相关问题