Melihat sumber urllib2, sepertinya cara termudah untuk melakukannya adalah dengan subclass HTTPRedirectHandler dan kemudian menggunakan build_opener untuk mengganti HTTPRedirectHandler default, tetapi ini sepertinya banyak pekerjaan (relatif rumit) untuk melakukan apa yang seharusnya dilakukan. cukup mudah.
101
Jawaban:
Berikut adalah cara Permintaan :
import requests r = requests.get('http://github.com', allow_redirects=False) print(r.status_code, r.headers['Location'])
sumber
r.headers['Location']
untuk melihat ke mana ia akan mengirim AndaLocation
menjadilocation
.requests
memungkinkan Anda mengakses header baik dalam bentuk kanonik maupun dalam huruf kecil. Lihat docs.python-requests.org/en/master/user/quickstart/…Dive Into Python memiliki bab bagus tentang menangani pengalihan dengan urllib2. Solusi lain adalah 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
sumber
Ini adalah penangan urllib2 yang tidak akan mengikuti pengalihan:
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)
sumber
Kata
redirections
kunci dalamhttplib2
metode permintaan adalah ikan haring merah. Daripada mengembalikan permintaan pertama, ia akan memunculkanRedirectLimit
pengecualian jika menerima kode status pengalihan. Untuk mengembalikan respon inital Anda perlu setfollow_redirects
untukFalse
diHttp
obyek:import httplib2 h = httplib2.Http() h.follow_redirects = False (response, body) = h.request("http://example.com")
sumber
saya kira ini akan membantu
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)
sumber
Saya penunjuk kedua untuk Menyelam ke Python . Berikut adalah implementasi menggunakan penangan pengalihan urllib2, lebih banyak pekerjaan daripada yang seharusnya? Mungkin, angkat bahu.
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)
sumber
Namun cara terpendek adalah
class NoRedirect(urllib2.HTTPRedirectHandler): def redirect_request(self, req, fp, code, msg, hdrs, newurl): pass noredir_opener = urllib2.build_opener(NoRedirect())
sumber
opener = urllib.request.build_opener(debugHandler, NoRedirect())
wheredebugHandler=urllib.request.HTTPHandler()
dandebugHandler.set_http_debuglevel (1)
. Akhirnya:urllib.request.install_opener(opener)