पायथन अनुरोध पुस्तकालय नए url को पुनर्निर्देशित करता है


95

मैं पायथन रिक्वेस्ट डॉक्यूमेंटेशन के माध्यम से देख रहा हूं, लेकिन मैं जो भी हासिल करने की कोशिश कर रहा हूं, उसके लिए कोई कार्यक्षमता नहीं देख सकता।

अपनी स्क्रिप्ट में मैं सेट कर रहा हूं allow_redirects=True

मैं जानना चाहूंगा कि क्या पेज को किसी और चीज़ में रीडायरेक्ट किया गया है, नया URL क्या है।

उदाहरण के लिए, यदि प्रारंभ URL था: www.google.com/redirect

और अंतिम URL है www.google.co.uk/redirected

मुझे वह URL कैसे मिलेगा?


निपटने के लिए इस उत्तर की जाँच करेंurllib2
भयावह

जवाबों:


156

आप अनुरोध इतिहास की तलाश कर रहे हैं ।

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

67

यह थोड़ा अलग सवाल का जवाब दे रहा है, लेकिन जब से मैं खुद इस पर अटक गया, मुझे उम्मीद है कि यह किसी और के लिए उपयोगी हो सकता है।

यदि आप 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 रेफरल स्क्रिप्ट (जिसमें हजारों यूआरएल थे) को बढ़ाया।
अहिंकल

क्या आप जानते हैं कि क्या हो रहा है r.next? मैंने सोचा था कि इसमें PreparedRequestरीडायरेक्ट URL की ओर इशारा किया जाएगा, लेकिन ऐसा नहीं लगता ...
इलायस स्ट्रील


32

मुझे लगता है कि requests.head के बजाय requests.get जब यूआरएल रीडायरेक्ट से निपटने कॉल करने के लिए, GitHub मुद्दे की जांच और अधिक सुरक्षित हो जाएगा यहाँ :

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

1
यह स्वीकृत उत्तर होना चाहिए। छोटा एवं सुन्दर।
Volatil3

5
@ Volatil3: सभी सर्वर एक HEAD रिक्वेस्ट का उसी तरह से जवाब नहीं देते हैं, जैसा GET के साथ होता है।
ब्लेंडर

9

Python3.5 के लिए, आप निम्नलिखित कोड का उपयोग कर सकते हैं:

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

यह पायथन 3.5 के लिए सही उत्तर है, मुझे ढूंढने में
थोड़ा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.