هل هناك طريقة سهلة لطلب عنوان URL في بيثون وعدم اتباع عمليات إعادة التوجيه؟

StackOverflow https://stackoverflow.com/questions/110498

  •  02-07-2019
  •  | 
  •  

سؤال

بالنظر إلى مصدر urllib2، يبدو أن أسهل طريقة للقيام بذلك هي إنشاء فئة فرعية HTTPRedirectHandler ثم استخدام build_opener لتجاوز HTTPRedirectHandler الافتراضي، ولكن يبدو أن هذا يتطلب الكثير من العمل (المعقد نسبيًا) للقيام بما يبدو أنه ينبغي أن يكون. بسيطة جدا.

هل كانت مفيدة؟

المحلول

هنا هو الطلبات طريق:

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

نصائح أخرى

الغوص في بايثون يحتوي على فصل جيد عن التعامل مع عمليات إعادة التوجيه باستخدام 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

هذا معالج 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)

أفترض أن هذا من شأنه أن يساعد

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)

ال redirections الكلمة المفتاحية في httplib2 طريقة الطلب هي رنجة حمراء.بدلاً من إرجاع الطلب الأول، سيتم رفع ملف RedirectLimit استثناء إذا تلقى رمز حالة إعادة التوجيه.لإرجاع الاستجابة الأولية التي تحتاج إلى ضبطها follow_redirects ل False على ال Http هدف:

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

أنا مؤشر olt الثاني ل الغوص في بايثون.فيما يلي تطبيق باستخدام معالجات إعادة التوجيه urllib2، هل هناك عمل أكثر مما ينبغي؟ربما، هز كتفيه.

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) 

ولكن أقصر الطرق هو

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

noredir_opener = urllib2.build_opener(NoRedirect())
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top