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?
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.
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
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()