Что лучше всего в Python: urllib2, PycURL или механизировать?
Хорошо, поэтому мне нужно загрузить некоторые веб-страницы с помощью Python и быстро изучить мои варианты.
Входит в состав Python:
urllib - мне кажется, что вместо этого я должен использовать urllib2. urllib не поддерживает файлы cookie, только HTTP/FTP/локальные файлы (без SSL)
urllib2 - полный HTTP/FTP-клиент, поддерживает наиболее необходимые вещи, такие как куки, не поддерживает все HTTP-глаголы (только GET и POST, нет TRACE и т.д.)
Полнофункциональный:
mechanize - может использовать/сохранять файлы cookie Firefox/IE, предпринимать действия, подобные следующему второму каналу, активно поддерживать (0.2.5 выпущено в Март 2011 г.)
PycURL - поддерживает все завитки (FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE и LDAP), плохая новость: не обновляется с 9 сентября 2008 г. (7.19.0)
Новые возможности:
urllib3 - поддерживает повторное использование/объединение каналов и публикацию файлов
Устаревший (вместо a.k.a. используйте urllib/urllib2):
httplib - только HTTP/HTTPS (без FTP)
httplib2 - только HTTP/HTTPS (без FTP)
Первое, что меня поразило, это то, что urllib/urllib2/PycURL/mechanize - все довольно зрелые решения, которые хорошо работают. mechanize и PycURL поставляются с рядом дистрибутивов Linux (например, Fedora 13) и BSD, поэтому установка обычно не является проблемой (так что это хорошо).
urllib2 выглядит неплохо, но мне интересно, почему PycURL и механизация кажутся очень популярными, есть ли что-то, что мне не хватает (т.е. если я использую urllib2, я нарисую себя в углу в какой-то момент?). Мне бы очень хотелось получить отзывы о плюсах и минусах этих вещей, чтобы я мог сделать для себя лучший выбор.
Изменить: добавлена заметка о поддержке глагола в urllib2
Ответы
Ответ 1
-
urllib2
находится в каждой установке Python повсюду, поэтому это хорошая основа для начала.
-
PycURL
полезен для людей, уже привыкших использовать libcurl, предоставляет более подробные сведения о HTTP-компонентах низкого уровня, а также получает любые исправления или улучшения, применяемые к libcurl.
-
mechanize
используется для постоянного подключения к сети, как браузер.
Это не вопрос того, что один лучше другого, это вопрос выбора подходящего инструмента для работы.
Ответ 2
Я думаю, что этот разговор (на pycon 2009), есть ответы на то, что вы ищете (Asheesh Laroia имеет большой опыт в этом вопросе). И он указывает на хорошее и плохое из большей части вашего списка.
Из расписания PYCON 2009:
Вы столкнулись с сайты, на которых есть данные, необходимые для извлечь? Будет ли ваша жизнь проще, если вы можете программно вводить данные в веб-приложения, даже те настроен на противодействие взаимодействию ботов?
Мы обсудим основы Интернета соскабливания, а затем погрузиться в сведения о различных методах и они наиболее применимы.
Вы уйдете с пониманием того, когда следует применять различные инструменты и "тяжелый молот" для скрипинга экрана что я выбрал проект для Electronic Frontier Foundation.
Участники должны принести ноутбук, если возможно, попробовать примеры, которые мы обсуждать и, при необходимости, делать заметки.
Update:
Asheesh Laroia обновила свою презентацию для pycon 2010
-
PyCon 2010: очистить веб:
Стратегии для программирования веб-сайтов
которые не ожидали этого
* My motto: "The website is the API."
* Choosing a parser: BeautifulSoup, lxml, HTMLParse, and html5lib.
* Extracting information, even in the face of bad HTML: Regular expressions, BeautifulSoup, SAX, and XPath.
* Automatic template reverse-engineering tools.
* Submitting to forms.
* Playing with XML-RPC
* DO NOT BECOME AN EVIL COMMENT SPAMMER.
* Countermeasures, and circumventing them:
o IP address limits
o Hidden form fields
o User-agent detection
o JavaScript
o CAPTCHAs
* Plenty of full source code to working examples:
o Submitting to forms for text-to-speech.
o Downloading music from web stores.
o Automating Firefox with Selenium RC to navigate a pure-JavaScript service.
* Q&A; and workshopping
* Use your power for good, not evil.
Обновление 2:
PyCon US 2012 - Веб-скребок: надежно и эффективно извлекать данные со страниц, которые этого не ожидают
Захватывающая информация попадает в веб-страницы и за HTML-форматы. В этом уроке вы узнаете, как анализировать эти страницы и применять современные методы, которые ускоряют и стабилизируют. Мы рассмотрим параллельную загрузку с помощью Twisted, gevent, > и других; анализ сайтов за SSL; вождение сайтов JavaScript-y с селеном; и > уклонение от обычных методов борьбы с скреммированием.
Ответ 3
Python requests также является хорошим кандидатом на HTTP-материал. Он имеет более приятный api IMHO, пример http-запроса из своей официальной документации:
>>> r = requests.get('https://api.github.com', auth=('user', 'pass'))
>>> r.status_code
204
>>> r.headers['content-type']
'application/json'
>>> r.content
...
Ответ 4
Чтобы "получить некоторые веб-страницы", используйте запросы!
Из http://docs.python-requests.org/en/latest/:
Стандартный модуль urllib2 Pythons обеспечивает большую часть HTTP которые вам нужны, но API полностью нарушен. Он был построен для другого времени - и другой сети. Это требует огромного объем работы (даже переопределение метода) для выполнения простейшего из задачи.
Не должно быть так. Не в Python.
>>> r = requests.get('https://api.github.com/user', auth=('user', 'pass'))
>>> r.status_code
200
>>> r.headers['content-type']
'application/json; charset=utf8'
>>> r.encoding
'utf-8'
>>> r.text
u'{"type":"User"...'
>>> r.json()
{u'private_gists': 419, u'total_private_repos': 77, ...}
Ответ 5
Не беспокойтесь о "последнем обновлении". HTTP не сильно изменился за последние несколько лет;)
urllib2 лучше (как он встроен), а затем переключиться на механизацию, если вам нужны файлы cookie из Firefox. Механизм может использоваться в качестве замены для urllib2 - они имеют похожие методы и т.д. Использование файлов cookie Firefox означает, что вы можете получать вещи с сайтов (например, StackOverflow), используя ваши персональные учетные данные. Просто отвечайте на свое количество запросов (или вы будете заблокированы).
PycURL предназначен для людей, которым нужен любой материал низкого уровня в libcurl. Сначала я попробую другие библиотеки.
Ответ 6
Urllib2 поддерживает только HTTP GET и POST, могут быть обходные пути, но если ваше приложение зависит от других HTTP-глаголов, вы, вероятно, предпочтете другой модуль.
Ответ 7
Каждая библиотека python, которая говорит HTTP, имеет свои преимущества.
Используйте ту, которая имеет минимальное количество функций, необходимых для конкретной задачи.
В вашем списке отсутствует urllib3 - классная сторонняя HTTP-библиотека, которая может повторно использовать HTTP-соединение, тем самым значительно ускоряя процесс извлечения нескольких URL-адресов с одного и того же сайта.
Ответ 8
Взгляните на Grab (http://grablib.org). Это сетевая библиотека, которая предоставляет два основных интерфейса:
1) Захват для создания сетевых запросов и анализа полученных данных
2) Паук для создания скребок для массового сайта
Под капотом Grab использует pycurl и lxml, но можно использовать другие сетевые транспорты (например, библиотеку запросов). Запросы на транспорт еще недостаточно проверены.