Urllib, urllib2, urllib3 और request मॉड्यूल के बीच अंतर क्या हैं?


750

अजगर में, के बीच मतभेद रहे हैं urllib, urllib2, urllib3और requestsमॉड्यूल? तीन क्यों हैं? वे एक ही काम करने लगते हैं ...


77
अनुरोध सबसे अच्छा है।
यारिन

2
हां, अनुरोधों का उपयोग करें। stackoverflow.com/questions/22676/…
ह्यूगड्रोवन

75
अनुरोध urllib3 का उपयोग करता है .. 3 एक बड़ी संख्या है
Bro

2
सारांश: requestsअधिकांश समय का उपयोग करें । कभी-कभी urllib2काम करता है लेकिन अधिक कोड की आवश्यकता होती है और कम सुरुचिपूर्ण होती है। उपयोग न करें urllib
ट्रेवर बॉयड स्मिथ

10
यह प्रश्न स्पष्ट करने के लिए अद्यतन किया जाना चाहिए कि urllibपायथन 3 अभी तक एक और विकल्प है, जिसे विभिन्न तरीकों से साफ किया गया है। लेकिन शुक्र है आधिकारिक दस्तावेज भी लिखते हैं कि " अनुरोध पैकेज, एक उच्च स्तरीय HTTP ग्राहक इंटरफ़ेस के लिए सिफारिश की है। पर" 21.6। urllib.request - URL खोलने के लिए एक्स्टेंसिबल लाइब्रेरी - Python 3.6.3 प्रलेखन
nealmcb

जवाबों:


714

मुझे पता है कि यह पहले से ही कहा गया है, लेकिन मैं requestsअजगर पैकेज की अत्यधिक सिफारिश करूंगा ।

यदि आपने अजगर के अलावा अन्य भाषाओं का उपयोग किया है, तो आप शायद सोच रहे हैं urllibऔर urllib2उपयोग करना आसान है, बहुत अधिक कोड नहीं, और अत्यधिक सक्षम है, यही मैं सोचता था। लेकिन requestsपैकेज इतना अविश्वसनीय रूप से उपयोगी और संक्षिप्त है कि हर किसी को इसका उपयोग करना चाहिए।

सबसे पहले, यह पूरी तरह से आरामदायक एपीआई का समर्थन करता है, और जितना आसान है:

import requests

resp = requests.get('http://www.mywebsite.com/user')
resp = requests.post('http://www.mywebsite.com/user')
resp = requests.put('http://www.mywebsite.com/user/put')
resp = requests.delete('http://www.mywebsite.com/user/delete')

भले ही GET / POST हो, आपको फिर से कभी भी पैरामीटर को एनकोड नहीं करना होगा, यह केवल एक डिक्शनरी के रूप में एक डिक्शनरी लेता है और जाने के लिए अच्छा है:

userdata = {"firstname": "John", "lastname": "Doe", "password": "jdoe123"}
resp = requests.post('http://www.mywebsite.com/user', data=userdata)

इसके अलावा यह JSON डिकोडर में बनाया गया है (फिर से, मुझे पता json.loads()है कि लिखना बहुत अधिक नहीं है, लेकिन यह सुनिश्चित करना सुविधाजनक है):

resp.json()

या यदि आपका प्रतिक्रिया डेटा सिर्फ पाठ है, तो उपयोग करें:

resp.text

यह केवल एक ऊपरी हिस्सा है। यह अनुरोध साइट से सुविधाओं की सूची है:

  • अंतर्राष्ट्रीय डोमेन और URLs
  • कीप-अलाइव एंड कनेक्शन पूलिंग
  • कुकी दृढ़ता के साथ सत्र
  • ब्राउज़र-शैली एसएसएल सत्यापन
  • बेसिक / डाइजेस्ट ऑथेंटिकेशन
  • सुरुचिपूर्ण कुंजी / मूल्य कुकीज़
  • स्वचालित अपघटन
  • यूनिकोड रिस्पांस निकायों
  • मल्टीपार्ट फाइल अपलोड
  • कनेक्शन टाइमआउट
  • .netrc सपोर्ट
  • सामग्री सूचीबद्ध करें
  • पायथन 2.6-3.4
  • सुरक्षित धागा।

32
मैंने इसे उत्तर के रूप में उठाया क्योंकि मूल उत्तर बासी हो गया है। तो अगर आप सोच रहे हैं कि यह उत्तर 76 उत्थान के साथ एक उत्तर से आगे क्यों है, तो इसका अनुरोध चीजों को करने का नया डिफैक्टो तरीका है।
पॉल बिगगर

132
@PaulBiggar आप कहते हैं कि यह सबसे अच्छा जवाब है। लेकिन यह वास्तव में सवाल का जवाब नहीं देता है। मैं यहां urlib और urllib2 के बीच अंतर के बारे में जानने के लिए आया था। विशेष रूप से url एन्कोडिंग सुविधाओं के बारे में। जवाब: अनुरोधों का उपयोग करें! ;) बस कह रहा है कि आप सवाल स्पष्ट करना चाहते हो सकता है। जैसा कि यह खड़ा है, क्रेस्ट का जवाब वास्तव में पूरी तरह से सवाल का जवाब देता है।
प्रथमा

2
यह टिप्पणी अजगर 3 प्रलेखन अभी तक एक अलग पुस्तकालय है कि करने के लिए मदद मिलेगी urllibकि "और इसके प्रलेखन कि भी आधिकारिक तौर पर नोटों अनुरोध पैकेज, एक उच्च स्तरीय HTTP ग्राहक इंटरफ़ेस के लिए सिफारिश की है। पर" 21.6। urllib.request - URL खोलने के लिए एक्स्टेंसिबल लाइब्रेरी - पायथन 3.6.3 डॉक्यूमेंटेशन , और इसके urllib3द्वारा उपयोग की जाने वाली एक बेहतरीन लाइब्रेरी है requests
nealmcb

ठीक है, सिवाय इसके कि मेरे पास अनुरोध का कोई प्रतिस्थापन नहीं हैurllib.parse()
बॉब स्टीन

इस बात से सहमत। @PaulBiggar के साथ - अनुरोध de-facto तरीका प्रतीत होता है। वास्तव में मैं इस आधार पर यहाँ आया कि urllib (और अन्य संस्करण) या तो काम नहीं करते हैं या अनुरोधों की तुलना में उप-प्रकार हैं।
डीएल

205

urllib2 कुछ अतिरिक्त कार्यक्षमता प्रदान करता है, अर्थात् urlopen()फ़ंक्शन आपको हेडर निर्दिष्ट करने की अनुमति दे सकता है (सामान्य रूप से आपको अतीत में लिंकप्लेब का उपयोग करना होगा, जो कि कहीं अधिक क्रिया है।) हालांकि अधिक महत्वपूर्ण बात, urllib2 Requestवर्ग प्रदान करता है , जो अधिक के लिए अनुमति देता है। एक अनुरोध करने के लिए घोषणात्मक दृष्टिकोण:

r = Request(url='http://www.mysite.com')
r.add_header('User-Agent', 'awesome fetcher')
r.add_data(urllib.urlencode({'foo': 'bar'})
response = urlopen(r)

ध्यान दें कि urlencode()केवल urllib में है, urllib2 में नहीं।

Urllib2 में अधिक उन्नत URL समर्थन को लागू करने के लिए हैंडलर भी हैं। संक्षिप्त उत्तर है, जब तक आप विरासत कोड के साथ काम नहीं कर रहे हैं, आप शायद urllib2 से URL ओपनर का उपयोग करना चाहते हैं, लेकिन आपको अभी भी कुछ उपयोगिता कार्यों के लिए urllib में आयात करने की आवश्यकता है।

Google ऐप इंजन के साथ बोनस उत्तर , आप किसी भी कैंपलिब, urllib या urllib2 का उपयोग कर सकते हैं, लेकिन ये सभी Google के URL Fetch API के लिए सिर्फ रैपर हैं। यही है, आप अभी भी उसी सीमा के अधीन हैं, जैसे पोर्ट, प्रोटोकॉल और प्रतिक्रिया की लंबाई की अनुमति है। आप पुस्तकालयों के मूल का उपयोग कर सकते हैं क्योंकि आप HTTP यूआरएल को पुनः प्राप्त करने की उम्मीद करेंगे।


1
कोई व्यक्ति urllib2 का उपयोग करके एन्कोडेड क्वेरी स्ट्रिंग के साथ एक url कैसे बनाता है? यह एकमात्र कारण है जो मैं urllib का उपयोग कर रहा हूं और मैं यह सुनिश्चित करना चाहता हूं कि मैं सब कुछ नवीनतम / सबसे अच्छा तरीका कर रहा हूं।
गैटस्टर

2
मेरे ऊपर के उदाहरण में की तरह, आप का उपयोग urlopen()और Requestसे urllib2 , और आप का उपयोग urlencode()से urllib । दोनों पुस्तकालयों का उपयोग करने में कोई वास्तविक नुकसान नहीं है, जब तक आप सुनिश्चित करते हैं कि आप सही urlopen का उपयोग करते हैं। [Urllib डॉक्स] [1] इस पर स्पष्ट हैं कि इसका उपयोग करना एक छद्म उपयोग है। [१]: docs.python.org/library/urllib2.html#urllib2.urlopen
क्रस्ट करें

मैं इस के लिए इस्तेमाल किया urllib2.urlopen; अन्य विविधताएँ भी हैं।
आंद्रेई-निकुले पेट्रे

urllib2 पुट या डिलीट का समर्थन नहीं करता है जो एक दर्द है
fkl

1
requestsकस्टम हेडर की भी अनुमति दें: docs.python-requests.org/en/master/user/quickstart/…
Omer Dagan

46

urllib और urllib2 दोनों पायथन मॉड्यूल हैं जो URL अनुरोध संबंधित सामान करते हैं, लेकिन विभिन्न कार्यशीलता प्रदान करते हैं।

1) urllib2 URL अनुरोध के लिए शीर्ष लेख सेट करने के लिए अनुरोध ऑब्जेक्ट को स्वीकार कर सकता है, urllib केवल एक URL स्वीकार करता है।

2) urllib urlencode विधि प्रदान करता है जो कि GET क्वेरी स्ट्रिंग्स की पीढ़ी के लिए उपयोग किया जाता है, urllib2 में ऐसा कोई फ़ंक्शन नहीं है। यह एक कारण है कि urllib का उपयोग अक्सर urllib2 के साथ किया जाता है।

अनुरोध - अनुरोध 'पायथन में लिखा गया एक सरल, उपयोग में आसान HTTP लाइब्रेरी है।

1) पायथन अनुरोध मापदंडों को स्वचालित रूप से एन्कोड करता है ताकि आप उन्हें सिर्फ़ तर्क के रूप में पारित कर सकें, urllib के मामले में, जहाँ आपको उन्हें पारित करने से पहले मापदंडों को एनकोड करने के लिए urllib.encode () का उपयोग करने की आवश्यकता होती है।

2) यह स्वचालित रूप से यूनिकोड में प्रतिक्रिया को डिकोड करता है।

3) अनुरोध में कहीं अधिक सुविधाजनक त्रुटि हैंडलिंग है। यदि आपका प्रमाणीकरण विफल हो गया है, तो urllib2 एक urllib2.URLError जुटाएगा, जबकि अनुरोध सामान्य प्रतिक्रिया ऑब्जेक्ट लौटाएगा, जैसा कि अपेक्षित था। आपको यह देखना होगा कि अनुरोध बूलियन प्रतिक्रिया द्वारा सफल था


10
urllib3 के बारे में क्या?
PirateApp

1
@PirateApp अनुरोधों के शीर्ष पर बनाया गया है urllib3 । मुझे लगता है कि सीधे urllib3 का उपयोग करने वाला कोड अधिक कुशल हो सकता है, क्योंकि यह आपको सत्र का पुन: उपयोग करने देता है, जबकि अनुरोध (कम से कम अनुरोध 2, जो हर कोई उपयोग करता है) प्रत्येक अनुरोध के लिए एक बनाता है, लेकिन मुझे उस पर उद्धरण नहीं देता है। न तो मानक पुस्तकालय का हिस्सा हैं ( अभी तक )
बोरिस

12

एक काफी अंतर Python2 को Python3 में पोर्ट करने के बारे में है। urllib2 python3 के लिए मौजूद नहीं है और इसके तरीके urllib में पोर्ट किए गए हैं। तो आप उस भारी उपयोग कर रहे हैं और भविष्य में Python3 की ओर पलायन करना चाहते हैं, urllib का उपयोग करने पर विचार करें। हालाँकि 2to3 टूल स्वचालित रूप से आपके लिए अधिकांश काम करेगा।


12

केवल मौजूदा उत्तरों को जोड़ने के लिए, मैं किसी को यह उल्लेख करते हुए नहीं देखता कि अजगर अनुरोध एक देशी पुस्तकालय नहीं है। यदि आप निर्भरता जोड़ने के साथ ठीक हैं, तो अनुरोध ठीक है। हालांकि, अगर आप निर्भरता को जोड़ने से बचने की कोशिश कर रहे हैं, तो urllib एक देशी अजगर लाइब्रेरी है जो आपके लिए पहले से ही उपलब्ध है।


11

मुझे urllib.urlencodeफ़ंक्शन पसंद है , और इसमें मौजूद नहीं है urllib2

>>> urllib.urlencode({'abc':'d f', 'def': '-!2'})
'abc=d+f&def=-%212'

4
बस एक नोट, urlencode के साथ सावधान रहें क्योंकि यह <unicode> ऑब्जेक्ट्स को सीधे हैंडल नहीं कर सकता है - आपको उन्हें urlencode (u'blá'.encode ('utf-8'), या जो भी हो, भेजने से पहले उन्हें एनकोड करना होगा।

@ user18015: मुझे नहीं लगता कि यह पायथन 3 पर लागू होता है, क्या आप स्पष्ट कर सकते हैं?
Janus Troelsen

जैसा कि मैंने ऊपर उल्लेख किया है, इस सवाल और विभिन्न उत्तरों को स्पष्ट करने के लिए अद्यतन किया जाना चाहिए कि urllibपायथन 3 अभी तक एक और विकल्प है, विभिन्न तरीकों से साफ किया गया है। लेकिन शुक्र है, आधिकारिक दस्तावेज भी लिखते हैं कि " अनुरोध पैकेज, एक उच्च स्तरीय HTTP ग्राहक इंटरफ़ेस। के लिए सिफारिश की है पर" 21.6। urllib.request - URL खोलने के लिए एक्स्टेंसिबल लाइब्रेरी - पायथन 3.6.3 प्रलेखन
nealmcb

urllib2 Python 3
Boris

7

एक url की सामग्री प्राप्त करने के लिए:

try: # Try importing requests first.
    import requests
except ImportError: 
    try: # Try importing Python3 urllib
        import urllib.request
    except AttributeError: # Now importing Python2 urllib
        import urllib


def get_content(url):
    try:  # Using requests.
        return requests.get(url).content # Returns requests.models.Response.
    except NameError:  
        try: # Using Python3 urllib.
            with urllib.request.urlopen(index_url) as response:
                return response.read() # Returns http.client.HTTPResponse.
        except AttributeError: # Using Python3 urllib.
            return urllib.urlopen(url).read() # Returns an instance.

requestप्रतिक्रियाओं के लिए Python2 और Python3 और निर्भरता कोड लिखना कठिन है क्योंकि वे विभिन्न प्रकार के कार्य urlopen()करते हैं और requests.get()वापस आते हैं:

  • Python2 urllib.request.urlopen()एक रिटर्न देता हैhttp.client.HTTPResponse
  • पायथन 3 urllib.urlopen(url)रिटर्न एinstance
  • अनुरोध request.get(url)एक रिटर्नrequests.models.Response

5

आपको आमतौर पर urllib2 का उपयोग करना चाहिए, क्योंकि यह कई बार अनुरोध ऑब्जेक्ट्स को स्वीकार करके चीजों को थोड़ा आसान बनाता है और प्रोटोकॉल त्रुटियों पर URLException भी बढ़ाएगा। Google App इंजन के साथ, आप या तो उपयोग नहीं कर सकते। आपको URL Fetch API का उपयोग करना होगा जो Google अपने सैंडबॉक्स वाले पायथन वातावरण में प्रदान करता है।


2
एपेंजी के बारे में आपने जो कहा है वह पूरी तरह सच नहीं है। आप वास्तव में ऐप इंजन में अब कैनपिलिब, यूरलिब और यूरलिब 2 का उपयोग कर सकते हैं (वे url फ़िंच के लिए रैपर हैं, ऐसा इसलिए किया गया ताकि अधिक कोड
ऐपेंजीन के

आह, नया होना चाहिए। मेरा कोड विफल हो गया, मैंने आखिरी बार कोशिश की और लाने के लिए फिर से लिखना पड़ा ...
चिन्मय कांची


urllib2 Python 3
Boris


1

एक प्रमुख मुद्दा यह है कि मैं ऊपर जवाब में लापता पाते हैं कि urllib रिटर्न प्रकार का ऑब्जेक्ट है <class http.client.HTTPResponse>जबकि requestsरिटर्न<class 'requests.models.Response'>

इसके कारण, पठन () पद्धति का उपयोग किया जा सकता है urllibलेकिन इसके साथ नहींrequests

पुनश्च: requestsपहले से ही इतने सारे तरीकों से समृद्ध है कि इसे शायद ही किसी और की जरूरत है read();>

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.