web-dev-qa-db-fra.com

Code de redirection HTTP 3XX dans les requêtes python

J'essaie de capturer le code de statut http 3XX/302 pour une URL de redirection. Mais je ne peux pas l’obtenir car il donne 200 codes d’état.

Voici le code:

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

Je suppose que cela devrait émettre 301 ou 302 car il redirige vers une autre page. J'avais essayé quelques URL de redirection (par exemple, http://fb.com ), mais encore une fois, il émet le 200. Que faut-il faire pour capturer correctement le code de redirection?

20
Bishwash

requests gère les redirections pour vous, voir redirection et historique .

Définissez allow_redirects=False si vous ne voulez pas que requests gère les redirections, ou vous pouvez inspecter les réponses de redirection contenues dans la liste r.history.

Démo:

>>> 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'

Donc, si allow_redirects est True, les redirections ont été suivies et la réponse finale renvoyée est la page finale après les redirections suivantes. Si allow_redirects est False, la première réponse est renvoyée, même s'il s'agit d'une redirection.

42
Martijn Pieters

requests.get autorise un mot-clé facultatif avec l'argument allow_redirects, dont la valeur par défaut est True. Définir allow_redirects sur False désactive automatiquement les redirections, comme suit:

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

Cette solution identifiera la redirection, affichera l'historique des redirections et gérera les erreurs courantes. Cela vous demandera votre URL dans la console. 

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