Что лучше всего в 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, но можно использовать другие сетевые транспорты (например, библиотеку запросов). Запросы на транспорт еще недостаточно проверены.