2013-12-09 10 views
40

Przeglądałem dokumentację Pythona Requestests, ale nie widzę żadnej funkcjonalności dla tego, co próbuję osiągnąć.Python Prośby o bibliotekę przekierowują nowy URL

W moim scenariuszu ustawiam allow_redirects=True.

Chciałbym wiedzieć, czy strona została przekierowana do czegoś innego, jaki jest nowy adres URL.

Na przykład, jeśli adres URL start był: www.google.com/redirect

A końcowy URL www.google.co.uk/redirected

Jak mogę dostać ten adres?

Odpowiedz

83

szukasz w request history.

Atrybut response.history to lista odpowiedzi, które doprowadziły do ​​końcowego adresu URL, który można znaleźć pod numerem response.url.

response = requests.get(someurl) 
if response.history: 
    print "Request was redirected" 
    for resp in response.history: 
     print resp.status_code, resp.url 
    print "Final destination:" 
    print response.status_code, response.url 
else: 
    print "Request was not redirected" 

Demo:

>>> import requests 
>>> response = requests.get('http://httpbin.org/redirect/3') 
>>> response.history 
(<Response [302]>, <Response [302]>, <Response [302]>) 
>>> for resp in response.history: 
...  print resp.status_code, resp.url 
... 
302 http://httpbin.org/redirect/3 
302 http://httpbin.org/redirect/2 
302 http://httpbin.org/redirect/1 
>>> print response.status_code, response.url 
200 http://httpbin.org/get 
13

myślę requests.head zamiast requests.get będzie bardziej bezpieczny zadzwonić przy obchodzeniu przekierowanie sprawdzić GitHub problem here:

r = requests.head(url, allow_redirects=True) 
print(r.url) 
+0

ta powinna być przyjęta odpowiedź. Krótkie i słodkie. – Volatil3

+1

@ Volatil3: Nie wszystkie serwery odpowiadają na żądania HEAD w taki sam sposób, jak w przypadku GET. – Blender

23

To odpowiada na nieco inne pytanie, ale ponieważ utknąłem na tym, mam nadzieję, że t może być przydatne dla kogoś innego.

Jeśli chcesz użyć i przejść bezpośrednio do pierwszego obiektu przekierowania, zamiast podążać za ich łańcuchem, a chcesz po prostu uzyskać lokalizację przekierowania bezpośrednio z obiektu odpowiedzi 302, wtedy r.url nie będzie działać . Zamiast tego, jest to "Location" nagłówek:

r = requests.get('http://github.com/', allow_redirects=False) 
r.status_code # 302 
r.url # http://github.com, not https. 
r.headers['Location'] # https://github.com/ -- the redirect destination 
+0

Dziękuję - zwiększyło to mój skrypt adresowania URL (który miał tysiące adresów URL) o kilka sekund. – hinteractive02

2

Dla python3.5, można użyć następującego kodu:

import urllib.request 
res = urllib.request.urlopen(starturl) 
finalurl = res.geturl() 
print(finalurl) 
Powiązane problemy