有没有一种简单的方法可以在python中请求URL而不遵循重定向?
查看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重定向处理程序的实现,比它应该做的还要多?也许,耸耸肩有没有一种简单的方法可以在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
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'])