2012-04-01 27 views
7

मैं बहुत की तरह सिर अनुरोध करने के लिए urllib2 का उपयोग कर सकते हैं: पायथन HTTP हेड - रीडायरेक्ट से ठीक से निपट रहा है?

import urllib2 
request = urllib2.Request('http://example.com') 
request.get_method = lambda: 'HEAD' 
urllib2.urlopen(request) 

समस्या ऐसा लगता है कि जब इस रीडायरेक्ट इस प्रकार है, यह का उपयोग करता है HEAD दर्ज करने के बजाय है।

इस हेड अनुरोध का उद्देश्य यूआरएल के आकार और सामग्री प्रकार को जांचना है जिसे मैं डाउनलोड करने जा रहा हूं ताकि मैं सुनिश्चित कर सकूं कि मुझे कुछ बड़ा दस्तावेज़ डाउनलोड नहीं है। (यूआरएल आईआरसी के माध्यम से एक यादृच्छिक इंटरनेट उपयोगकर्ता द्वारा आपूर्ति की जाती है)।

रीडायरेक्ट का पालन करते समय मैं इसे HEAD अनुरोधों का उपयोग कैसे कर सकता हूं?

+3

[अनुरोध] (http://docs.python-requests.org/en/latest/index.html) कम से कम ऐसा करने का दावा करता है सही तरीका (कम से कम, यह अपने रीडायरेक्ट व्यवहार को idempotent विधियों के लिए काम करने के रूप में दस्तावेज करता है, और विशेष रूप से दस्तावेज़ों में HEAD को कॉल करता है)। –

+0

एक समान समाधान: http://stackoverflow.com/questions/9890815/python-get-headers-only-using-urllib2/9892207#9892207 – newtover

उत्तर

3

अच्छा सवाल! यदि आप urllib2 का उपयोग करने पर सेट हैं, तो आप अपने खुद के रीडायरेक्ट हैंडलर के निर्माण के बारे में this answer देखना चाहेंगे।

संक्षेप में (पढ़ें: दो टूक पिछले जवाब से चोरी हो):

import urllib2 

#redirect_handler = urllib2.HTTPRedirectHandler() 

class MyHTTPRedirectHandler(urllib2.HTTPRedirectHandler): 
    def http_error_302(self, req, fp, code, msg, headers): 
     print "Cookie Manip Right Here" 
     return urllib2.HTTPRedirectHandler.http_error_302(self, req, fp, code, msg, headers) 

    http_error_301 = http_error_303 = http_error_307 = http_error_302 

cookieprocessor = urllib2.HTTPCookieProcessor() 

opener = urllib2.build_opener(MyHTTPRedirectHandler, cookieprocessor) 
urllib2.install_opener(opener) 

response =urllib2.urlopen("WHEREEVER") 
print response.read() 

print cookieprocessor.cookiejar 

इसके अलावा, जैसा शुद्धिपत्र में उल्लेख किया है, आप अजगर Requests उपयोग कर सकते हैं।

+1

मैंने जो पाया है उसके आधार पर मैंने इस रीडायरेक्ट हैंडलर का उपयोग करके समाप्त किया: http://pastebin.com/m7aN21A7 धन्यवाद! – Krenair

+0

@ क्रेनेयर मदद करने के लिए खुशी! – MrGomez

9

आप requests पुस्तकालय के साथ ऐसा कर सकते हैं:

>>> import requests 
>>> r = requests.head('http://github.com', allow_redirects=True) 
>>> r 
<Response [200]> 
>>> r.history 
[<Response [301]>] 
>>> r.url 
u'https://github.com/'