viernes, 23 de noviembre de 2012

Consultas a URLS a través de Python

Algunas veces surge la necesidad de hacer consultas a una URL desde un programa, y no desde un navegador Web. La ventaja de hacer este tipo de consultas a través de una aplicación es que se pueden aplicar acciones automatizadas, repetitivas o programadas, contrario a las consultas que los usuarios realizan a través de un navegador.

De esta forma, es posible hacer consultas sobre bases de datos o servicios en la Web, de forma automática. A continuación se mostrará la forma de hacer este tipo de consultas desde una aplicación de Python, y se mostrará una aplicación en específico para recuperar datos de geocodificación inversa desde el servicio Nominatim de OpenStreet. Además, se mostrará la forma de pasar argumentos para consultas tipo GET o POST, con las cuales se puede acceder a bases de datos u otros servicios que requieran llenar campos de parámetros o autenticación.

La librería que permite hacer este tipo de consultas es la urllib. La función que usará de esta librería se llama urlretrieve, y permite descargar toda la información contenida en la URL, en un archivo local. La URL puede apuntar a un archivo de cualquier tipo, incluyendo HTML y XML.

En el ejemplo que se mostrará a continuación, para realizar reverse geocoding, se hace uso de la librería json de Python, mediante la cual es posible procesar archivos en formato json, los cuales son útiles para transmisión de información y parámetros específicos.

Este es el código fuente:

import urllib
import json

# Función para recuperar información de reverse geocoding desde openstreetmaps
def reverse_geocode_OSM(latitud,longitud):

  # Definición de parámetros del request GET
  params=urllib.urlencode({'format':'json','lat':latitud,'lon':longitud,'zoom':18,'addressdetails':0})
  
  # Se consulta la URL y se guarda el archivo en una ruta temporal dada por a[0]
  a=urllib.urlretrieve("http://nominatim.openstreetmaps.org/reverse?%s" % params)
  
  # Se abre el archivo recuperado
  archivo=open(a[0],'r')
  
  # Se convierte el objeto json a diccionario de python
  d=json.load(archivo)
  
  # Se cierra le archivo
  archivo.close()

  # Se devuelve el parámetro "display_name" desde la respuesta del servidor
  return d["display_name"]


# Ejecución de la función
print reverse_geocode_OSM(4.679,-74.048)

El anterior ejemplo hace una consulta de dirección para las coordenadas (4.679,-74.048), para lo cual devuelve la siguiente dirección "Home Baked, Carrera 13, Chapinero, Bogotá, D.C., Bogotá, 110111, Colombia".

El anterior ejemplo hace una solicitud de tipo GET. Es posible hacer solicitudes de tipo POST cambiando la línea de urlretrieve por: 

a=urllib.urlretrieve("http://url.ejemplo",params)

En el anterior ejemplo no es posible usar POST, ya que el servidor Nominatim de OpenStreet no lo soporta.

Espero que les haya sido de utilidad este aporte, y puedan sacarle buen provecho. Una última anotación: Se debe hacer buen uso de esta herramienta, ya que consultas repetitivas y descontroladas a servidores pueden provocar un bloqueo de la IP de origen de las solicitudes.

1 comentario: