Thư viện yêu cầu Python chuyển hướng url mới


97

Tôi đã xem qua tài liệu Yêu cầu Python nhưng tôi không thể thấy bất kỳ chức năng nào cho những gì tôi đang cố gắng đạt được.

Trong kịch bản của tôi, tôi đang thiết lập allow_redirects=True.

Tôi muốn biết nếu trang đã được chuyển hướng đến trang khác, URL mới là gì.

Ví dụ: nếu URL bắt đầu là: www.google.com/redirect

Và URL cuối cùng là www.google.co.uk/redirected

Làm cách nào để lấy URL đó?


Kiểm tra câu trả lời này để đối phó với urllib2
Horcrux

Câu trả lời:


158

Bạn đang tìm kiếm lịch sử yêu cầu .

Các response.historythuộc tính là một danh sách các câu trả lời mà dẫn đến URL cuối cùng, có thể được tìm thấy trong 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")

Bản giới thiệu:

>>> 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

67

Đây là câu trả lời cho một câu hỏi hơi khác, nhưng vì bản thân tôi cũng gặp khó khăn về vấn đề này, tôi hy vọng nó có thể hữu ích cho người khác.

Nếu bạn muốn sử dụng allow_redirects=Falsevà truy cập trực tiếp đến đối tượng chuyển hướng đầu tiên, thay vì theo một chuỗi của chúng và bạn chỉ muốn lấy vị trí chuyển hướng trực tiếp ra khỏi đối tượng phản hồi 302, thì r.urlsẽ không hoạt động. Thay vào đó, đó là tiêu đề "Vị trí":

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

Cảm ơn bạn - điều này đã thúc đẩy tập lệnh giới thiệu URL của tôi (có hàng nghìn url) lên vài giây.
ahinkle

Bạn có biết những gì đang xảy ra với r.next? Tôi nghĩ rằng sẽ chứa một PreparedRequesttrỏ đến URL chuyển hướng, nhưng điều đó dường như không phải là trường hợp ...
Elias Strehle


33

Tôi nghĩ rằng request.head thay vì request.get sẽ an toàn hơn khi gọi khi xử lý chuyển hướng url, hãy kiểm tra vấn đề github tại đây :

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

1
Đây phải là câu trả lời được chấp nhận. Ngắn và ngọt.
Volatil3

5
@ Volatil3: Không phải tất cả các máy chủ đều phản hồi yêu cầu HEAD theo cùng một cách với GET.
Máy xay sinh tố

9

Đối với python3.5, bạn có thể sử dụng mã sau:

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

đây là câu trả lời chính xác cho Python 3.5, nó đã cho tôi một thời gian để tìm kiếm, nhờ
jjj
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.