2010-03-05 18 views
71

Ok, así que necesito descargar algunas páginas web usando Python e hice una investigación rápida de mis opciones.¿Qué es mejor en Python: urllib2, PycURL o mecanizar?

incluye con Python:

urllib - me parece que debo utilizar urllib2 lugar. urllib no tiene soporte de cookies, solo HTTP/FTP/archivos locales (sin SSL)

urllib2 - cliente HTTP/FTP completo, admite la mayoría de las cosas necesarias, como cookies, no admite todos los verbos HTTP (solo GET y POST, no TRACE , etc.)

todas las funciones:

mechanize - puede usar/guardar las cookies de Firefox/IE, tomar acciones como sigue segundo enlace, mantenido de forma activa (0.2.5 publicado en marzo de 2011)

PycURL - Admite todo lo que curl hace (FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE y L DAP), las malas noticias: no actualizado desde el 9 de Sep, 2008 (7.19.0)

nuevas posibilidades:

urllib3 - Permite la conexión reutilización/puesta en común y el archivo de la publicación de

Desaprobado (también denominado utilizar urllib/urllib2 lugar):

httplib - HTTP/HTTPS (sin FTP)

httplib2 - HTTP/HTTPS (sin FTP)

La primera cosa que me sorprende es que urllib/urllib2/PycURL/mechanize son todas soluciones bastante maduras que funcionan bien. mecanize y PycURL se distribuyen con varias distribuciones de Linux (por ejemplo, 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: nota añadida en el apoyo verbo en urllib2

+3

¿Qué significa "mejor" significa? Mejor con respecto a qué? ¿Lo más rápido? Más grande? El mejor uso de las cookies? ¿Qué es lo que hay que hacer? –

+1

httplib no está "en desuso". Es un módulo de nivel inferior sobre el que se construye urllib2. puede usarlo directamente, pero es más fácil a través de urllib2 –

+1

Lo que Corey dijo, p. urllib3 es una capa encima de httplib. Además, httplib2 no está en desuso, de hecho es más nuevo que urllib2 y soluciona problemas como la reutilización de la conexión (lo mismo con urllib3). – Yang

Respuesta

34
  • urllib2 se encuentra en cada pitón instalar 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, además de obtener cualquier corrección o mejora aplicada a libcurl.
  • mechanize se utiliza para conducir persistentemente una conexión como lo haría un navegador.

No se trata de una cosa mejor que la otra, se trata de elegir la herramienta adecuada para el trabajo.

+0

Implementé httplib2 en mi aplicación python. ¿Es httplib2 compatible con NTLM ?. Si no es lo que tengo que hacer para la autenticación NTLM ?. Nota: me parece que httplib2 no admitirá NTLM. – TinTin

+2

@Ayyappan urllib3 tiene soporte NTLM a través del submódulo contrib: [urllib3/contrib/ntlmpool.py] (http://code.google.com/p/urllib3/source/browse/urllib3/contrib/ntlmpool.py?spec = svn308cfcafd2c78e4158397c0d29de667f3f387335 & r = 308cfcafd2c78e4158397c0d29de667f3f387335) – shazow

44

Creo que esta charla (en pycon 2009), tiene las respuestas para lo que estás buscando (Asheesh Laroia tiene mucha experiencia en la materia).Y señala los buenos y los malos de la mayor parte de su perfil

de la programación Pycon 2009:

¿Encuentra usted mismo se enfrentó a los sitios web que tienen los datos que necesita para extracto? ¿Sería su vida más simple si pudiera ingresar los datos en aplicaciones web, incluso los sintonizados para resistir la interacción de los bots?

vamos a discutir los fundamentos de la web raspado, y luego sumergirse en el detalles de los diferentes métodos y donde que son más adecuados.

Vas a dejar con una comprensión de cuándo aplicar herramientas diferentes, y aprender acerca de un "martillo pesado" para la pantalla raspado que he recogido en un proyecto de la Fundación Frontera Electrónica .

Atendees deben llevar un portátil, si posible, para tratar los ejemplos que discutir y opcionalmente tomar notas.

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

  • PyCon 2010: Scrape the Web: Strategies for programming websites that don't expected it

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

información interesante es atrapado 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 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.

+3

Ojalá pudiera aceptar esta respuesta. Gran presentación! – bigredbob

+0

Dos o tres oraciones que resumen las recomendaciones de la charla serían geniales para aquellos que no tienen el tiempo para escucharla. :-) –

+0

enlaces rotos ... – Sheena

2

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 cambie a mecanizar si necesita 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, StackOverflow) 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.

+1

solicitudes también es útil para almacenar cookies. Con las solicitudes, crea una nueva sesión y luego, en vez de requests.get(), llama a sessionName.get(). Las cookies se almacenarán en su sesión. Por ejemplo, una vez que haya iniciado sesión en un sitio web utilizando una sesión, podrá realizar otras solicitudes http utilizando su sesión como usuario conectado. –

2

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

+2

No es cierto. Ver [Python - solicitud HEAD con urllib2] (http://stackoverflow.com/questions/4421170/) –

+0

@Piotr Dobrogost. Aún muy cierto Hasta que pueda usar 'urllib2.urlopen' para generar una solicitud' HEAD', no se admite. Creando una subclase personalizada! = Soporte 'HEAD'. Podría crear una subclase 'int' que genere' HTML', pero nunca tendría sentido decir que python 'int' puede generar' HTML'. – mikerobi

+0

* Hasta que pueda usar urllib2.urlopen para generar una solicitud HEAD, no se admite. * ¿Qué le hace pensar eso? * Creando una subclase personalizada! = Soporte HEAD. * ¿Qué parte de * HEAD support * is urllib2 falta? –

1

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

Utilice el que tiene la cantidad mínima de características necesarias para una tarea en particular.

Su lista no incluye al menos 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.

+0

¡Agregado a la lista, gracias! – bigredbob

+0

solicitudes utiliza urllib3 bajo el capó. –

38

Python requests es también un buen candidato para HTTP. Tiene un bonito api en mi humilde opinión, un ejemplo de solicitud HTTP desde su documentación ofcial:

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

solicitudes internamente usa urlib3 –

1

echar un vistazo en Grab (http://grablib.org). Es una biblioteca de red que proporciona dos interfaces principales: 1) de agarre para la creación de solicitudes de red y el análisis recuperada datos 2) de la araña para la creación de raspadores sitio granel

Bajo el capó Grab utiliza pycurl y lxml pero es posible utilizar otros transportes de red (por ejemplo, solicitud de biblioteca). El transporte de solicitudes aún no se ha probado bien.

3

para "conseguir algunas páginas web", utilice solicitudes!

De :

módulo urllib2 estándar de Python proporciona la mayoría de los protocolos HTTP capacidades que necesita, pero la API se rompe completamente. Fue construido por un tiempo diferente - y una web diferente. Requiere una enorme cantidad de trabajo de (incluso reemplaza el método) para realizar las tareas más simples de .

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, ...}