ไลบรารีคำขอ Python เปลี่ยนเส้นทาง URL ใหม่


102

ฉันได้ดูเอกสารคำขอ Python แต่ไม่เห็นฟังก์ชันการทำงานใด ๆ สำหรับสิ่งที่ฉันพยายามบรรลุ

allow_redirects=Trueในสคริปต์ของฉันฉันกำลังตั้งค่า

ฉันต้องการทราบว่าหน้านี้ถูกเปลี่ยนเส้นทางไปยังอย่างอื่นหรือไม่ URL ใหม่คืออะไร

ตัวอย่างเช่นหาก URL เริ่มต้นคือ: www.google.com/redirect

และ URL สุดท้ายคือ www.google.co.uk/redirected

ฉันจะรับ URL นั้นได้อย่างไร


ตรวจสอบคำตอบนี้สำหรับการรับมือกับ urllib2
horcrux

คำตอบ:


165

คุณกำลังมองหาประวัติคำขอ

response.historyแอตทริบิวต์คือรายการของการตอบสนองที่นำไปสู่ URL 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")

การสาธิต:

>>> 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 ให้ 404 ด้วยเหตุผลบางประการ แต่ httpbingo.org (รูปแบบ URL เดียวกัน) ทำงานได้ดีสำหรับฉัน
Preston Badeer

1
@PrestonBadeer: นี่เป็นปัญหาที่ทราบ: github.com/postmanlabs/httpbin/issues/617 ไม่สำคัญที่การสาธิตจะได้รับคำตอบ แต่โชคดี
Martijn Pieters

69

นี่เป็นการตอบคำถามที่แตกต่างไปเล็กน้อย แต่เนื่องจากฉันติดอยู่กับคำถามนี้ฉันหวังว่ามันอาจจะเป็นประโยชน์สำหรับคนอื่น

หากคุณต้องการใช้allow_redirects=Falseและเข้าสู่ออบเจ็กต์การเปลี่ยนเส้นทางแรกโดยตรงแทนที่จะทำตามห่วงโซ่ของวัตถุเหล่านี้และคุณเพียงแค่ต้องการรับตำแหน่งการเปลี่ยนเส้นทางโดยตรงจากวัตถุตอบกลับ 302 ก็r.urlจะไม่ทำงาน แต่เป็นส่วนหัว "สถานที่":

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

ขอบคุณ - สิ่งนี้ช่วยเพิ่มสคริปต์การอ้างอิง URL ของฉัน (ซึ่งมี URL หลายพันรายการ) เป็นเวลาหลายวินาที
ahinkle

คุณรู้r.nextหรือไม่ว่าเกิดอะไรขึ้น? ฉันคิดว่าจะมีการPreparedRequestชี้ไปยัง URL การเปลี่ยนเส้นทาง แต่ดูเหมือนจะไม่เป็นเช่นนั้น ...
Elias Strehle


33

ผมคิดว่าrequests.headแทนrequests.getจะปลอดภัยมากขึ้นที่จะเรียกเมื่อจัดการเปลี่ยนเส้นทาง URL ตรวจสอบปัญหา GitHub ที่นี่ :

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

1
นี่ควรเป็นคำตอบที่ได้รับการยอมรับ สั้นและหวาน
Volatil3

5
@ Volatil3: เซิร์ฟเวอร์บางตัวไม่ตอบสนองต่อคำขอ HEAD ในลักษณะเดียวกับ GET
Blender

10

สำหรับ python3.5 คุณสามารถใช้รหัสต่อไปนี้:

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

นี่คือคำตอบที่ถูกต้องสำหรับ Python 3.5 ฉันใช้เวลา
jjj
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.