পাইথনে কোনও ইউআরএল অনুরোধ করার এবং পুনঃনির্দেশগুলি অনুসরণ না করার কোন সহজ উপায় আছে?


101

Urlib2 এর উত্সটি দেখে মনে হচ্ছে এটি করার সবচেয়ে সহজ উপায় হ'ল HTTPRedirectHandler সাবক্লাস করা এবং তারপরে build_opener টি ডিফল্ট HTTPRedirectHandler ওভাররাইড করতে ব্যবহার করা উচিত তবে এটি অনেকটা (তুলনামূলক জটিল) কাজ বলে মনে হয় যা এটি হওয়া উচিত বলে মনে হয় বেশ সহজ.


4
গুগলারের জন্য: অনুরোধের লাইব্রেরিটি ব্যবহার করা আপনাকে অনেক মাথাব্যথা বাঁচাতে পারে: ডকস.পিথন- রেকর্ড.অর্গ এবং নীচে মারিয়ানের উত্তর দেখুন, এটি খুব মার্জিত।
আলাজ জানেজ

আমি সম্মত হই যে অনুরোধগুলি এই দিনগুলিতে যাওয়ার উপায়। আমি এই মন্তব্য এবং মারিয়ান এর উত্তরকে অগ্রাহ্য করেছি তবে আমি উত্তরটি পুরষ্কার হিসাবে রেখে যাচ্ছি কারণ এটি তখনকার সেরা ছিল।
জন

4
@ জন পুরষ্কারগুলি ভাল তবে সময় যায় এবং এটি একটি সম্প্রদায় সম্পাদিত সাইট। ফোকাসটি ভাল জবাবের দিকে, জনগণের দিকে নয়। তিনি তার উঁচু পয়েন্ট রাখবেন। আপনি অবহেলিত লাইব্রেরিতে বহু সংখ্যক সহকর্মীকে ভ্রান্ত করছেন।
মিট

4
যথেষ্ট ঠিক পরিষ্কার. আমি অনুরোধের উত্তর গ্রহণ করেছি।
জন

উত্তর:


186

অনুরোধের উপায়টি এখানে :

import requests
r = requests.get('http://github.com', allow_redirects=False)
print(r.status_code, r.headers['Location'])

6
তারপরে দেখুন r.headers['Location']এটি আপনাকে কোথায় পাঠিয়েছে
প্যাট্রিকসুরি

মনে রাখবেন যে অনুরোধগুলি এতে স্বাভাবিক Locationহবে location
হামিশ

4
@ হামিশ requestsআপনাকে আঞ্চলিক আকারে এবং ছোট হাতের অক্ষরে উভয়ই শিরোনাম অ্যাক্সেস করতে দেয়। Docs.python-requests.org/en/master/user/quickstart/…
মেরিয়ান

4
পাইথন 3-তে 2019 হিসাবে, এটি আর আমার পক্ষে কাজ করে না। (আমি একটি কী ডিক ত্রুটি পেয়েছি))
ম্যাক্স ভন হিপ্পেল

36

ডাইভ ইন্ট পাইথনের urllib2 এর সাথে পুনঃনির্দেশগুলি পরিচালনা করার জন্য একটি ভাল অধ্যায় রয়েছে। আরেকটি সমাধান হ'ল httplib

>>> import httplib
>>> conn = httplib.HTTPConnection("www.bogosoft.com")
>>> conn.request("GET", "")
>>> r1 = conn.getresponse()
>>> print r1.status, r1.reason
301 Moved Permanently
>>> print r1.getheader('Location')
http://www.bogosoft.com/new/location

7
গুগল থেকে যে কেউ এখানে আসেন, দয়া করে নোট করুন যে আপ টু ডেট করার উপায় এটি: স্ট্যাকওভারফ্লো.com/ a / 14678220 / 362951 অনুরোধের লাইব্রেরি আপনাকে প্রচুর মাথা ব্যাথা বাঁচাবে।
মিট

"ডাইভ ইন্ট পাইথন" এর লিঙ্কটি মারা গেছে।
গেটল্লি

11

এটি একটি urllib2 হ্যান্ডলার যা পুনঃনির্দেশগুলি অনুসরণ করে না:

class NoRedirectHandler(urllib2.HTTPRedirectHandler):
    def http_error_302(self, req, fp, code, msg, headers):
        infourl = urllib.addinfourl(fp, headers, req.get_full_url())
        infourl.status = code
        infourl.code = code
        return infourl
    http_error_300 = http_error_302
    http_error_301 = http_error_302
    http_error_303 = http_error_302
    http_error_307 = http_error_302

opener = urllib2.build_opener(NoRedirectHandler())
urllib2.install_opener(opener)

আমি একটি এপিআই পরীক্ষা করছি এবং লগইন পদ্ধতি নিয়ে কাজ করছি যা এমন কোনও পৃষ্ঠায় পুনর্নির্দেশ করে যা আমি পছন্দ করি না, তবে পুনঃনির্দেশের প্রতিক্রিয়া সহ পছন্দসই সেশন কুকি প্রেরণ করি না। এটির জন্য আমার ঠিক প্রয়োজন ছিল।
টিম ওয়াইল্ডার

9

redirectionsমধ্যে শব্দ httplib2অনুরোধ পদ্ধতি একটি লাল হেরিং হয়। প্রথম অনুরোধটি ফেরত দেওয়ার পরিবর্তে এটি একটি RedirectLimitব্যতিক্রম বাড়াবে যদি এটি কোনও পুনঃনির্দেশের স্থিতি কোডটি গ্রহণ করে। ইনটেনিটাল প্রতিক্রিয়া ফিরিয়ে আনতে আপনাকে অবজেক্টে সেট follow_redirectsকরতে Falseহবে Http:

import httplib2
h = httplib2.Http()
h.follow_redirects = False
(response, body) = h.request("http://example.com")

8

আমি মনে করি এটি সাহায্য করবে

from httplib2 import Http
def get_html(uri,num_redirections=0): # put it as 0 for not to follow redirects
conn = Http()
return conn.request(uri,redirections=num_redirections)

5

পাইথনে ডুব দেওয়ার জন্য আমি দ্বিতীয় বারের পয়েন্টারটি । এখানে urlib2 পুনর্নির্দেশ হ্যান্ডলারগুলি ব্যবহার করে একটি বাস্তবায়ন করা উচিত, এর চেয়ে আরও বেশি কাজ করা উচিত? হতে পারে, শ্রাগ।

import sys
import urllib2

class RedirectHandler(urllib2.HTTPRedirectHandler):
    def http_error_301(self, req, fp, code, msg, headers):  
        result = urllib2.HTTPRedirectHandler.http_error_301( 
            self, req, fp, code, msg, headers)              
        result.status = code                                 
        raise Exception("Permanent Redirect: %s" % 301)

    def http_error_302(self, req, fp, code, msg, headers):
        result = urllib2.HTTPRedirectHandler.http_error_302(
            self, req, fp, code, msg, headers)              
        result.status = code                                
        raise Exception("Temporary Redirect: %s" % 302)

def main(script_name, url):
   opener = urllib2.build_opener(RedirectHandler)
   urllib2.install_opener(opener)
   print urllib2.urlopen(url).read()

if __name__ == "__main__":
    main(*sys.argv) 

4
দেখতে দেখতে ভুল ... এই কোডটি আসলে পুনঃনির্দেশগুলি অনুসরণ করে (মূল হ্যান্ডলারকে কল করে, এইচটিটিপি অনুরোধ জারি করে), এবং তারপরে একটি ব্যতিক্রম
বাড়াবে

5

সংক্ষিপ্ততম উপায় যদিও

class NoRedirect(urllib2.HTTPRedirectHandler):
    def redirect_request(self, req, fp, code, msg, hdrs, newurl):
        pass

noredir_opener = urllib2.build_opener(NoRedirect())

4
এটি কিভাবে সংক্ষিপ্ততম উপায়? এটিতে আমদানি বা আসল অনুরোধও নেই।
মেরিয়ান

আমি ইতিমধ্যে এই সমাধানটি পোস্ট করতে যাচ্ছিলাম এবং নীচে এই উত্তরটি পেয়ে বেশ অবাক হয়েছিল। এটি খুব সংক্ষিপ্ত এবং আমার মতে শীর্ষের উত্তর হওয়া উচিত।
ব্যবহারকারী

তদুপরি, এটি আপনাকে আরও স্বাধীনতা দেয়, কোন URL গুলি অনুসরণ করা যায় তা নিয়ন্ত্রণ করা এটি সম্ভব ।
ব্যবহারকারী

আমি নিশ্চিত, এটি সহজতম উপায় ist যারা ডিবাগ করতে চান তাদের জন্য একটি সংক্ষিপ্ত মন্তব্য। ভুলে যাবেন না যে ওপেনারকে বুলিংয়ের সময় আপনি যেমন একাধিক হ্যান্ডলার সেট করতে পারেন: opener = urllib.request.build_opener(debugHandler, NoRedirect())কোথায় debugHandler=urllib.request.HTTPHandler()এবং debugHandler.set_http_debuglevel (1)। শেষ পর্যন্ত:urllib.request.install_opener(opener)
স্ট্যাশঅফকোড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.