webentwicklung-frage-antwort-db.com.de

HTTP-Umleitungscode 3XX in Python-Anforderungen

Ich versuche, den http-Statuscode 3XX/302 für eine Weiterleitungs-URL zu erfassen. Aber ich kann es nicht bekommen, weil es 200 Statuscode gibt.

Hier ist der Code:

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

Ich nehme an, dies sollte entweder 301 oder 302 ausgeben, da auf eine andere Seite umgeleitet wird. Ich hatte einige Umleitungs-URLs ausprobiert (z. B. http://fb.com ), aber es werden wieder die 200 ausgegeben.

20
Bishwash

requests behandelt die Weiterleitungen für Sie, siehe Weiterleitung und Verlauf .

Legen Sie allow_redirects=False fest, wenn Sie nicht möchten, dass requests Umleitungen verarbeitet, oder Sie können die Umleitungsantworten in der r.history-Liste überprüfen.

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'

Wenn also allow_redirectsTrue ist, wurden die Weiterleitungen befolgt und die endgültige Antwort ist die letzte Seite nach den folgenden Weiterleitungen. Wenn allow_redirectsFalse ist, wird die erste Antwort zurückgegeben, auch wenn es sich um eine Weiterleitung handelt.

42
Martijn Pieters

requests.get ermöglicht ein optionales Schlüsselwortargument allow_redirects, dessen Standardwert True ist. Wenn Sie allow_redirects auf False setzen, werden folgende Umleitungen automatisch wie folgt deaktiviert:

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

Diese Lösung identifiziert die Weiterleitung und zeigt den Verlauf der Weiterleitungen an und behandelt häufige Fehler. Daraufhin werden Sie in der Konsole nach Ihrer URL 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()
0
Wes