سؤال

في بيثون، ما هي الاختلافات بين urllib, urllib2, urllib3 و requests وحدة؟ لماذا هناك ثلاثة؟ يبدو أنهم يفعلون نفس الشيء ...

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

المحلول

أعلم أنه قيل بالفعل، لكنني أوصي بشدة 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')

بغض النظر عما إذا كان الحصول على / منشور، لا تضطر أبدا إلى تشفير المعلمات مرة أخرى، فإنه ببساطة يأخذ في القاموس كوسيطة ويريد للذهاب:

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

بالإضافة إلى أنه يحتوي على فك تشفير جون (مرة أخرى، وأنا أعلم json.loads() ليس أكثر بكثير للكتابة، ولكن هذا بالتأكيد مناسب):

resp.json()

أو إذا كانت بياناتك الرد الخاصة بك هي مجرد نص، استخدم:

resp.text

هذه ليست سوى غيض من فيض. هذه هي قائمة الميزات من موقع الطلبات:

  • المجالات الدولية وعوالب المواقع
  • الحفاظ على الحيا والاتصال تجمع
  • جلسات مع مثابرة ملف تعريف الارتباط
  • التحقق من SSL على غرار المتصفح
  • مصادقة أساسية / هضم
  • ملفات تعريف الارتباط الرئيسية / القيمة
  • تخفيف الضغط التلقائي
  • هيئات استجابة يونيكود
  • تحميل ملف متعدد الأقراص
  • مهلة الاتصال
  • دعم
  • قائمة الاغراض
  • بيثون 2.6-3.4.
  • آمنة الموضوع.

نصائح أخرى

Urllib2 يوفر بعض الوظائف الإضافية، أي urlopen() يمكن أن تسمح لك الوظيفة بتحديد الرؤوس (عادة ما يتعين عليك استخدام HTTPLIB في الماضي، وهو أمر أكثر بكثير. هل الأهم من ذلك، يوفر 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.

يوجد أيضا معالجات لتنفيذ دعم URL أكثر تقدما في Urllib2. الإجابة القصيرة هي، إلا إذا كنت تعمل مع رمز إرث، فربما تريد استخدام فتحات URL من URLLIB2، ولكن لا تزال بحاجة إلى استيرادها إلى Urllib للحصول على بعض وظائف الأداة المساعدة.

إجابة المكافأةمع محرك Google App، يمكنك استخدام أي من httplib أو urllib أو orllib2، ولكن كل منهم مجرد مغلفات لجلب عنوان URL لجوجل Google. وهذا هو، لا تزال تخضع لنفس القيود مثل المنافذ والبروتوكولات وطول الاستجابة المسموح بها. يمكنك استخدام جوهر المكتبات كما تتوقع استرجاع عناوين URL HTTP، على الرغم من ذلك.

Urllib. و Urllib2. هل كلاهما وحدات بيثون التي تقوم بطلب عناوين URL أشياء ذات صلة ولكنها تقدم وظائف مختلفة.

1) Orllib2 يمكن أن يقبل كائن طلب لتعيين رؤوس طلب URL، Urllib يقبل فقط عنوان URL فقط.

2) urllib يوفر urlencode. الطريقة التي يتم استخدامها لتوليد الحصول على سلاسل الاستعلام، Urllib2 لا تملك وظيفة مثل هذه الوظيفة. هذا هو أحد الأسباب التي تجعل Urllib غالبا ما تستخدم جنبا إلى جنب مع Urllib2.

طلبات - الطلبات هي مكتبة HTTP بسيطة وسهلة الاستخدام مكتوبة في بيثون.

1) طلبات Python ترميز المعلمات تلقائيا حتى تقوم بتمريرها كحجج بسيطة، على عكس حالة Urllib، حيث تحتاج إلى استخدام الطريقة Urllib.encode () لتشفير المعلمات قبل اجتيازها.

2) فك تشفير الاستجابة تلقائيا في Unicode.

3) الطلبات لديها أيضا معالجة خطأ أكثر ملاءمة. إذا فشل مصادقةك، فإن Urllib2 سيقوم برفع Urllib2.urlerror، في حين أن الطلبات سترجع كائن استجابة عادي، كما هو متوقع. كل ما عليك معرفة ما إذا كان الطلب نجح من قبل المنطقي Response.ok.

على سبيل المثال المرجع - https://dancallahan.info/journal/python-Requests/

يقبل Urllib2.URLOPEN مثيل فئة الطلب أو عنوان URL، بينما يقبل Urllib.urlopen URL فقط.

حدثت مناقشة مماثلة هنا:http://www.velocityreviews.com/forums/t326690-urllib-urllib2-what-is-the-difference.html.

انا احب ال urllib.urlencode وظيفة، ولا يبدو أنها موجودة في urllib2.

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

فرق واحد كبير هو حول Porting Python2 إلى Python3. Urllib2 غير موجود ل Python3 وأساليبها التي يتم تحويلها إلى Urllib. لذلك أنت تستخدم ذلك بشكل كبير وتريد الترحيل إلى Python3 في المستقبل، فكر في استخدام Urllib. ومع ذلك، ستعمل أداة من 2to3 تلقائيا معظم العمل بالنسبة لك.

فقط لإضافة إلى الإجابات الموجودة، لا أرى أي شخص يذكر أن طلبات Python ليست مكتبة أصلية. إذا كنت موافق مع إضافة التبعيات، فإن الطلبات جيدة. ومع ذلك، إذا كنت تحاول تجنب إضافة التبعيات، فإن Urllib هي مكتبة Python الأصلية المتاحة بالفعل لك.

يجب عليك استخدام URLLIB2 URLLIB2 بشكل عام، لأن هذا يجعل الأمور أسهل قليلا في بعض الأحيان من خلال قبول كائنات الطلب وسوف يرفع أيضا موضوعا عن أخطاء البروتوكول. مع محرك تطبيق Google، لا يمكنك استخدام إما. عليك استخدام عنوان URL جلب API. أن جوجل توفر في بيئة بيثون الرفعة.

للحصول على محتوى عنوان 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.

من الصعب كتابة python2 و python3 و request رمز التبعيات للاستجابات لأنهم urlopen() وظائف و requests.get() وظيفة إرجاع أنواع مختلفة:

  • Python2. urllib.request.urlopen() إرجاع أ http.client.HTTPResponse
  • Python3. urllib.urlopen(url) إرجاع an. instance
  • طلب request.get(url) إرجاع أ requests.models.Response

نقطة رئيسية أجدها مفقودة في الإجابات أعلاه هي أن Urllib إرجاع كائن من النوع <class http.client.HTTPResponse> بينما requests عائدات <class 'requests.models.Response'>.

بسبب هذا، يمكن استخدام طريقة قراءة () مع urllib ولكن ليس مع requests.

ملاحظة : requests غني بالفعل مع العديد من الطرق التي لا تحتاج إليها أكثر read() ;>

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top