2014-03-03 6 views
15

Ich versuche, http Statuscode 3XX/302 für eine Umleitung URL erfassen. Aber ich kann es nicht bekommen, weil es 200 Statuscode gibt. HierHttp Umleitung Code 3XX in Python-Anfragen

ist der Code:

import requests 
r = requests.get('http://goo.gl/NZek5') 
print r.status_code 

Ich nehme an dieser Ausgabe sollte entweder 301 oder 302, da es zu einer anderen Seite umleitet. Ich hatte versucht, einige URLs umzuleiten (zum Beispiel http://fb.com), aber wieder gibt es die 200 aus. Was sollte getan werden, um den Umleitungscode richtig zu erfassen?

Antwort

36

requests behandelt Weiterleitungen für Sie, siehe redirection and history.

Stellen Sie allow_redirects=False ein, wenn Sie nicht möchten, dass requests Umleitungen verarbeitet, oder Sie können die Umleitungsantworten untersuchen, die in der r.history-Liste enthalten sind.

Demo:

>>> import requests 
>>> r = requests.get('http://goo.gl/NZek5') 
>>> r.history 
(<Response [301]>,) 
>>> r.history[0].status_code 
301 
>>> r.history[0].headers['Location'] 
'http://docs.python-requests.org/en/latest/user/quickstart/' 
>>> r.url 
u'http://docs.python-requests.org/en/latest/user/quickstart/' 
>>> r = requests.get('http://goo.gl/NZek5', allow_redirects=False) 
>>> r.status_code 
301 
>>> r.url 
u'http://goo.gl/NZek5' 

Also, wenn allow_redirectsTrue ist, haben die Umleitungen gefolgt und die endgültige Antwort zurückgegeben wird, ist die letzte Seite nach Umleitungen folgen. Wenn allow_redirectsFalse ist, wird die erste Antwort zurückgegeben, auch wenn es sich um eine Weiterleitung handelt.

+0

, wenn wir die Anfrage mit allow_redirects = False laufen, bedeutet dies nicht gewohnt zum Umleiten Seite gehen Umleitungen und Seite zu ermöglichen. Warum also 301 statt 200? – Bishwash

+0

@ user2789099: Entschuldigung, ich folge dir nicht. '301' ist der Umleitungsstatuscode. 'Anfragen' erhalten immer zuerst die erste URL; Wenn das eine 301-Weiterleitung ist und "allow_redirects" "True" ist, wird die Antwort zur Verlaufsliste hinzugefügt und "requests" macht eine weitere GET-Anfrage, um den neuen Standort abzurufen, und so weiter. Wenn 'allow_redirects'' False' ist, wird das erste '301' direkt zurückgegeben. –

+0

@ user2789099: Wenn 'request_redirects'' 'True' 'ist, wird die letzte Antwort zurückgegeben. Die '200' ist also so, weil' requests' der Umleitung gefolgt sind und die nächste Seite auch geholt haben. –

8

requests.get ermöglicht ein optionales Schlüsselwortargument allow_redirects, das standardmäßig True ist. Einstellen allow_redirects-False wird deaktivieren automatisch Umleitungen folgende wie folgt:

In [1]: import requests 
In [2]: r = requests.get('http://goo.gl/NZek5', allow_redirects=False) 
In [3]: print r.status_code 
301 
0

Diese Lösung wird die Umleitung identifizieren und die Geschichte von Umleitungen angezeigt werden, und es wird häufig auftretende Fehler behandeln. Dadurch werden Sie nach Ihrer URL in der Konsole gefragt.

import requests 

def init(): 
    console = input("Type the URL: ") 
    get_status_code_from_request_url(console) 


def get_status_code_from_request_url(url, do_restart=True): 
    try: 
     r = requests.get(url) 
     if len(r.history) < 1: 
      print("Status Code: " + str(r.status_code)) 
     else: 
      print("Status Code: 301. Below are the redirects") 
      h = r.history 
      i = 0 
      for resp in h: 
       print(" " + str(i) + " - URL " + resp.url + " \n") 
       i += 1 
     if do_restart: 
      init() 
    except requests.exceptions.MissingSchema: 
     print("You forgot the protocol. http://, https://, ftp://") 
    except requests.exceptions.ConnectionError: 
     print("Sorry, but I couldn't connect. There was a connection problem.") 
    except requests.exceptions.Timeout: 
     print("Sorry, but I couldn't connect. I timed out.") 
    except requests.exceptions.TooManyRedirects: 
     print("There were too many redirects. I can't count that high.") 


init() 
Verwandte Themen