3

我想知道如何防止 urllib2 在我选择的 url 上执行重定向请求。我在浏览时发现了这段代码,但它似乎在全球范围内有效,我只希望它禁用某个 url 上的重定向:

import urllib2
class RedirectHandler(urllib2.HTTPRedirectHandler):
    def http_error_302(self, req, fp, code, msg, headers):
        result = urllib2.HTTPError(req.get_full_url(), code, msg, headers, fp)
        result.status = code
        return result
    http_error_301 = http_error_303 = http_error_307 = http_error_302

opener = urllib2.build_opener(RedirectHandler())
webpage = opener.open('http://www.website.com').geturl()
print webpage

我还应该提到我正在使用 urllib.urlopen('site.com') 请求一个 url,并且我希望允许发生第一个重定向,例如说 site.com 重定向到 site.com/redirect 但随后它尝试再次从 site.com/redirect 重定向到 site.com/secondredirect 我希望脚本能够识别 url 中的“secondredirect”并阻止该请求发生。我希望我已经很好地解释了这一切,并希望看到一些回复,因为我花了几个小时试图弄清楚这一点:头痛:

4

2 回答 2

6

没有办法使用 urllib2 在每个请求的基础上禁用重定向跟踪。您可以选择使用httplib,它通常是 urllib2 等模块使用的低级模块。

>>> import httplib
>>> conn = httplib.HTTPConnection("www.bogosoft.com")
>>> conn.request("GET", "")
>>> r1 = conn.getresponse()
>>> print r1.status, r1.reason
301 Moved Permanently
>>> print r1.getheader('Location')
http://www.bogosoft.com/new/location

另一种选择是使用Python Requests库,它可以让您更精细地控制如何处理重定向。如果您可以选择使用其他库,我认为 Requests 是更好的选择。

于 2013-11-12T10:15:36.773 回答
6
import urllib.request

class RedirectFilter(urllib.request.HTTPRedirectHandler):
    def redirect_request(self, req, fp, code, msg, hdrs, newurl):
        if newurl.endswith('.jpg'):
            return None # do not redirect, HTTPError will be raised
        return urllib.request.HTTPRedirectHandler.redirect_request(self, req, fp, code, msg, hdrs, newurl)

opener = urllib.request.build_opener(RedirectFilter)

opener.open('http://example.com/')

这适用于 Python 3。对于 Python 2,请替换urllib.requesturllib2.

于 2015-01-21T00:39:36.113 回答