Un ejemplo concreto de la utilidad de los scripts

30 de Marzo de 2013

Escribí el script a continuación en mi trabajo para extraer datos que no podía obtener de otra manera. Lo publico aca, no por la calidad del código (lo hice en modo "quick and dirty") pero mas bien porque pienso que ilustra bien la utilidad de los scripts en el trabajo cotidiano de un geomático.

 Explicación

Estaba buscando información sobre las empresas de Puerto Príncipe en Haiti. Después de una rápida búsqueda en internet, me encontré con este sitio, que es un catálogo de empresas y que presenta cada una a través de una página individual (como esa o esta). Ví que el URL era siempre el mismo (http://haiti.buildingmarkets.org/fr/supplier/) y solamente cambiaba el id de la empresa. Eso significa que era  possible iterar sobre el id y, página (empresa) por página (empresa), recuperar la información que quería. Además, lo bueno con este sitio es que contiene las coordenadas geográficas de las empresas, enctonces puedo mapearlas! Que mas puedo pedir?

 El script

El script esta hecho en Python y he utilizado los modulos urllib2 y BeautifulSoup. El primero para conectarme a las páginas web y recuperar el código. El segundo para extraer los datos que me interesan dentro del código HTML. Como lo dije antes, el objetivo de este post no es el código en si, asi que no le puse muchos comentarios pero es bastante facil de entender. Lo que hay que notar es que las coordenadas geográficas estan en grados, minutos decimales, enctonces hay que convertirlas a grados decimales para que puedan ser procesadas. (Para ver la formula de la conversion, consultar esta página).

# -*- coding: cp1252 -*-
import urllib2
from bs4 import BeautifulSoup

import sys

archivo = open('listado_empresas_haiti.txt', 'w')

archivo.write("id categorie1 categorie2 nom_entrep adresse commune lat long

tel1 tel2 mail site nb_employe ")

i = 6000
limite = 20000

while i <= limite:
    
    try:

        response = urllib2.urlopen('http://haiti.buildingmarkets.org/fr/supplier/'+str(i))
        html = response.read()

        soup = BeautifulSoup(html)

        #soup.div.div.nextSibling.nextSibling.nextSibling.nextSibling # corresponde a la div id = 'main'

        content_box = soup.div.div.nextSibling.nextSibling.nextSibling.nextSibling.div.nextSibling.nextSibling.

        nextSibling.nextSibling.nextSibling.nextSibling # correspond a la div class = content-box

        categ = content_box.div.div.div.div.div.find_all('a')
        
        # Pongo esta condicion porque tengo un problema con el caracter "'".
        # No tengo el tiempo de buscar mas entonces lo quito con un .split()
        if "(" in categ [0].get_text():
            categ1 = categ [0].get_text().split('(')[0].rstrip()

        else:
            categ1 = categ [0].get_text()
            
        categ2 = categ [1].get_text()

        # Toda la informacion sobre la empresa
        info_empresa = content_box.div.div.div.div.nextSibling.nextSibling.nextSibling.nextSibling

        # El nombre de la empresa
        n_empresa = info_empresa.find_all('h3')[0].get_text()

        infos_dir = info_empresa.find_all('address')[1]

        # La direccion de la empresa
        direccion = infos_dir.address.get_text().split(' ')[0]

        # El nombre de la commune
        commune = infos_dir.address.em.get_text()

        # Las coordenadas GPS
        coords = infos_dir.address.em.nextSibling.nextSibling.get_text()
        l_coords = coords.split(' ')


        # Como las coordenadas estan en grados, minutos decimales, tengo que convertirlas en grados decimales
        lat = l_coords[1].replace('N', '')
        if '°' in lat:
            l_lat = lat.split('°')
            lat = str(int(l_lat[0])+ float(l_lat[1])/60)
        
        lon = '-'+l_coords[2].replace('W', '')
        if '°' in lon:
            l_lon = lon.split('°')
            lon = str(int(l_lon[0])- float(l_lon[1])/60)

        contacts = info_empresa.div.div.div.div.nextSibling.nextSibling.nextSibling.nextSibling.find_all('dd')
        tel1 = contacts[0].get_text()
        tel2 = contacts[1].get_text()


        for c in contacts:
            
            if '@' in c.get_text():
                mail = c.get_text()
            else:
                mail = ''

            if 'www' in c.get_text():
                site = c.get_text()
            else:
                site = ''

        tablas = info_empresa.find_all('table')

        for linea in tablas[0].find_all('tr'):
            if 'Nombre d' in linea.th.get_text():
                    nb_employ = linea.td.get_text()

        # Lleno el archivo con la informacion de la empresa
        archivo.write(str(i)+ " " + categ1 + " " + categ2 + " " + n_empresa

        + " " + direccion + " " + commune + " " + lat+ " " + lon + " " +

        tel1 + " " + tel2 + " " + mail + " " + site + " " + nb_employ + " " + " ")

    except:
        pass


    i = i+1

archivo.close()

El resultado es este archivo. Contiene 1700 empresas con sus coordenadas y otras informaciones. Ahora solo falta convertirlo en un archivo vector con Qgis y el plugin "Añadir capa de texto delimitado".

Conclusión

Con este ejemplo, vemos la utilidad de los scripts. Nos permiten obtener un resultado rapidamente sin usar conceptos de programación muy avanzados. Aca lo use para conectarme a unas páginas web y extraer información dentro de ellas pero obviamente las posibilidades son sin fín (cálculo científico, gestión de archivos, conexión a una base de datos, ...). Es una herramienta muy útil y poderosa y es la razón por la cual pienso que los geomaticos, que muy a menudo trabajamos con fuentes y formatos de datos diferentes, debemos tener al menos un conocimiento mínimo. Y sin duda, el lenguaje mas adecuado de conocer para un geomático es Python. Si tienen que conocer un solo lenguaje, es este.

Twittear