【问题标题】:Python - Don't follow redirect on one URL onlyPython - 不要仅在一个 URL 上遵循重定向
【发布时间】:2013-11-24 09:21:21
【问题描述】:

我想知道如何防止 urllib2 跟踪我选择的 url 上的重定向请求。我在浏览时发现了这段 sn-p 代码,但它似乎在全球范围内有效,我只希望它禁用某个 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”并阻止该请求发生。我希望我已经很好地解释了这一切,并希望看到一些回复,因为我花了好几个小时试图弄清楚这一点:头痛:

【问题讨论】:

  • stop the request from happening 是什么意思?
  • 编辑:误读。我的意思是完全不遵循所选网址上的重定向。
  • 嗨,你的答案去哪儿了?我只是想看看它是否有效?
  • 试试看,我把它删了,因为我不确定它是否能用,我必须离开我的电脑一秒钟。
  • 我现在想,我找不到解决办法。

标签: python redirect urllib2


【解决方案1】:

没有办法使用 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 库,它可以让您对how to handle redirects 进行更细粒度的控制。如果您可以选择使用其他库,我认为 Requests 是更好的选择。

【讨论】:

  • 好吧,我已经使用 urllib2 制作了一个完整的程序:/,所以我猜我必须使用 httplib/python 请求库重新编写它?还给你上面的例子说bogosoft.com/new/location决定再次重定向到让我们说bogosoft.com/new/location2,我们能用这两个模块中的任何一个检测到吗?
  • httplib 不遵循重定向,因此根据定义,您可以通过检查状态码来检测每个 Riderect。当您将 allow_redirects=False 与 requests 库一起使用时,它的行为类似于 httplib,因此您也可以通过检查状态码来检测重定向。
  • 嗯,所以这些并不能解决我的问题,因为我试图访问一个站点 url 并阻止该 url 的第二个重定向而不是第一个 :(
  • 您可以使用zacwitte.com/resolving-http-redirects-in-python这里的方法,并在第二次重定向时中断递归。我没有看到任何遵循“n 重定向”的库或方法,仅此而已。他们要么遵循重定向,要么不遵循。您必须自己计算重定向来做到这一点。
  • 谢谢,看起来它会起作用,但是那里有异常有什么意义呢?如果发生太多重定向,它不会结束脚本吗? (超过指定数量,默认为 10,未经我修改。)
【解决方案2】:
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.request 替换为 urllib2

【讨论】:

    猜你喜欢
    • 2020-10-04
    • 1970-01-01
    • 2015-03-01
    • 1970-01-01
    • 2021-04-23
    • 2017-02-16
    • 1970-01-01
    • 2019-05-10
    • 2011-03-11
    相关资源
    最近更新 更多