Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有一种简单的方法可以在python中请求URL而不遵循重定向?_Python_Http_Redirect - Fatal编程技术网

有没有一种简单的方法可以在python中请求URL而不遵循重定向?

有没有一种简单的方法可以在python中请求URL而不遵循重定向?,python,http,redirect,Python,Http,Redirect,查看urllib2的源代码,最简单的方法似乎是将HTTPRedirectHandler子类化,然后使用build_opener覆盖默认的HTTPRedirectHandler,但这似乎有很多(相对复杂)完成看起来应该很简单的工作。有一章很好地介绍了如何使用urllib2处理重定向。另一个解决办法是 导入httplib >>>conn=httplib.HTTPConnection(“www.bogosoft.com”) >>>conn.request(“获取”、“获取”) >>>r1=连接getr

查看urllib2的源代码,最简单的方法似乎是将HTTPRedirectHandler子类化,然后使用build_opener覆盖默认的HTTPRedirectHandler,但这似乎有很多(相对复杂)完成看起来应该很简单的工作。

有一章很好地介绍了如何使用urllib2处理重定向。另一个解决办法是

导入httplib >>>conn=httplib.HTTPConnection(“www.bogosoft.com”) >>>conn.request(“获取”、“获取”) >>>r1=连接getresponse() >>>打印r1.status,r1.reason 301永久搬迁 >>>打印r1.getheader('位置') http://www.bogosoft.com/new/location I第二个olt指针指向。这是一个使用urllib2重定向处理程序的实现,比它应该做的还要多?也许,耸耸肩

import sys
import urllib2

class RedirectHandler(urllib2.HTTPRedirectHandler):
    def http_error_301(self, req, fp, code, msg, headers):  
        result = urllib2.HTTPRedirectHandler.http_error_301( 
            self, req, fp, code, msg, headers)              
        result.status = code                                 
        raise Exception("Permanent Redirect: %s" % 301)

    def http_error_302(self, req, fp, code, msg, headers):
        result = urllib2.HTTPRedirectHandler.http_error_302(
            self, req, fp, code, msg, headers)              
        result.status = code                                
        raise Exception("Temporary Redirect: %s" % 302)

def main(script_name, url):
   opener = urllib2.build_opener(RedirectHandler)
   urllib2.install_opener(opener)
   print urllib2.urlopen(url).read()

if __name__ == "__main__":
    main(*sys.argv) 

我想这会有帮助的

from httplib2 import Http
def get_html(uri,num_redirections=0): # put it as 0 for not to follow redirects
conn = Http()
return conn.request(uri,redirections=num_redirections)

这是一个不遵循重定向的urllib2处理程序:

class NoRedirectHandler(urllib2.HTTPRedirectHandler):
    def http_error_302(self, req, fp, code, msg, headers):
        infourl = urllib.addinfourl(fp, headers, req.get_full_url())
        infourl.status = code
        infourl.code = code
        return infourl
    http_error_300 = http_error_302
    http_error_301 = http_error_302
    http_error_303 = http_error_302
    http_error_307 = http_error_302

opener = urllib2.build_opener(NoRedirectHandler())
urllib2.install_opener(opener)

然而,最短的路是

class NoRedirect(urllib2.HTTPRedirectHandler):
    def redirect_request(self, req, fp, code, msg, hdrs, newurl):
        pass

noredir_opener = urllib2.build_opener(NoRedirect())

httplib2
请求方法中的
redirections
关键字是一个令人费解的问题。如果收到重定向状态代码,它将引发
RedirectLimit
异常,而不是返回第一个请求。要返回初始响应,您需要在
Http
对象上设置
follow\u重定向到
False

import httplib2
h = httplib2.Http()
h.follow_redirects = False
(response, body) = h.request("http://example.com")
方法如下:


看起来不对。。。此代码实际上遵循重定向(通过调用原始处理程序,从而发出HTTP请求),然后引发异常这是最短的方法吗?它甚至不包含导入或实际的请求。我已经准备发布这个解决方案了,在底部发现这个答案让我非常惊讶。它非常简洁,在我看来应该是最好的答案。而且,它给了你更多的自由,这样做是可能的。我确认,这是最简单的方式。对于那些想要调试的人来说,这是一句简短的评论。不要忘记,在填充打开程序时可以设置多个处理程序,例如:
opener=urllib.request.build\u opener(debugHandler,NoRedirect())
其中
debugHandler=urllib.request.HTTPHandler()
debugHandler.set\u http\u debuglevel(1)
。最后:
urllib.request.install\u opener(opener)
我正在对一个API进行单元测试,并处理一个登录方法,该方法重定向到一个我不关心的页面,但不发送所需的会话cookie以及对重定向的响应。这正是我所需要的。对于谷歌用户来说:使用请求库会让你省去很多麻烦:看看下面玛丽安的回答,它非常优雅。我同意请求是这些天的发展方向。我对这条评论和玛丽安的答案投了更高的票,但我将答案保留为获奖,因为它是当时最好的。@John awards很好,但随着时间的推移,这是一个社区编辑的网站。重点是好的答案,而不是人。他将保持他的投票分数。你误导了大量的程序员,让他们使用不推荐的库。好吧,这很公平。我已经接受了请求的答案。所有从谷歌来到这里的人,请注意,最新的方法是:请求库将为您省去很多麻烦。“深入Python”的链接已经失效。然后看看
r.headers['Location']
要查看它将发送给您的位置,请注意,请求似乎将规范化
位置
位置
@Hamish
请求
允许您访问规范格式和小写形式的标题。在Python 3中,从2019年开始,这似乎不再适用于我。(我收到一个key dict错误。)检查r.status_代码,如果不是301,可能还有另一个错误。位置标头仅可用于重定向。如果要避免在可选键上出现KeyError,请使用dict.get。
import requests
r = requests.get('http://github.com', allow_redirects=False)
print(r.status_code, r.headers['Location'])