Что лучше в Python: urllib2, PycURL или mechanize?


хорошо, поэтому мне нужно загрузить некоторые веб-страницы с помощью Python и быстро изучить мои варианты.

в комплекте с Python:

urllib - мне кажется, что я должен использовать urllib2 вместо этого. urllib не поддерживает файлы cookie, только HTTP / FTP / локальные файлы (без SSL)

urllib2 - полный HTTP / FTP-клиент, поддерживает большинство необходимых вещей, таких как куки, не поддерживает все HTTP-глаголы (только GET и POST, без трассировки, так далее.)

полнофункциональный:

механизировать - можно использовать/сохранять файлы cookie Firefox / IE, совершать такие действия, как переход по второй ссылке, активно поддерживаемой (0.2.5 выпущен в марте 2011 года)

PycURL - поддерживает все, что делает curl (FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE и LDAP), плохие новости: не обновляется с сентября 9, 2008 (7.19.0)

новые возможности:

urllib3 - поддерживает связь повторное использование / объединение и размещение файлов

устарело (вместо этого используйте urllib/urllib2):

httplib - только HTTP / HTTPS (без FTP)

httplib2 - только HTTP / HTTPS (без FTP)

первое, что меня поражает, это то, что urllib/urllib2/PycURL/mechanize-это все довольно зрелые решения, которые хорошо работают. mechanize и pycurl ship с несколькими дистрибутивами Linux (например, Fedora 13) и BSD, поэтому установка не является проблемой как правило (так что это хорошо).

urllib2 выглядит хорошо, но мне интересно, почему PycURL и mechanize кажутся очень популярными, есть ли что-то, чего мне не хватает (т. е. если я использую urllib2, я буду рисовать себя в углу в какой-то момент?). Мне бы очень хотелось получить обратную связь о плюсах / минусах этих вещей, чтобы я мог сделать лучший выбор для себя.

Edit: добавлена заметка о поддержке глаголов в urllib2

8 71

8 ответов:

  • urllib2 находится в каждом Python установить везде, так что это хорошая база, на которой можно начать.
  • PycURL полезно для людей, уже привыкших к использованию libcurl, предоставляет больше низкоуровневых деталей HTTP, а также получает любые исправления или улучшения, применяемые к libcurl.
  • mechanize используется для постоянного управления соединением так же, как и браузер.

дело не в том, что один лучше другого, а в том, что выбор подходящего инструмента для выполнения задания.

Я думаю, что этот разговор (в pycon 2009), имеет ответы на то, что вы ищете (Asheesh Laroia имеет большой опыт по этому вопросу). И он указывает на хорошее и плохое из всего вашего списка

из расписания PYCON 2009:

вы столкнулись с веб-сайты, на которых есть необходимые данные выписка? Будет ли ваша жизнь проще, если вы можете программно вводить данные в веб-приложения, даже те настроенный противостоять взаимодействию ботов?

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

вы уйдете с пониманием того, когда обращаться различные инструменты, и узнать о "тяжелый молоток" для очистки экрана что я подобрал на проекте для Electronic Frontier Foundation.

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

обновление: Ашиш Ларойя обновился его презентация для 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 - web scraping: надежно и эффективно извлекать данные из страниц, которые не ожидают его

захватывающая информация попадает в ловушку на веб-страницах и за HTML-формы. В этом уроке, вы будете научиться анализировать эти страницы и когда применять передовые методы, которые делают >выскабливание быстрее и стабильнее. Мы рассмотрим параллельную загрузку с помощью Twisted, gevent, >и других; анализ сайтов за SSL; вождение сайтов JavaScript-y с селеном; и >уклонение от общих методов защиты от царапин.

Python запросы также является хорошим кандидатом для 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
...

чтобы "получить некоторые веб-страницы", Используйте запросы!

от http://docs.python-requests.org/en/latest/ :

стандартный модуль urllib2 Python обеспечивает большую часть 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, ...}

Не беспокойтесь о "последнем обновлении". HTTP не сильно изменился за последние несколько лет ;)

urllib2 лучше всего (так как он встроен), а затем переключитесь на механизацию, если вам нужны куки из Firefox. mechanize может использоваться в качестве замены для urllib2-у них есть аналогичные методы и т. д. Использование Firefox cookies означает, что вы можете получить вещи с сайтов (например, StackOverflow), используя свои личные учетные данные для входа. Просто будьте ответственны с вашим количеством запросов (или вы получите блокированный.)

PycURL предназначен для людей, которым нужны все низкоуровневые вещи в libcurl. Я бы сначала попробовал другие библиотеки.

Urllib2 поддерживает только HTTP GET и POST, могут быть обходные пути, но если ваше приложение зависит от других команд HTTP, вы, вероятно, предпочтете другой модуль.

каждая библиотека python, которая говорит HTTP, имеет свои преимущества.

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

ваш список отсутствует по крайней мере urllib3 - классная сторонняя HTTP-библиотека, которая может повторно использовать HTTP-соединение, что значительно ускоряет процесс получения нескольких URL-адресов с одного и того же сайта.

взгляните на Grab (http://grablib.org). это сетевая библиотека, которая предоставляет два основных интерфейса: 1) захват для создания сетевых запросов и анализа полученных данных 2) Паук для создания массовых скребков сайта

под капотом Grab использует pycurl и lxml, но можно использовать другие сетевые транспорты (например, библиотека запросов). Запросы транспорта еще не хорошо протестированы.