Gibt es eine einfache Möglichkeit, eine URL in Python zu beantragen und NICHT Umleitungen folgen?

StackOverflow https://stackoverflow.com/questions/110498

  •  02-07-2019
  •  | 
  •  

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.

War es hilfreich?

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

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())
scroll top