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