سؤال

كيف يمكنني تقديم طلب HTTP "البقاء على قيد الحياة" باستخدام Python's urllib2؟

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

المحلول

واستخدم urlgrabber المكتبة. وهذا يشمل معالج HTTP لurllib2 التي تدعم HTTP 1.1 و keepalive:

>>> 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')

ملحوظة: يجب عليك استخدام urlgrabber نسخة 3.9.0 أو في وقت سابق، كما keepalive وحدة تمت إزالة في الإصدار 3.9.1

وهناك ميناء وحدة keepalive لبيثون 3.

نصائح أخرى

يحاول urllib3 الذي لديه الميزات التالية:

  • أعد استخدام نفس اتصال المقبس لطلبات متعددة (HTTPConnectionPool وHTTPSConnectionPool) (مع التحقق الاختياري من الشهادة من جانب العميل).
  • نشر الملف (encode_multipart_formdata).
  • إعادة التوجيه وإعادة المحاولة المضمنة (اختياري).
  • يدعم فك تشفير gzip وانكماش.
  • خيط آمن وعقلاني.
  • قاعدة بيانات صغيرة وسهلة الفهم ومثالية للتوسيع والبناء عليها.للحصول على حل أكثر شمولاً، قم بإلقاء نظرة على الطلبات.

أو حل أكثر شمولاً - الطلبات - الذي يدعم البقاء على قيد الحياة من إصدار 0.8.0 (باستخدام urllib3 داخليًا) ويحتوي على ما يلي سمات:

  • طلبات الرأس، والحصول، والنشر، والوضع، والتصحيح، والحذف بسيطة للغاية.
  • دعم Gevent للطلبات غير المتزامنة.
  • جلسات مع ثبات ملفات تعريف الارتباط.
  • دعم المصادقة الأساسية والملخصة والمخصصة.
  • ترميز النماذج التلقائي للقواميس
  • واجهة قاموس بسيطة لملفات تعريف الارتباط للطلب/الاستجابة.
  • تحميل ملفات متعددة الأجزاء.
  • فك تشفير تلقائي لاستجابات Unicode وgzip وdeflate.
  • الدعم الكامل لعناوين URL وأسماء النطاقات Unicode.

وأو تحقق من httplib الصورة HTTPConnection.

ولسوء الحظ تم إزالة keepalive.py من urlgrabber في 25 سبتمبر 2009 بواسطة التغيير التالي بعد تم تغيير urlgrabber تعتمد على pycurl (التي تدعم المحافظة على الحياة):

http://yum.baseurl.org/ ؟ gitweb ع = urlgrabber.git؛ و= ارتكاب؛ ح = f964aa8bdc52b29a2c137a917c72eecd4c4dda94

ومع ذلك، لا يزال بإمكانك الحصول على آخر نسخة من keepalive.py هنا:

HTTP: //yum.baseurl.org/gitweb؟p=urlgrabber.git؛a=blob_plain؛f=urlgrabber/keepalive.py؛hb=a531cb19eb162ad7e0b62039d19259341f37f3a6

لاحظ أن 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

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

وفيما يلي urlopen مشابهة الى حد ما () أن يفعل المحافظة على الحياة، على الرغم من انها ليست threadsafe.

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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top