Как оказалось в питоне нет однозначно подходящего варианта. Всего-то хочется удобно дергать какие-то 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
Не уверен что поддерживаются все хотелки, но, тем не менее, - посмотрите на mechanize
Оставлен 13 Март 2010 в 22:41 ¶Как показывает практика, для питона ничего нет. Мы в своё время писали свою обертку (~200K кода) над httplib для решения повседневных задач.
Оставлен 13 Март 2010 в 23:35 ¶Контрибьютить в httplib2, я так думаю...
Оставлен 14 Март 2010 в 00:34 ¶Если вы пишете crawler, то обязательно обратите внимание на библиотеку Scrapy (scrapy.org), которая построена на базе Twisted.
В этой программе реализована асинхронность, pipelinening, "возможность добавить в конвеер запроса хуки", работа с куками, кеширование, возможность задать таймаут и пр.
Вместе с тем, реализация протокола HTTP 1.1 неполная, например, отсутствуют persistent connections.
Оставлен 14 Март 2010 в 02:01 ¶Я в начале написал, что инструмент в основном нужен для дерганья API.
Scrapy я когда-то изучал применительно к другому проекту. Наличие зависимостей от twisted и zope насторожило. Потом оно просто не завелось, и наши пути разошлись.
Оставлен 14 Март 2010 в 02:10 ¶mechanize, twill можно посмотреть
Оставлен 14 Март 2010 в 14:17 ¶mechanize, scrape
Оставлен 16 Март 2010 в 13:38 ¶Ещё можно на urllib3 посмотреть. Забавно. Сам пользуюсь mechanize, с небольшим количеством обвязок.
Оставлен 01 Апрель 2010 в 21:45 ¶Оставьте комментарий