El cajón de Drazul

El lugar donde duerme el pequeño dragón

Automatizando Las Descargas

Para automatizar las descargas lo más cómodo es hacerlo mediante urllib2 o curl pero a veces no se puede hacer de esa forma porque, como el caso que voy a explicar, la descarga empieza después de rellenar un formulario o al resolver un captcha.

Una posibilidad es utilizar Selenium, pero no tiene soporte para la automatización de las descargas, por lo que la biblioteca a utilizar en este caso es Mechanize, que emula un navegador web y no depende de navegadores externos como Selenium, pero por contra es más difícil de utilizar ya que no tiene soporte para XPATH.

Este ejemplo parte del problema del captcha, en el que teníamos que capturar la descarga al enviar el formulario con la solución del captcha.

Con Mechanize lo primero que debemos hacer es definir los headers del navegador que emulamos, utilizando los de un navegador de usuario para que la página no nos tome por un robot y nos impida realizar nuestras tareas.

1
2
3
4
5
6
7
8
9
10
import mechanize
import shutil

br = mechanize.Browser()
br.addheaders = [('User-agent', "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; \
           Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; \
           Media Center PC 6.0; InfoPath.3; AskTB5.6)")]
br.set_handle_robots(False)

br.open(url, timeout=30)

A continuación seleccionamos el primer formulario de la página y, en el campo answer escribimos lo que corresponda.

1
2
br.select_form(nr=0)
br.form["answer"] = result_captcha

El campo answer no es genérico, es como está definido en la página. Concretamente el código del formulario es el siguiente:

1
2
<input type="text" name="answer">
<input type="submit" value="Descarga PDF" style="border: 1px solid rgb(0, 0, 0);"/>

Con shutil capturamos el evento generado al enviar el formulario.

1
2
with open('downloaded', 'wb') as f:
  shutil.copyfileobj(br.submit(), f)

Esto es un ejemplo sencillo en que no se comprueba, por ejemplo, que el resultado de enviar el formulario nos devuelva un error, para eso podríamos mirar, por ejemplo, el tamaño del archivo descargado.

Comments