Уже пару лет я периодически пользуюсь пакетом pycurl для того, чтобы чего-нить распарсить из сети. Библиотека pycurl хороша тем, что она предоставляет в меру простой интерфейс к мощному функционалу и, что важно для меня, позволяет работать с любыми типами прокси: http, https, socks4, socks5. Стандартная библиотека urllib2 не предоставляет возможности работать с socks проксями. Я пробовал искать решения — не нашёл. Самому написать некую обёртку urllib2 & socks у меня мозгов не хватает. Вот тут pycurl и выручает :-)
Так вот, интерфейс у него простой… даже слишком. Поэтому я довольно быстро отказался от родного pycurl API и набросал свой велосипедик. Его код показывать людям нельзя т.к. писал я его на заре изучения питона и, соответственно, он страшненький. Недавно я начал переписывать обёртку с нуля. За проектом можно следить по адресу: http://bitbucket.org/lorien/grab/ Проект назван grab т.к. кроме очевидной задачи сделать более удобный API к pycurl, я преследую цель написать инструмент облегчающий парсинг, грабинг, скрэйпинг вебсайтов.
Рассмотрим пример работы с pycurl с официального сайта http://pycurl.sourceforge.net/doc/curlobject.html
import pycurl
c = pycurl.Curl()
c.setopt(pycurl.URL, "http://www.python.org/")
import StringIO
b = StringIO.StringIO()
c.setopt(pycurl.WRITEFUNCTION, b.write)
c.setopt(pycurl.FOLLOWLOCATION, 1)
c.setopt(pycurl.MAXREDIRS, 5)
c.perform()
print b.getvalue()
C помощью библиотеки grab пример преобразится в:
from grab import Grab
grab = Grab()
grab.setup(url='http://python.org/')
print grab.request()['body']
На самом деле для одиночных запросов у меня есть shortcut, который позволяет:
from grab import request
print request('http://python.org/')['body']
Естественно, такие простые запросы можно и нужно делать через urllib/urllib2. Выгода использования pycurl проявляется, когда нужно реализовывать сложные запросы, типа работы с socks проксями.