Python urllib2 с продолжением

Как я могу выполнить HTTP-запрос "keep alive", используя Python urllib2?

Ответ 1

Используйте библиотеку 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 для Python 3.

Ответ 2

Попробуйте urllib3, который имеет следующие функции:

  • Повторно используйте одно соединение сокета для нескольких запросов (HTTPConnectionPool и HTTPSConnectionPool) (с дополнительной проверкой сертификата на стороне клиента).
  • Публикация файла (encode_multipart_formdata).
  • Встроенное перенаправление и повторные попытки (необязательно).
  • Поддерживает декодирование gzip и deflate.
  • Безопасность потолка и безопасность.
  • Маленькая и понятная кодовая база, идеально подходящая для расширения и построения. Чтобы получить более полное решение, ознакомьтесь с запросами.

или гораздо более комплексное решение - Requests - который поддерживает keep-alive из версия 0.8.0 (с использованием urllib3 внутри) и имеет следующие функции:

  • Чрезвычайно простые запросы HEAD, GET, POST, PUT, PATCH, DELETE.
  • Поддержка Gentent для запросов Asyncronous.
  • Сессии с сохранением cookie.
  • Поддержка Basic, Digest и Custom Authentication.
  • Автоматическое форматирование словарей
  • Простой интерфейс словаря для куки запросов/ответов.
  • Загрузка многостраничных файлов.
  • Автоматическое декодирование ответов Unicode, gzip и deflate.
  • Полная поддержка URL-адресов юникода и доменных имен.

Ответ 3

Или зайдите в httplib HTTPConnection.

Ответ 4

Обратите внимание, что urlgrabber не работает полностью с python 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

Ответ 5

К сожалению, keepalive.py был удален из urlgrabber 25 сентября 2009 года следующим изменением после того, как urlgrabber был изменен в зависимости от pycurl (который поддерживает keep-alive):

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

Однако вы все равно можете получить последнюю версию keepalive.py здесь:

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

Ответ 6

Пожалуйста, избегайте коллективной боли и используйте Requests. По умолчанию он пойдет правильно и будет использовать keep-alive, если это применимо.

Ответ 7

Вот несколько схожий urlopen(), который продолжает поддерживать, хотя он не является потокобезопасным.

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