¿Qué es mejor en Python: urllib2, PycURL o mecanizar?

Ok, necesito descargar algunas páginas web usando Python e hice una investigación rápida de mis opciones.

Incluido con Python:

urllib – me parece que debería usar urllib2 en su lugar. urllib no admite cookies, solo HTTP / FTP / archivos locales (sin SSL)

urllib2 : complete el cliente HTTP / FTP, es compatible con la mayoría de los elementos necesarios, como las cookies, no es compatible con todos los verbos HTTP (solo GET y POST, sin TRACE, etc.)

Con todas las funciones:

mecanizar – puede usar / guardar cookies de Firefox / IE, realizar acciones como seguir el segundo enlace, mantenido activamente (0.2.5 publicado en marzo de 2011)

PycURL : admite todo lo que hace curl (FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE y LDAP), malas noticias: no actualizado desde el 9 de septiembre de 2008 (7.19.0)

Nuevas posibilidades:

urllib3 – admite la reutilización de conexiones / la agrupación y la publicación de archivos

En desuso (también conocido como urllib / urllib2 en su lugar):

httplib : solo HTTP / HTTPS (sin FTP)

httplib2 : solo HTTP / HTTPS (sin FTP)

Lo primero que me llama la atención es que urllib / urllib2 / PycURL / mechanize son soluciones bastante maduras que funcionan bien. mecanize y PycURL se envía con una serie de distribuciones de Linux (por ejemplo, Fedora 13) y BSD, por lo que la instalación no suele ser un problema (por lo que es bueno).

urllib2 se ve bien, pero me pregunto por qué PycURL y mecanize parecen muy populares, ¿hay algo que me esté perdiendo (es decir, si uso urllib2 me pintaré en una esquina en algún momento?). Realmente me gustaría recibir comentarios sobre las ventajas y desventajas de estas cosas para poder tomar la mejor decisión para mí.

Edición: nota agregada en soporte de verbos en urllib2

  • urllib2 se encuentra en cada instalación de Python en todas partes, por lo que es una buena base sobre la cual comenzar.
  • PycURL es útil para las personas que ya están acostumbradas a usar libcurl, expone más detalles de bajo nivel de HTTP, y además gana cualquier corrección o mejora aplicada a libcurl.
  • mechanize se utiliza para conducir de forma persistente una conexión como lo haría un navegador.

No se trata de que uno sea mejor que el otro, se trata de elegir la herramienta adecuada para el trabajo.

Creo que esta charla (en Pycon 2009) tiene las respuestas para lo que está buscando (Asheesh Laroia tiene mucha experiencia al respecto). Y él señala lo bueno y lo malo de la mayoría de tu listado

  • Raspe la Web: Estrategias para progtwigr sitios web que no lo esperan (Parte 1 de 3)
  • Raspe la Web: Estrategias para progtwigr sitios web que no lo esperan (Parte 2 de 3)
  • Raspe la Web: Estrategias para progtwigr sitios web que no lo esperan (Parte 3 de 3)

Desde el calendario de PYCON 2009:

¿Te encuentras frente a sitios web que tienen datos que necesitas extraer? ¿Sería más simple su vida si pudiera ingresar datos de manera programática en las aplicaciones web, incluso aquellos sintonizados para resistir la interacción de los robots?

Discutiremos los conceptos básicos del raspado web, y luego profundizaremos en los detalles de los diferentes métodos y dónde son más aplicables.

Se irá con un entendimiento de cuándo aplicar diferentes herramientas y aprenderá sobre un “martillo pesado” para el raspado de pantalla que recogí en un proyecto para la Electronic Frontier Foundation.

Los asistentes deben traer una computadora portátil, si es posible, para probar los ejemplos que discutimos y, opcionalmente, tomar notas.

Actualización: Asheesh Laroia ha actualizado su presentación para pycon 2010

  • PyCon 2010: Raspe la Web: Estrategias para progtwigr sitios web que no lo esperaban

     * 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. 

Actualización 2:

PyCon US 2012 – Web scraping: obtenga datos de forma confiable y eficiente de páginas que no lo esperan

La información interesante está atrapada en las páginas web y detrás de los formularios HTML. En este tutorial, aprenderá cómo analizar esas páginas y cuándo aplicar técnicas avanzadas que hacen que el raspado sea más rápido y más estable. Cubriremos la descarga paralela con Twisted, gevent, y otros; análisis de sitios detrás de SSL; conduciendo sitios de JavaScript con Selenium; y> evadir las técnicas comunes de anti-raspado.

Las solicitudes de Python también son un buen candidato para cosas HTTP. Tiene una API más agradable, un ejemplo de solicitud http de su documentación oficial:

 >>> r = requests.get('https://api.github.com', auth=('user', 'pass')) >>> r.status_code 204 >>> r.headers['content-type'] 'application/json' >>> r.content ... 

Para “obtener algunas páginas web”, utilice las solicitudes !

De http://docs.python-requests.org/en/latest/ :

El módulo urllib2 estándar de Python proporciona la mayoría de las capacidades HTTP que necesita, pero la API está completamente dañada. Fue construido para un tiempo diferente – y una web diferente. Requiere una enorme cantidad de trabajo (incluso anulaciones de métodos) para realizar las tareas más simples.

Las cosas no deberían ser así. No en 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, ...} 

No te preocupes por la “última actualización”. HTTP no ha cambiado mucho en los últimos años;)

urllib2 es el mejor (ya que está incorporado), luego cambie a mecanizar si necesita cookies de Firefox. mecanize se puede usar como un reemplazo directo de urllib2: tienen métodos similares, etc. El uso de cookies de Firefox significa que puede obtener elementos de los sitios (como, por ejemplo, StackOverflow) utilizando sus credenciales de inicio de sesión personales. Solo se responsable con tu número de solicitudes (o te bloquearán).

PycURL es para personas que necesitan todas las cosas de bajo nivel en libcurl. Yo probaría las otras bibliotecas primero.

Urllib2 solo admite HTTP GET y POST, puede haber soluciones, pero si su aplicación depende de otros verbos HTTP, es probable que prefiera un módulo diferente.

Cada biblioteca de python que habla HTTP tiene sus propias ventajas.

Use el que tenga la cantidad mínima de funciones necesarias para una tarea en particular.

Falta su lista al menos urllib3 : una biblioteca HTTP de terceros que puede reutilizar una conexión HTTP, lo que acelera enormemente el proceso de recuperación de múltiples URL del mismo sitio.

Echa un vistazo a Grab (http://grablib.org). Es una biblioteca de red que proporciona dos interfaces principales: 1) Agarrar para crear solicitudes de red y analizar datos recuperados 2) Spider para crear raspadores de sitios de forma masiva

Under the hood Grab usa pycurl y lxml pero es posible usar otros transportes de red (por ejemplo, biblioteca de solicitudes). Las solicitudes de transporte aún no están bien probadas.