Web scraping con Python y Raspberry Pi

Sep. 22, 2012

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

#!/usr/bin/env python

-*- coding: utf-8 -*-

import urllib2 import time import random

debug = True fichero_codigos = open('./codigos.csv', ‘r’) #Fichero de entrada con los códigos fichero_salida = open('./censo.csv', ‘w’) #Fichero de salida para los datos capturados fichero_salida_errores = open('./errores.csv' , ‘w’) #Fichero de salida con los códigos con error lista_codigos = []

#Lee el fichero de entrada y almacena los códigos for linea in fichero_codigos: lista_codigos.append(linea.strip()) fichero_codigos.close()

if debug: print codigos #Imprime la lista de códigos

for codigo in lista_codigos: #Iteramos sobre la lista de códigos time.sleep(random.uniform(8, 12)) # Pausa entre consultas para no sobrecargar el servidor, establecido aleatorio entre 8 y 12 segundos. url=(“““http://www.SERVIDOR.es/DIRECTORIO/consulta.asp?cod=%s""" %codigo) #Esta es la url de las consultas. En mi caso, la url es fija y sólo cambio el código en la parte de asp. Por cierto, la página es simulada, no pongo la página real solicitud = urllib2.Request(url) #Preparamos la consulta solicitud.add_header(‘User-Agent’, ‘Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.13) Gecko/2009073022 Firefox/3.0.13’) #Añadirmos el user-agent if debug: print url #Imprime la URL de consulta pagina = urllib2.urlopen(solicitud) #Con esta orden abrimos la URL lineas = pagina.readlines() #Leemos todas las líneas de la url descargada (o sea, el código fuente de la página y las almacenamos

for linea in lineas: #Ahora iteramos sobre el código fuente buscando el dato que nos interese if debug: print linea busqueda = linea.find(‘LO QUE NOS INTERESE’)

  if busqueda != -1: #Si se encuentra
      #... HACEMOS ESTO  Y LO OTRO PARA CONSEGUIR LOS DATOS DE INTERES
      fichero\_salida.write('%s %s' %(codigo, datos)) # Grabamos los datos
      if debug:
          print codigo, datos
      break #Salimos del bucle si ya lo hemos encontrado, esto dependerá de los datos que tu quieras extraer..

if busqueda == -1: Si no se ha encontrado la información fichero_salida_errores.write('%s;NO SE HA RECUPERADO INFORMACION\n' %codigo) #Grabamos el código en el fichero de errores. Luego podríamos hacer más intentos sobre esos datos if debug: print codigo,‘SIN DATOS’

fichero_salida.close() fichero_salida_errores.close()

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!!