2009-06-24 10 views

उत्तर

30

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.

+0

धन्यवाद डेविड। मैंने तदनुसार जवाब अपडेट किया है। – msanders

+0

नई साइट: http://urlgrabber.baseurl.org/ –

+0

धन्यवाद @Forest - मैंने अब उत्तर में लिंक अपडेट किया है। – msanders

4

ध्यान दें कि 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 
+0

धन्यवाद लेकिन यह अच्छा होगा अगर आपने समझाया कि उस बेकार टैग की गई टिप्पणी के बजाय यह क्या तय है। – 2371

+0

मूल आर और आपका resp <दोनों 'प्रकार' उदाहरण '> हैं और दोनों में एक ही विशेषता है। addinfourl कहते हैं "एक खुली फ़ाइल में जानकारी() और geturl() विधियों को जोड़ने के लिए वर्ग।" लेकिन मूल में पहले से ही जानकारी है() और geturl()। लाभ का काम नहीं कर सका। – 2371

4

दुर्भाग्य keepalive.py सम्मिलित निम्नलिखित परिवर्तन से 25 सितं, 2009 urlgrabber से हटा दिया गया था के बाद urlgrabber था pycurl पर निर्भर करता है (जो जीवित रहने का समर्थन करता है):

http://yum.baseurl.org/gitweb?p=urlgrabber.git;a=commit;h=f964aa8bdc52b29a2c137a917c72eecd4c4dda94

,210

हालांकि, आप अभी keepalive.py के अंतिम संशोधन यहाँ प्राप्त कर सकते:

http://yum.baseurl.org/gitweb?p=urlgrabber.git;a=blob_plain;f=urlgrabber/keepalive.py;hb=a531cb19eb162ad7e0b62039d19259341f37f3a6

7

या httplib के HTTPConnection की जाँच करें।

+0

जो मेरे लिए काम किया ... –

+1

HTTPConnection के लिए जीवित रहने में सक्षम कैसे करें? मैंने दोनों अनुरोध और प्रतिक्रिया शीर्षलेखों के लिए 'कनेक्शन: Keep-Alive' जोड़ने का प्रयास किया, लेकिन 'httplib' अभी भी प्रत्येक अनुरोध पर दोबारा जुड़ता है –

11

urllib3 प्रयास करें जो निम्नलिखित सुविधाएं होती हैं:

  • अधिक अनुरोध (HTTPConnectionPool और HTTPSConnectionPool) (वैकल्पिक क्लाइंट-साइड प्रमाण पत्र सत्यापन के साथ) के लिए एक ही गर्तिका कनेक्शन पुन: उपयोग करें।
  • फ़ाइल पोस्टिंग (encode_multipart_formdata)।
  • अंतर्निहित पुनर्निर्देशन और पुनः प्रयास (वैकल्पिक)।
  • gzip का समर्थन करता है और डीकोडिंग को डिफ्लेट करता है।
  • थ्रेड-सुरक्षित और स्वच्छता-सुरक्षित।
  • विस्तार और निर्माण के लिए सही कोडेबेस को समझने के लिए छोटे और आसान। अधिक व्यापक समाधान के लिए, अनुरोधों पर एक नज़र डालें।

या एक अधिक व्यापक समाधान - Requests - जो जीवित-रखें version 0.8.0 से (आंतरिक urllib3 का उपयोग करके) का समर्थन करता है और निम्नलिखित features है:

  • अत्यंत सरल HEAD, मिलता है, पोस्ट , पुट, पैच, अनुरोध हटाएं।
  • Asyncronous अनुरोधों के लिए Gevent समर्थन।
  • कुकी दृढ़ता के साथ सत्र।
  • बेसिक, डाइजेस्ट और कस्टम प्रमाणीकरण समर्थन।
  • शब्दकोशों का स्वत: फॉर्म-एन्कोडिंग
  • अनुरोध/प्रतिक्रिया कुकीज़ के लिए एक सरल शब्दकोश इंटरफ़ेस।
  • फ़ाइल अपलोड मल्टीपार्ट करें।
  • यूनिकोड, जीजीआईपी, और डिफ्लेट प्रतिक्रियाओं के ऑटोमैटिक डिकोडिंग।
  • यूनिकोड यूआरएल और डोमेन नामों के लिए पूर्ण समर्थन।
4

कृपया सामूहिक दर्द से बचें और Requests का उपयोग करें। यह डिफ़ॉल्ट रूप से सही काम करेगा और लागू होने पर जीवित रहने का उपयोग करेगा।

+0

मैं कुछ एनटीएलएम प्रमाणीकरण पर काम कर रहा हूं और अनुरोध एनटीएलएम लाइब्रेरी इसके लिए सही तरीके से काम नहीं करता है। हालांकि, urllib2 एनटीएलएम लाइब्रेरी सही ढंग से काम करता है। यह सवाल इसलिए मेरे लिए उपयोगी था। –

+0

@ जेफरसन हडसन, मुझे इसके बारे में पता नहीं था। आपके पास https://github.com/requests/requests-ntlm –

+1

के साथ बेहतर भाग्य हो सकता है मैंने इस जवाब से पहले एक साल में मेरे उत्तर में अनुरोधों का प्रस्ताव पहले से ही प्रस्तावित किया है ... –

0

यहां कुछ हद तक समान यूरोपेन() है जो जीवित रहता है, हालांकि यह थ्रेडसेफ नहीं है।

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