当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《有没有一种简单的方法来在python中请求URL而不是遵循重定向?》经验,为你挑选了7个好方法。

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



1> Marian..:

这是请求方式:

import requests
r = requests.get('http://github.com', allow_redirects=False)
print(r.status_code, r.headers['Location'])


然后看看`r.headers ['Location']`看看它会发送给你的地方
@Hamish`request`允许您以规范形式和小写形式访问标题.请参阅http://docs.python-requests.org/en/master/user/quickstart/#response-headers

2> olt..:

Dive Into Python有一个关于使用urllib2处理重定向的好章节.另一个解决方案是httplib.

>>> 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


从谷歌来到这里的每个人都请注意,最新的方式是这个:http://stackoverflow.com/a/14678220/362951请求库将为您节省很多麻烦.

3> Carles Barro..:

这是一个不会遵循重定向的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)



4> Ian Mackinno..:

请求方法中的redirections关键字httplib2是红色鲱鱼.RedirectLimit如果收到重定向状态代码,则不会返回第一个请求,而是会引发异常.要返回您需要设置inital响应follow_redirectsFalseHttp对象:

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



5> Ashish..:

我想这会有所帮助

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)



6> Aaron Maenpa..:

我是第二个指向潜入Python的指针.这是使用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) 


看起来不对...这段代码确实遵循重定向(通过调用原始处理程序,从而发出HTTP请求),然后引发异常

7> Tzury Bar Yo..:

然而,最短的路是

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

noredir_opener = urllib2.build_opener(NoRedirect())

推荐阅读
kikokikolove
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有