Web scraping con Python y Raspberry Pi

  • Google Plus
  • Facebook
  • Twitter
  • Email
  • RSS
  • Add to favorites

¿Qué es el web scraping?

El web scraping es, básicamente, un conjunto de técnicas cuyo fin es obtener de manera más o menos automática datos de las páginas web. Por ejemplo, sería web scraping recopilar los horarios de salida de los trenes de una página de una compañía de ferrocarril.

Hace unas días me tuve que enfrentar en mi trabajo (del que prefiero no dar detalles exactos)  a una tarea un poco tediosa. Se trataba de contrastar una serie de datos de los que yo disponía contra una base de datos a la cual se pueden efectuar consultas individuales a través de internet. Fue un fastidio, porque si hubiera dispuesto del conjunto de datos a contrastar, hubiera tenido el resultado final en lo que se tarda en crear y ejecutar la consulta SQL, es decir, algunos segundos. Como tuve que hacer cerca de 300 consultas a la web (encima, en un día que no andaba muy fino el servidor) y contrastarlas a mano… me llevó casi seis horas. El web scraping parecía una solución.

De manera que me dije que con toda probabilidad sería posible automatizarlo con un script Python, o al menos, automatizar la recopilación de datos con el script, lo que como ventaja adicional resulta en tener los datos y apara siempre en mi poder. Es decir, hacer un poquito de web scraping.

El script de Python

El script es bastante sencillo, y el código que os pongo está bastante bien comentado, de manera que no creo que sea necesario daros más explicaciones. Ahora bien, el uso de urllib2 se puede complicar bastante, el uso que yo le doy es simple. Quizá lo único que tenéis que tener en cuenta es que es preciso, según el caso, proporcionarle un user-agent adecuado, pues hay muchos servidores que rechazan ciertos tipos de user-agent, precisamente para evitar el web scraping.

Ahora sólo queda correr el script y esperar.

¿Y la Raspberry Pi, para qué?

Bueno, llevo muchos días pensando qué utilidades darle a mi Raspberry Pi, y esta me parece una muy interesante, pues una de las grandes virtudes de la Raspberry es su reducidísimo consumo. No es lo mismo hacer web scraping con un ordenador portátil o uno de sobremesa, consumiendo entre 100 y 300 W, que con un cacharrito silencioso que consume  apenas 3 watios y medio, ¿no? podríamos llamarlo web scraping de baja huella de carbono, ecológico, o algo así.

Lo único que hacer es copiar nuestro script en la Raspberry Pi, por ejemplo con scp tal y como os comentaba en otro artículo y ejecutarlo y dejarlo tranquilito haciendo el web scraping por nosotros

Bueno, espero que os haya gustado. ¡¡Espero vuestros comentarios!!

¡¡Compártelo y disfruta!!

  • Google Plus
  • Facebook
  • Twitter
  • Email
  • RSS
  • Add to favorites

Ictiometro digital de bajo coste con Arduino y Python (2)

  • Google Plus
  • Facebook
  • Twitter
  • Email
  • RSS
  • Add to favorites

En el anterior capítulo de esta saga os describía cómo comenzaron a surgir algunas ideas para construir un ictiometro digital y cómo decidí comenzar la andadura explorando las posibilidades de los ADC (Conversores analógico-digital). EN este os hablaré de cómo y porqué deseché esa idea y cómo Arduino entró en mi vida

El problema de los ADC y el ictiometro digital

Un conversor analógico digital convierte una señal analógica en otra digita. Para os hagáis una idea de cómo funciona voy a intentar explicarlo: Supongamos que queremos medir la fuerza con que lanzamos una pelota hacia arriba. Cogemos unos tableros y unos tornillos y construimos una estantería con muchas repisas y muy alta, y lanzamos la pelota hacia arriba y vemos en qué repisa ha quedado la pelota, lo que nos dará una idea de la fuerza con la que la hemos lanzado. Naturalmente, la estantería debe ser lo suficientemente alta como para poder registrar cualquier lanzamiento y que ninguno  se vaya al patio del vecino.

Ahora bien, una misma estantería (pongamos la serie Billy de IKEA) puede tener diferentes números de baldas, y es aquí donde la cosa se nos complica.

Imagina que tu estantería tiene sólo 1 balda (en realidad son dos, la repisa intermedia y la inferior del cuerpo de la estantería). Nuestras “lecturas” de la fuerza con la que lanzamos la pelota sólo pueden tener dos valores (digamos “fuerte” y “flojo”), dependiendo si caen en la balda inferior o la superior. Esto no es muy revelador que digamos.

Si queremos aumentar la “resolución” de nuestra estantería-mide-fuerza sólo tenemos que añadir más baldas, de manera que cuando lancemos la pelota tenga más huecos donde colarse. Así, con cuatro huecos la pelota la habríamos lanzado flojo,medio-flojo,medio-fuerte y fuerte, por ejemplo… poniendo muchas más baldas podremos conseguir resoluciones mayores (a mayor coste, claro, necesitamos más madera), pero… ¿hasta cuándo? Pues hasta que el tamaño del hueco sea menor que la pelota. Entonces la pelota no cabe en ningún hueco y  no es posible registrar la fuerza del lanzamiento.

De la misma manera, los ADC se construyen con una resolución  determinada, que se mide en bits y expresa la cantidad de “baldas” que tiene nuestro ADC. Así, un ADC de 8 bits nos ofrece [latex]8^2=256 pasos[/latex], uno de 10 bits [latex]2^{10}=1024 pasos[/latex] y así sucesivamente. Un mayor número de bits significa más resolución pero también más dinerito. Por otro lado, los ADC tienen un rango de voltaje de trabajo determinado y suelen incluir una entrada para un valor de referencia y un offset. Los dos últimos parámetros no son, en estos momentos, importantes, pero sí el rango de voltaje.

El rango determina el valor máximo y mínimo que es capaz de detectar y convertir nuestro ADC. Es como la altura de la estantería, lo que pase o no llegue no lo medirá. Entonces, suponiendo que nuestro ADC sea de 8 bits tendremos 256 pasos y la diferencia de voltaje entre cada paso (la resolución) será de [latex]\frac{5V}{256 pasos}=0,0195312 V o 19 mV[/latex]. Si empleamos un ADC de 10 bits, será de [latex]\frac{5V}{1024 pasos}=0,0048828125 V o 4.8 mV[/latex]. Ahora bien, nosotros podremos juntar varios de estos pasos, ya que no tenemos por qué aprovechar el ADC al máximo.

Si lo que queremos es, como decíamos al principio, usar botones para marcar clases de talla, no tenemos que apurar tanto. En este caso, y suponiendo un ictiometro digital para pequeños pelágicos (25 cm de longitud), con clases de talla de 0,5 cm, tendríamos que emplear 50 botones (bueno, alguno más para borrar y otras funciones, pero simplifiquemos). Por lo tanto, nuestros escalones serían de [latex]\frac{5V}{50 escalones}=0.1V=100 mV[/latex] Eso quiere decir que tendremos que elaborar nuestra escalera de resistencias a la que vamos a conectar los botones de nuestro ictiometro digital de manera que la diferencia de voltaje entre botones no sea mayor que esos 100 mV.

Un ictiometro digital de mayor longitud necesitaría más botones, más escalones y por tanto ajustes más finos de las resistencias. Y este és el problema. Según la fórmula del divisor de tensión [latex]V_out=\frac{R_2}{R_1+R_2}\dot V_in[/latex], al variar la resistencia en el numerador (la que, digamos, genera el voltaje de salida que medimos) también varía la resistencia en el denominador (la resistencia hacia tierra), de manera que el comportamiento del divisor de tensión no es lineal. Por lo tanto, primer escollo: No podemos usar un único valor de resistencia para todos los botones y además este valor no es el mismo si el ictiometro digital es de 25 cm que de 26 ni de 30 o 60. He extraviado los cálculos que hice en su momento pero las conclusiónes que saqué fue que era preciso emplear resistencias de precisión (Tolerancia 1%)  y que el sistema era muy original (hasta cierto punto, como comentaré luego) pero  no era práctico. Entre otras cosas porque cada “modelo” de ictiometro digital necesita un juego diferente de resistencias.

Googleando descubrí que la idea no era ni mucho menos original, pues este sistema de botones y divisor de tensión fue inventado a principios de los 80 si no recuerdo mal y profusamente usado en aparatos electrónicos que precisaran de una botonera con un pequeño número de botones, como por ejemplo en cadenas musicales. Y además, que adolecía de un buen número de inconvenientes, como las pequeñas variaciones en resistencia que aparecían con el tiempo a causa del uso, del polvo entre los contactos de los pulsadores…

Y estaba el tema de la conexión del icitiometro digital con el ordenador. Mi primera idea era aprovechar la salida de 8 bits del ADC para “enchufarla” directamente al puerto paralelo y leerla desde allí. La idea no era mala, pues a priori es mucho más sencillo inyectar el valor correspondiente a la tecla pulsada en el puerto paralelo usando los 8 bits disponibles en el mismo que mediante comunicación serie. Daos cuenta que mi idea era ensamblar yo mismo la circuitería partiendo de componentes discretos y circuitos integrados. Una vez que el puerto paralelo recibía el valor, se leía via software y se actuaba en consecuencia.

Pero, ¡ay!, las cosas no son ni de lejísimos tan sencillas. Lo primero es que hay que garantizar que no vamos a freír nuestra computadora al meterle voltajes inadecuados. No es un problema, pero obliga a pensar en aislar de alguna manera el ictiometro digital del computador (optoacopladores, pensaba yo, pueden ser la solución). Por otro lado, los cable paralelo son voluminosos y no permiten grandes longitudes. Y por otro, por no mencionar más, una cosa es querer poner un valor en el puerto paralelo… y otra conseguirlo, pues nos enfrentamos, aún teniendo conocimientos de electrónica suficientes como para elaborar correctamente el circuito (de los que yo, como os he comentado, carezco para mi desgracia) entre otras cosas al bouncing.

El bouncing es un fenómeno producido al pulsar una tecla y consistente en que lo que nosotros percibimos como un abrir y cerrar de un interruptor, a pequeña escala en lugar de un bonito escalón representando el 0 y el 1, tenemos una señal con un montón de oscilaciones debidas a las imperfecciones en el diseño del interruptor y pequeños arcos eléctricos… que lo que generan es una señal impura a la que tenemos que hacer algo para que se interprete correctamente. Las técnicas empleadas para eliminar este efecto se denominan debouncing y la más habitual consiste en obviar todas las señales ‘on’ que lleguen una vez que se ha detectado una primera señal ‘on’ durante un tiempo determinado, generalmente de unos milisegundos. La elección del tiempo es clave: poco tiempo no elimina el debouncing y demasiado provoca que nuestro teclado nos ofrezca una respuesta lenta o que haya pulsaciones que se pierdan. Habitualmente, viene a ser de entre 10 y 40 milisegundos.

Bueno, pues yo tenía la intención de hacer todo eso vía hardware a partir de componentes discretos y algún integrado. Pues iba a ser que no. Al final, de toda esta primera fase sólo puedo deciros que la primera víctima de mi proyecto fue mi breadboard que sufrió un calentón de narices. La segunda, un optoacoplador que saltó por los airesy un ADC de siete euros quemado de todas, todas. Y la tercera, el proyecto de ictiometro digital entero, tal y como lo había concebido.

Y entoces apareció Arduino.

Haría falta (bueno, en realidad hace falta) algo más que un blog para explicar qué es y qué se puede hacer con Arduino. Para abreviar y para aquellos que no lo conocéis, Arduino es una placa open hardware de prototipado rápido. O, dicho de otra manera: una plataforma electrónica que te permite experimentar con libertad y facilidad montajes electrónicos que pueden llegar a ser muy sofisticados. La placa Arduino no se entendería sin el software Arduino, una implementación del lenguaje Processing que permite la programación de la placa para que haga lo que nosotros queramos.

Simplificando, lo que nos ofrece Arduino es un cierto número de pines con los que podemos entradas y salidas  por las que podemos meter y sacar señales digitales y analógicas y procesarlas com corresponda. Los programas se programan mediante el IDE Arduino y se cargan en la placa mendiante un cargador que facilita el IDE.

Hay multitud de versiones, dependiendo entre otras cosas del procesador, memoria y número de pines de entrada/salida de que dispongan. Existe la versión LillyPad, una placa flexible que nos permite incluso incorporar un proyecto arduino a prendas de vestir. Su concepción es modular. Existen multitud de shields, más o menos estándar, que  son circuitos adicionales que se acoplan a través de los pines de la placa sobre ésta, aportando nuevas funcionalidades a la placa, como por ejemplo conexion a redes (tanto cabeada como wifi), bluetooth, módulos gps, de radio frecuencia (especialmente interesante parece toda la gama de dispositivos inalámbricos X-Bee), control de motores, etc.

Una de las diferencias que presentan las placas Arduino es el número de pines de entrada y salida que presentan, lo que va a ser clave para nuestro ictiometro digital.

En cuanto al software, y  aquí es donde realmente mi proyecto recibió un impulso gigante, existe una gran comunidad de usuarios de Arduino que pone a disposición del público librerías para ser usadas con el software Arduino. Estas librerías  abarcan multitud de tareas, desde controlar displays LED hasta establecer comunicaciones con otros dispositivos. Y mira tú por donde, hay una librería dedicada a controlar teclados. Es lo ideal para poder gestionar las pulsaciones de nuestro ictiometro digital.

En mi próximo post os hablaré de cómo, finalmente, di forma a este proyecto. ¡¡Mientras tanto, espero que os pique la curiosidad y me sigáis leyendo!!!

¡¡Compártelo y disfruta!!

  • Google Plus
  • Facebook
  • Twitter
  • Email
  • RSS
  • Add to favorites

Raspberry Pi y rastrack ¿Hay alguien ahí fuera?

Mapa con las posiciones de usuarios de Raspberry Pi
  • Google Plus
  • Facebook
  • Twitter
  • Email
  • RSS
  • Add to favorites

Hoy, al pasarme por la página oficial de Raspberry Pi he tenido noticia sobre una iniciativa llamada Raspberry Tracker que no es sino un aplicación sobre Google Maps donde puedes ver sobre un mapa la ubicación y los detalles de los propietarios de una Raspita.

Ni corto ni perezoso, me he dado de alta y como véis, por ahora soy el único orgulloso propietario de una Raspberry Pi en la Bahía de Cádiz. O, al menos, el único que se ha atrevido a darse de alta es rastrack. Habrá más logros, este es el primero, aunque… vaya logro…

Al registrarte puedes darte de alta con tu twitter, lo que facilita las cosas para que la gente se pueda poner en contacto. Además, puedes incorporar la fecha en la que recibiste tu Raspberry Pi y, por lo tanto,  puedes tener idea de cuan veterano usuario puede ser una persona.

¿Dónde están mis amigos?

Pero bromas aparte, me ha parecido una herramienta interesante para localizar gente cercana que esté haciendo cosas con la Raspita y poder poner cosas en común, pedir ayuda, o sugerencias, etc. Aunque es curioso explorar un poco el mundo y ver dónde hay gente que comparte inquietudes con uno, como por ejemplo alguien que vive… ¡¡en las Islas Svalvard!! Y aún unos cuantos en sitios más remotos… aunque en estos casos, me parece a mí que la cosa huele bastante a cachondo mental, más que a otra cosa.

En el artículo que os he mencionado al principio de este post hacen un análisis de la distribución geográfica de las Rapsberry Pi que andan por ahí, con conclusiones interesantes… siendo la más interesante de ellas que parece ser que la esfera anglosajona ha asimilado muy bien la ida de la Raspita pero no así otros países (Sobre todo menciona los de América Latina). ¡¡¡Habrá que ponerse las pilas!!!

¡¡¡Espero empezar a verun montón de usuarios cercanos!!!

 

¡¡Compártelo y disfruta!!

  • Google Plus
  • Facebook
  • Twitter
  • Email
  • RSS
  • Add to favorites