2

我正在抓取新闻文章并使用 urllib2。它会自动处理重定向,我可以使用 geturl() 从响应中获取解析的 url

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

回答这些问题中的任何一个就足够了

是否urllib.opener.open()下载页面,或者当您调用时会发生这种情况response.read()

有没有一种方法可以要求urllib2仅解决重定向?

4

1 回答 1

1

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

于 2012-09-18T20:31:57.700 回答