मैं पाइथन के urllib2 का उपयोग कर "जीवित रखें" HTTP अनुरोध कैसे बना सकता हूं?पाइथन urllib2 जीवित रखने के साथ
उत्तर
urlgrabber लाइब्रेरी का उपयोग करें।
>>> import urllib2
>>> from urlgrabber.keepalive import HTTPHandler
>>> keepalive_handler = HTTPHandler()
>>> opener = urllib2.build_opener(keepalive_handler)
>>> urllib2.install_opener(opener)
>>>
>>> fo = urllib2.urlopen('http://www.python.org')
नोट:: 3.9.1
नहीं है आप पहले, संस्करण 3.9.0 urlgrabber का उपयोग करना चाहिए या के रूप में keepalive मॉड्यूल संस्करण में हटा दिया गया है यह है कि HTTP 1.1 और keepalive का समर्थन करता है urllib2 के लिए एक HTTP हैंडलर शामिल एक port पाइथन 3 के लिए रखरखाव मॉड्यूल 3.
ध्यान दें कि urlgrabber पूरी तरह से अजगर 2.6 के साथ काम नहीं करता है। मैंने keepalive.py में निम्नलिखित संशोधन करके मुद्दों को हल किया (मुझे लगता है)।
keepalive.HTTPHandler.do_open में() को हटाने के इस
if r.status == 200 or not HANDLE_ERRORS:
return r
और यह
if r.status == 200 or not HANDLE_ERRORS:
# [speedplane] Must return an adinfourl object
resp = urllib2.addinfourl(r, r.msg, req.get_full_url())
resp.code = r.status
resp.msg = r.reason
return resp
धन्यवाद लेकिन यह अच्छा होगा अगर आपने समझाया कि उस बेकार टैग की गई टिप्पणी के बजाय यह क्या तय है। – 2371
मूल आर और आपका resp <दोनों 'प्रकार' उदाहरण '> हैं और दोनों में एक ही विशेषता है। addinfourl कहते हैं "एक खुली फ़ाइल में जानकारी() और geturl() विधियों को जोड़ने के लिए वर्ग।" लेकिन मूल में पहले से ही जानकारी है() और geturl()। लाभ का काम नहीं कर सका। – 2371
दुर्भाग्य keepalive.py सम्मिलित निम्नलिखित परिवर्तन से 25 सितं, 2009 urlgrabber से हटा दिया गया था के बाद urlgrabber था pycurl पर निर्भर करता है (जो जीवित रहने का समर्थन करता है):
http://yum.baseurl.org/gitweb?p=urlgrabber.git;a=commit;h=f964aa8bdc52b29a2c137a917c72eecd4c4dda94
,210हालांकि, आप अभी keepalive.py के अंतिम संशोधन यहाँ प्राप्त कर सकते:
या httplib के HTTPConnection की जाँच करें।
जो मेरे लिए काम किया ... –
HTTPConnection के लिए जीवित रहने में सक्षम कैसे करें? मैंने दोनों अनुरोध और प्रतिक्रिया शीर्षलेखों के लिए 'कनेक्शन: Keep-Alive' जोड़ने का प्रयास किया, लेकिन 'httplib' अभी भी प्रत्येक अनुरोध पर दोबारा जुड़ता है –
urllib3 प्रयास करें जो निम्नलिखित सुविधाएं होती हैं:
- अधिक अनुरोध (HTTPConnectionPool और HTTPSConnectionPool) (वैकल्पिक क्लाइंट-साइड प्रमाण पत्र सत्यापन के साथ) के लिए एक ही गर्तिका कनेक्शन पुन: उपयोग करें।
- फ़ाइल पोस्टिंग (encode_multipart_formdata)।
- अंतर्निहित पुनर्निर्देशन और पुनः प्रयास (वैकल्पिक)।
- gzip का समर्थन करता है और डीकोडिंग को डिफ्लेट करता है।
- थ्रेड-सुरक्षित और स्वच्छता-सुरक्षित।
- विस्तार और निर्माण के लिए सही कोडेबेस को समझने के लिए छोटे और आसान। अधिक व्यापक समाधान के लिए, अनुरोधों पर एक नज़र डालें।
या एक अधिक व्यापक समाधान - Requests - जो जीवित-रखें version 0.8.0 से (आंतरिक urllib3 का उपयोग करके) का समर्थन करता है और निम्नलिखित features है:
- अत्यंत सरल HEAD, मिलता है, पोस्ट , पुट, पैच, अनुरोध हटाएं।
- Asyncronous अनुरोधों के लिए Gevent समर्थन।
- कुकी दृढ़ता के साथ सत्र।
- बेसिक, डाइजेस्ट और कस्टम प्रमाणीकरण समर्थन।
- शब्दकोशों का स्वत: फॉर्म-एन्कोडिंग
- अनुरोध/प्रतिक्रिया कुकीज़ के लिए एक सरल शब्दकोश इंटरफ़ेस।
- फ़ाइल अपलोड मल्टीपार्ट करें।
- यूनिकोड, जीजीआईपी, और डिफ्लेट प्रतिक्रियाओं के ऑटोमैटिक डिकोडिंग।
- यूनिकोड यूआरएल और डोमेन नामों के लिए पूर्ण समर्थन।
कृपया सामूहिक दर्द से बचें और Requests का उपयोग करें। यह डिफ़ॉल्ट रूप से सही काम करेगा और लागू होने पर जीवित रहने का उपयोग करेगा।
मैं कुछ एनटीएलएम प्रमाणीकरण पर काम कर रहा हूं और अनुरोध एनटीएलएम लाइब्रेरी इसके लिए सही तरीके से काम नहीं करता है। हालांकि, urllib2 एनटीएलएम लाइब्रेरी सही ढंग से काम करता है। यह सवाल इसलिए मेरे लिए उपयोगी था। –
@ जेफरसन हडसन, मुझे इसके बारे में पता नहीं था। आपके पास https://github.com/requests/requests-ntlm –
के साथ बेहतर भाग्य हो सकता है मैंने इस जवाब से पहले एक साल में मेरे उत्तर में अनुरोधों का प्रस्ताव पहले से ही प्रस्तावित किया है ... –
यहां कुछ हद तक समान यूरोपेन() है जो जीवित रहता है, हालांकि यह थ्रेडसेफ नहीं है।
try:
from http.client import HTTPConnection, HTTPSConnection
except ImportError:
from httplib import HTTPConnection, HTTPSConnection
import select
connections = {}
def request(method, url, body=None, headers={}, **kwargs):
scheme, _, host, path = url.split('/', 3)
h = connections.get((scheme, host))
if h and select.select([h.sock], [], [], 0)[0]:
h.close()
h = None
if not h:
Connection = HTTPConnection if scheme == 'http:' else HTTPSConnection
h = connections[(scheme, host)] = Connection(host, **kwargs)
h.request(method, '/' + path, body, headers)
return h.getresponse()
def urlopen(url, data=None, *args, **kwargs):
resp = request('POST' if data else 'GET', url, data, *args, **kwargs)
assert resp.status < 400, (resp.status, resp.reason, resp.read())
return resp
धन्यवाद डेविड। मैंने तदनुसार जवाब अपडेट किया है। – msanders
नई साइट: http://urlgrabber.baseurl.org/ –
धन्यवाद @Forest - मैंने अब उत्तर में लिंक अपडेट किया है। – msanders