Patrząc na źródło urllib2, wygląda na to, że najłatwiejszym sposobem byłoby utworzenie podklasy HTTPRedirectHandler, a następnie użycie build_opener do zastąpienia domyślnego HTTPRedirectHandler, ale wydaje się, że jest to dużo (stosunkowo skomplikowanej) pracy, aby wykonać to, co wygląda na to, że powinno być dość proste.
101
Odpowiedzi:
Oto sposób Żądania :
import requests r = requests.get('http://github.com', allow_redirects=False) print(r.status_code, r.headers['Location'])
źródło
r.headers['Location']
dokąd by cię to wysłałoLocation
dolocation
.requests
umożliwia dostęp do nagłówków zarówno w formie kanonicznej, jak i małych liter. Zobacz docs.python-requests.org/en/master/user/quickstart/…Dive Into Python ma dobry rozdział na temat obsługi przekierowań za pomocą urllib2. Innym rozwiązaniem jest 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
źródło
To jest moduł obsługi urllib2, który nie będzie podążał za przekierowaniami:
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)
źródło
Słowo
redirections
kluczowe whttplib2
metodzie request to czerwony śledź. Zamiast zwracać pierwsze żądanie, zgłosiRedirectLimit
wyjątek, jeśli otrzyma kod stanu przekierowania. Aby przywrócić inital odpowiedź trzeba ustawićfollow_redirects
sięFalse
naHttp
obiekcie:import httplib2 h = httplib2.Http() h.follow_redirects = False (response, body) = h.request("http://example.com")
źródło
przypuszczam, że to by pomogło
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)
źródło
Drugi wskaźnik olta do Dive into Python . Oto implementacja wykorzystująca programy obsługi przekierowań urllib2, więcej pracy niż powinno? Może wzruszysz ramionami.
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)
źródło
Jednak najkrótsza droga jest
class NoRedirect(urllib2.HTTPRedirectHandler): def redirect_request(self, req, fp, code, msg, hdrs, newurl): pass noredir_opener = urllib2.build_opener(NoRedirect())
źródło
opener = urllib.request.build_opener(debugHandler, NoRedirect())
gdziedebugHandler=urllib.request.HTTPHandler()
idebugHandler.set_http_debuglevel (1)
. Na koniec:urllib.request.install_opener(opener)