where in our model of the python standard library should we add urllib and urlopen




ما هي الاختلافات بين urllib و urllib2 و module module؟ (6)

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


أعرف أن هذا قد تم قوله بالفعل ، ولكنني أوصي بشدة باستخدام حزمة بايثون للطلبات: requests

إذا كنت قد استخدمت لغات أخرى غير python ، فأنت على الأرجح تفكر في urllib و urllib2 سهل الاستخدام ، وليس كثيرًا من الشفرات ، وقادرًا جدًا ، هكذا اعتدت التفكير. لكن حزمة "الطلبات" مفيدة جدًا وقصيرة جدًا بحيث يجب على الجميع استخدامها.

أولاً ، إنه يدعم واجهة برمجة تطبيقات مريحة تمامًا ، وهو سهل مثل:

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

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

  • النطاقات الدولية وعناوين URL
  • الحفاظ على الحياة & اتصال تجمع
  • جلسات مع استمرار ملفات تعريف الارتباط
  • التحقق من SSL على المستعرض
  • الأساسية / دايجست المصادقة
  • الكوكيز المفتاح / قيمة أنيقة
  • تخفيف الضغط التلقائي
  • هيئات استجابة يونيكود
  • تحميلات ملفات متعددة
  • مهلات الاتصال
  • دعم .netrc
  • قائمة الاغراض
  • Python 2.6—3.4
  • ذات ألوان.

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

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

للحصول على محتوى عنوان 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) بإرجاع نسخة
  • Request request.get(url) بإرجاع requests.models.Response

يجب عليك استخدام urllib2 بشكل عام ، نظرًا لأن هذا يجعل الأمور أسهل قليلاً في بعض الأحيان عن طريق قبول كائنات طلب ، كما سيؤدي إلى رفع URLException بشأن أخطاء البروتوكول. مع Google App Engine ، لا يمكنك استخدام أي منهما. يجب عليك استخدام واجهة برمجة تطبيقات جلب URL التي توفرها Google في بيئة بايثون ذات وضع الحماية.


يوجد اختلاف كبير حول نقل Python2 إلى Python3. urllib2 غير موجود لـ python3 وطرقها المنقولة إلى urllib. لذا فأنت تستخدم ذلك بشدة وترغب في الانتقال إلى Python3 في المستقبل ، فكّر في استخدام urllib. ومع ذلك ، ستنفذ أداة 2to3 معظم العمل نيابة عنك.


يوفر 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 Engine ، يمكنك استخدام أيٍّ من httplib أو urllib أو urllib2 ، ولكن جميعها مجرد أغلفة لواجهة برمجة تطبيقات جلب URL من Google. وهذا يعني أنك لا تزال تخضع لنفس القيود مثل المنافذ والبروتوكولات وطول الاستجابة المسموح بها. يمكنك استخدام جوهر المكتبات كما تتوقع لاسترداد عناوين HTTP HTTP ، على الرغم من ذلك.





python-2.x