Чем ходить по http?

Как оказалось в питоне нет однозначно подходящего варианта. Всего-то хочется удобно дергать какие-то API и иногда стягивать файлы.

Есть несколько библиотек, многие из которых друг друга используют и заимствуют функционал. Но вот чего-то одного, удовлетворяющего достаточно простым (ведь так?) требованиями, нет.

Требования же эти такие:

  • поддержка http/https
  • возможность использовать любые http verb
  • возможность отослать body запроса с произвольным Content-Type
  • поддержание коннекта между запросами (keep-alive)
  • работа с куками
  • стандартная аутентификация
  • file-like интерфейс к body ответа
  • кеширование
  • conditional get
  • обработка низкоуровневых ошибок и оборачивание их в какой-то дженериковый HTTPError и наследников.
  • возможность добавить в конвейер запроса хуки, чтобы можно было какие-то действия производить с отсылаемыми данными, либо результатом.
  • возможность задать таймаут хотя бы для соединения

Ну и пара экзотических хотелок:

  • поддержка http pipelinening
  • возможность делать запросы асинхронно

Ведь не невозможного хочется. Но что мы имеем.

httplib

По сути основа всех питонячих "ходилок" по http. Находится в стандартной библиотеке. Главная особенность -- позволяет присоединиться к http серверу и делать запроса к его урлам в рамках одного соединения.

connection = httplib.HTTPConnection('example.com')
result = connection.request('GET', '/foo')
# ...
result = connection.request('GET', '/bar')
# ...
connection.close()

Возвращает file-like объект и с недавних пор позволяет задать таймаут для соединения. Тут фичи заканчиваются и мы остаемся наедине с низкоуровневым интерфейсом.

urllib2

Стандартная высокоуровневая обертка над httplib представляющая из себя конвейер хендлеров, в которых можно организовать пре- и пост-процессинг запроса и ответа. Хендлеры также позволяют ходить не только на http ресурсы, но и на ftp, и в файловую систему. Хендлерами так же делается обработка кук и кеширование.

Поскольку это обертка над HTTPConnection, то ответ получается тоже в file-like объекте. Но создать keep-alive соединение не дадут и задать таймаут стало возможно только недавно.

httplib2

Сторонняя разработка претендующая на универсальность и поддержку уникальных фич. Поддерживает кеширование, поддержку авторизации и обработку редиректов. Умеет держать коннект. Основная проблема -- пытается загнать весь ответ в строку и вернуть её. Не имеет стандартных способов внедрения middleware.

pycurl

Поскольку этот питонячий биндинг предоставляет практически голый интерфейс, то главная проблема -- API ужасен и приходится какие-то свои враперы писать на каждом углу. Хотя потенциально умеет всё.

***

В сухом остатке факт -- инструментов казалось бы много, но ни один не удовлетворяет всем требованиям. Идеальным решением было какое-то объединение всех перечисленных библиотек в одну. Либо на базе httplib/pycurl реализация высокоуровневой обертки, которая соответствовала бы требованиям. Но таких нет.

Кто виноват и что делать?

Комментарии 8

  1. krig написал:

    Не уверен что поддерживаются все хотелки, но, тем не менее, - посмотрите на mechanize

    Оставлен 13 Март 2010 в 22:41
  2. roinet.livejournal.com написал:

    Как показывает практика, для питона ничего нет. Мы в своё время писали свою обертку (~200K кода) над httplib для решения повседневных задач.

    Оставлен 13 Март 2010 в 23:35
  3. softwaremaniacs.org/about/ написал:

    и что делать?

    Контрибьютить в httplib2, я так думаю...

    Оставлен 14 Март 2010 в 00:34
  4. http://aqmescitli.myopenid.com/ написал:

    Если вы пишете crawler, то обязательно обратите внимание на библиотеку Scrapy (scrapy.org), которая построена на базе Twisted.

    В этой программе реализована асинхронность, pipelinening, "возможность добавить в конвеер запроса хуки", работа с куками, кеширование, возможность задать таймаут и пр.

    Вместе с тем, реализация протокола HTTP 1.1 неполная, например, отсутствуют persistent connections.

    Оставлен 14 Март 2010 в 02:01
  5. Александр Кошелев написал:

    Я в начале написал, что инструмент в основном нужен для дерганья API.

    Scrapy я когда-то изучал применительно к другому проекту. Наличие зависимостей от twisted и zope насторожило. Потом оно просто не завелось, и наши пути разошлись.

    Оставлен 14 Март 2010 в 02:10
  6. Andrey Popp написал:

    mechanize, twill можно посмотреть

    Оставлен 14 Март 2010 в 14:17
  7. buriy.com написал:

    mechanize, scrape

    Оставлен 16 Март 2010 в 13:38
  8. http://users.livejournal.com/_nik_/ написал:

    Ещё можно на urllib3 посмотреть. Забавно. Сам пользуюсь mechanize, с небольшим количеством обвязок.

    Оставлен 01 Апрель 2010 в 21:45