Python İstek kitaplığı yeni url'yi yeniden yönlendir


104

Python İstekleri belgelerine bakıyordum ancak başarmaya çalıştığım şey için herhangi bir işlevsellik göremiyorum.

Senaryomda ayarlıyorum allow_redirects=True.

Sayfanın başka bir şeye yönlendirilip yönlendirilmediğini, yeni URL'nin ne olduğunu bilmek istiyorum.

Örneğin, başlangıç ​​URL'si şuysa: www.google.com/redirect

Ve nihai URL www.google.co.uk/redirected

Bu URL'yi nasıl alırım?


urllib2
Başa

Yanıtlar:


165

Talep geçmişini arıyorsunuz .

response.historyNitelik bulunabilir Nihai URL, yol açtığını tepkilerin listesidir 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

httpbin.org bir sebepten 404 veriyor, ancak httpbingo.org (aynı URL şeması) benim için gayet iyi çalıştı.
Preston Badeer

1
@PrestonBadeer: Bu bilinen bir sorundur: github.com/postmanlabs/httpbin/issues/617 . Neyse ki demonun cevap için çalışması çok önemli değil.
Martijn Pieters

70

Bu biraz farklı bir soruyu yanıtlıyor, ancak bu konuya ben de takıldığım için, umarım başkası için faydalı olabilir.

allow_redirects=FalseBir zincirini takip etmek yerine doğrudan ilk yönlendirme nesnesini kullanmak ve ona ulaşmak istiyorsanız ve yönlendirme konumunu doğrudan 302 yanıt nesnesinden almak istiyorsanız, o r.urlzaman işe yaramaz. Bunun yerine, "Konum" başlığıdır:

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

Teşekkürler - bu, URL yönlendirme betiğimi (binlerce url içeren) birkaç saniye artırdı.
ahinkle

Neyin var olduğunu biliyor musun r.next? Bunun PreparedRequestyeniden yönlendirme URL'sini göstereceğini düşündüm , ancak durum böyle değil ...
Elias Strehle


33

Ben düşünüyorum requests.head yerine requests.get url yönlendirmeyi tutarken, çağrı github sorunu kontrol etmek daha güvenli olacak burada :

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

1
Kabul edilen cevap bu olmalıdır. Kısa ve güzel.
Volatil3

5
@ Volatil3: Tüm sunucular bir HEAD isteğine GET ile aynı şekilde yanıt vermez.
Blender

10

Python3.5 için aşağıdaki kodu kullanabilirsiniz:

import urllib.request
res = urllib.request.urlopen(starturl)
finalurl = res.geturl()
print(finalurl)

bu Python 3.5 için doğru cevap, bulmam biraz zaman aldı, teşekkürler
jjj
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.