ejemplos - ¿Qué es mejor en Python: urllib2, PycURL o mecanizar?
urllib2.urlopen timeout (8)
Cada biblioteca de Python que habla HTTP tiene sus propias ventajas.
Use el que tiene la cantidad mínima de características necesarias para una tarea en particular.
Falta al menos su lista urllib3 , una biblioteca HTTP de terceros que puede reutilizar una conexión HTTP, agilizando enormemente el proceso de recuperación de varias URL desde el mismo sitio.
Ok, entonces 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 tiene soporte para cookies, solo HTTP / FTP / archivos locales (sin SSL)
urllib2 : cliente HTTP / FTP completo, admite la mayoría de las cosas necesarias, como las cookies, no es compatible con todos los verbos HTTP (solo GET y POST, sin TRACE, etc.)
Completo presentado:
mechanize - puede usar / guardar las cookies de Firefox / IE, tomar acciones como seguir el segundo enlace, mantenido activamente (0.2.5 lanzado en marzo de 2011)
PycURL : admite todo lo que curl (FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE y LDAP), malas noticias: no se actualiza desde el 9 de septiembre de 2008 (7.19.0)
Nuevas posibilidades:
urllib3 : admite la reutilización / agrupación de conexiones y la publicación de archivos
Obsoleto (también conocido como urllib / urllib2):
httplib : solo HTTP / HTTPS (sin FTP)
httplib2 - HTTP / HTTPS solamente (sin FTP)
Lo primero que me sorprende es que urllib / urllib2 / PycURL / mechanize son soluciones bastante maduras que funcionan bien. mecanize y PycURL vienen con varias distribuciones de Linux (p. ej., Fedora 13) y BSD, por lo que la instalación no suele ser un problema (así que eso es bueno).
urllib2 se ve bien, pero me pregunto por qué PycURL y mecanizar ambos parecen muy populares, ¿hay algo que me falta (es decir, si uso urllib2 me pintaré en una esquina en algún momento?). Realmente me gustaría obtener algunos comentarios sobre los pros / contras de estas cosas para poder hacer la mejor elección para mí.
Editar: se agregó una nota sobre el soporte verbal en urllib2
Creo que esta charla (en pycon 2009) tiene las respuestas para lo que estás buscando (Asheesh Laroia tiene mucha experiencia en el tema). Y él señala lo bueno y lo malo de la mayoría de tu lista
- Raspe la red: estrategias para programar sitios web que no lo esperan (Parte 1 de 3)
- Raspe la red: estrategias para programar sitios web que no lo esperan (Parte 2 de 3)
- Raspe la Web: estrategias para programar sitios web que no lo esperan (Parte 3 de 3)
Del programa PYCON 2009:
¿Te encuentras frente a sitios web que tienen datos que necesitas extraer? ¿Sería más simple tu vida si pudieras ingresar datos mediante programación en aplicaciones web, incluso aquellas adaptadas para resistir la interacción de los bots?
Analizaremos los aspectos básicos del raspado de la web, y luego profundizaremos en los detalles de los diferentes métodos y dónde son más aplicables.
Se irá con la comprensión de cuándo aplicar diferentes herramientas, y aprenderá sobre un "martillo pesado" para raspar pantallas que recogí en un proyecto para 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: Scrape the Web: estrategias para programar 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:
La información emocionante está atrapada en páginas web y detrás de formularios HTML. En este tutorial,> aprenderá cómo analizar esas páginas y cuándo aplicar técnicas avanzadas que hagan> raspado más rápido y más estable. Cubriremos descargas paralelas con Twisted, gevent,> y otros; analizar sitios detrás de SSL; conducir sitios JavaScript-y con Selenium; y> evadir las técnicas comunes contra raspado.
Eche un vistazo en Grab (http://grablib.org). Es una biblioteca de red que proporciona dos interfaces principales: 1) Capturar para crear solicitudes de red y analizar datos recuperados 2) Spider para crear raspadores de sitio masivo
Debajo del capó Grab usa pycurl y lxml, pero es posible usar otros transportes de red (por ejemplo, solicitud de biblioteca). El transporte de solicitudes aún no se ha probado bien.
Las requests Python también son un buen candidato para material HTTP. Tiene una APO más agradable en mi humilde opinión, 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
...
No te preocupes por la "última actualización". HTTP no ha cambiado mucho en los últimos años;)
urllib2 es mejor (como está incorporado), luego cambia a mecanizar si necesitas cookies de Firefox. mechanize puede usarse como un reemplazo directo para urllib2 - tienen métodos similares, etc. Usar cookies de Firefox significa que puede obtener cosas de sitios (como, por ejemplo, ) usando sus credenciales personales de inicio de sesión. Simplemente sé responsable con tu número de solicitudes (o serás bloqueado).
PycURL es para las personas que necesitan todas las cosas de bajo nivel en libcurl. Primero probaría las otras bibliotecas.
Para "obtener algunas páginas web", ¡usa 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 rota. Fue construido para un tiempo diferente, y una web diferente. Requiere una enorme cantidad de trabajo (incluso anula el método) para realizar las tareas más sencillas.
Las cosas no deberían ser de esta manera. 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, ...}
Urllib2 solo es compatible con HTTP GET y POST, puede haber soluciones temporales, pero si su aplicación depende de otros verbos HTTP, probablemente prefiera un módulo diferente.
-
urllib2
se encuentra en todas las instalaciones 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 obtiene cualquier corrección o mejora aplicada a libcurl. -
mechanize
se utiliza para conducir de manera persistente una conexión como lo haría un navegador.
No se trata de que una sea mejor que la otra, sino que se trata de elegir la herramienta adecuada para el trabajo.