Вопрос по python, http – Python urllib2 с поддержкой активности

42

Как я могу сделать так, чтобы «сохранить в живых»? HTTP-запрос с использованием Python urllib2?

Ваш Ответ

7   ответов
33

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

Примечание: вы должны использовать версию urlgrabber3.9.0 или раньше, какKeepAlive модуль был удален в версии 3.9.1

Eстьпорт модуля keepalive для Python 3.

A quick port of it I made to python 3. Надеюсь, если кому-то поможет.
Спасибо Дэвид. Я обновил ответ соответствующим образом.
Спасибо @PiPeep - я добавил ссылку на ваш порт в своем ответе.
@speedplane, я думаю, что это так, но вместо того, чтобы использовать эту ссылку, вы должны использоватьgithub.com/wikier/keepalive, который более активно поддерживается. Я обновил сообщение. Редактирование должно быть видимым после его рецензирования.
Эта библиотека имеет некоторые проблемы с заголовками и не имеет поддержки cookie. Вы можете исправить это, скопировав из urllib2 и httplib, но я рекомендую попробовать другую библиотеку.
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
Исходный r и ваш ответ оба типа & lt; type & quot; & gt; и оба имеют одинаковые атрибуты. addinfourl говорит "класс", чтобы добавить методы info () и geturl () в открытый файл. & quot; но в оригинале уже есть info () и geturl (). Не удалось получить выгоду.
Спасибо, но было бы неплохо, если бы вы объяснили, что это исправило, вместо того бесполезного тегового комментария.
0

который поддерживает работу, хотя он не является потокобезопасным.

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
13

urllib3 который имеет следующие особенности:

Re-use the same socket connection for multiple requests (HTTPConnectionPool and HTTPSConnectionPool) (with optional client-side certificate verification). File posting (encode_multipart_formdata). Built-in redirection and retries (optional). Supports gzip and deflate decoding. Thread-safe and sanity-safe. Small and easy to understand codebase perfect for extending and building upon. For a more comprehensive solution, have a look at Requests.

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

Extremely simple HEAD, GET, POST, PUT, PATCH, DELETE Requests. Gevent support for Asyncronous Requests. Sessions with cookie persistience. Basic, Digest, and Custom Authentication support. Automatic form-encoding of dictionaries A simple dictionary interface for request/response cookies. Multipart file uploads. Automatc decoding of Unicode, gzip, and deflate responses. Full support for unicode URLs and domain names.
7

HTTPLIBHTTPConnection.

как включить keep-alive для HTTPConnection? Я пытался добавитьConnection: Keep-Alive для обоих запросов и заголовков ответов, ноhttplib по-прежнему подключается при каждом запросе
это сработало для меня ...
3

Запросы вместо. По умолчанию он будет работать правильно и использовать keep-alive, если это применимо.

Я работаю над проверкой подлинности NTLM, и библиотека запросов NTLM не работает для нее корректно. Однако библиотека urllib2 NTLM работает правильно. Поэтому этот вопрос был полезен для меня.
@JeffersonHudson, я не знал об этом. Возможно, вам повезет больше сgithub.com/requests/requests-ntlm
Я уже предложил Запросы в своем ответе, опубликованном за год до этого ...
@PiotrDobrogost, честно говоря, но я предлагаю сделать так, чтобы запросы были выбором по умолчанию.
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

Похожие вопросы