পাইথন অনুরোধ গ্রন্থাগার নতুন url পুনর্নির্দেশ


103

আমি পাইথন রিকোয়েস্টস ডকুমেন্টেশনগুলি সন্ধান করছি তবে আমি কী অর্জন করতে চাইছি তার জন্য কোনও কার্যকারিতা দেখতে পাচ্ছি না।

আমার স্ক্রিপ্টে আমি সেট করছি allow_redirects=True

পৃষ্ঠাটি অন্য কোনও দিকে আপনাকে পুনঃনির্দেশিত করা হয়েছে কিনা তা জানতে চাই, নতুন URL টি কী।

উদাহরণস্বরূপ, শুরু URL টি হলে: www.google.com/redirect

এবং চূড়ান্ত ইউআরএল হয় www.google.co.uk/redirected

আমি কীভাবে এই ইউআরএল পাব?


পরীক্ষা করে দেখুন এই উত্তর মোকাবেলার জন্য urllib2
হরক্রাক্স

উত্তর:


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 কোনও কারণে 404s দিচ্ছে, তবে আমার জন্য httpbingo.org (একই ইউআরএল স্কিম) ঠিক কাজ করেছে।
প্রেস্টন বাদের

4
@ প্রিস্টনবেদার: এটি একটি জ্ঞাত সমস্যা: github.com/postmanlabs/httpbin/issues/617 । ভাগ্যক্রমে ডেমো উত্তরের জন্য কাজ করে এমনটি গুরুত্বপূর্ণ নয়।
মার্টিজান পিটারস

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 ছিল) কয়েক সেকেন্ডের মধ্যে বাড়িয়েছে।
আহিঙ্কল

আপনি কি জানেন কি হচ্ছে r.next? আমি ভেবেছিলাম যে এতে PreparedRequestইউআরএলটিকে পুনর্নির্দেশের দিকে নির্দেশ করা থাকবে তবে এটি মনে হয় না ...
এলিয়াস স্ট্রহলে


33

আমি মনে করি requests.head পরিবর্তে requests.get যখন URL পুনর্নির্দেশ হ্যান্ডলিং ডাকতে ভালবাসি, GitHub ইস্যু পরীক্ষা আরো নিরাপদ হতে হবে এখানে :

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

4
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। স্বল্প ও মধুর.
ভোলাটিল 3

4
@ ভোলিটিল 3: সমস্ত সার্ভারগুলি জিইটি-র সাথে একইভাবে অনুরোধের অনুরোধ জানায় না।
ব্লেন্ডার

10

পাইথন ৩.৫ এর জন্য আপনি নিম্নলিখিত কোডটি ব্যবহার করতে পারেন:

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

এটি পাইথন 3.5 এর সঠিক উত্তর, এটি পেতে আমাকে কিছুটা সময় নিয়েছিল, ধন্যবাদ
jjj
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.