Gibt es eine einfache Möglichkeit, eine URL in Python zu beantragen und NICHT Umleitungen folgen?
Frage
an der Quelle des urllib2 Blick es wie der einfachste Weg, sieht zu tun, es wäre HTTPRedirectHandler Unterklasse und dann build_opener verwenden Sie den Standard HTTPRedirectHandler außer Kraft zu setzen, aber dies scheint wie eine Menge von (relativ komplizierten) Arbeit zu tun, was scheint, wie es sollte ziemlich einfach sein.
Lösung
Hier ist die Anfragen Art und Weise:
import requests
r = requests.get('http://github.com', allow_redirects=False)
print(r.status_code, r.headers['Location'])
Andere Tipps
Dive Into Python ein gutes Kapitel hat über den Umgang mit Umleitungen urllib2. Eine weitere Lösung ist 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
Dies ist ein urllib2 Handler, Umleitungen nicht folgen:
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)
ich nehme an, dies würde helfen,
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)
Das redirections
Schlüsselwort in der httplib2
Request-Methode ist ein roter Hering. Anstatt die erste Anforderung zurückgeben eine RedirectLimit
Ausnahme ausgelöst wird, wenn es einen Code Umleitung Status erhält. Um wieder die inital Antwort müssen Sie follow_redirects
einstellen auf dem False
Objekt Http
:
import httplib2
h = httplib2.Http()
h.follow_redirects = False
(response, body) = h.request("http://example.com")
I zweiten OLT der Zeiger auf rel="noreferrer"> zu Tauchen. Hier ist eine Implementierung mit urllib2 Handler umleiten, mehr Arbeit, als es sein sollte? Vielleicht, Achselzucken.
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)
Der kürzeste Weg ist jedoch
class NoRedirect(urllib2.HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, hdrs, newurl):
pass
noredir_opener = urllib2.build_opener(NoRedirect())