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.