Python - 不要只关注一个URL上的重定向

use*_*290 3 python redirect urllib2

我想知道如何阻止urllib2跟随我选择的网址上的重定向请求.我在浏览时发现了这段代码,但它似乎全局工作,我只希望它禁用某个网址上的重定向:

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
Run Code Online (Sandbox Code Playgroud)

我还应该提一下,我正在使用urllib.urlopen('site.com')请求网址,我希望第一次重定向允许发生,例如说site.com重定向到site.com/redirect但是它尝试再次从site.com/redirect重定向到site.com/secondredirect我希望脚本能够识别网址中的"secondredirect"并停止发生该请求.我希望我能很好地解释这一切并希望看到一些回复,因为我花了几个小时试图解决这个问题:头痛:

use*_*ser 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/')
Run Code Online (Sandbox Code Playgroud)

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


Tay*_*nli 5

没有办法使用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
Run Code Online (Sandbox Code Playgroud)

另一种选择是使用Python Requests库,它可以让您对如何处理重定向进行更细粒度的控制.如果您可以选择使用其他库,那么在我看来,请求是更好的选择.

  • 您可以使用这里的方法 http://www.zacwitte.com/resolving-http-redirects-in-python 并在第二次重定向时中断递归。我没有看到任何遵循“n 重定向”的库或方法,仅此而已。他们要么遵循重定向,要么不遵循。您必须通过自己计算重定向来做到这一点。 (2认同)