Hoy voy a enseñar cómo hacer peticiones a la API de Google para sacar información de una determinada dirección, lo más interesante del tutorial es aprender cómo a hacer una petición a una API, con Python es bastante fácil e intuitivo. Primero vamos a ver el código completo y luego explico sus partes:
#!/usr/bin/env python3 import socket from urllib.parse import quote_plus cabecera = """\ GET /maps/api/geocode/json?address={}&sensor=false HTTP/1.1\r\n\ Host: maps.google.com:80\r\n\ User-Agent: \r\n\ Connection: close\r\n\ \r\n\ """ def localizar(direccion): conexion = socket.socket() conexion.connect(('maps.google.com', 80)) cabeceraAux = cabecera.format(quote_plus(direccion)) conexion.sendall(cabeceraAux.encode('utf-8')) datos = b'' d = conexion.recv(1024) while d: datos += d d = conexion.recv(1024) print(datos.decode('utf-8')) if __name__ == '__main__': localizar('Calle Desarrollo, Móstoles')Necesitamos importar la librería socket para establecer la conexión, y la función quote_plus que pertenece a urllib.parse, su uso se ve más adelante.
import socket from urllib.parse import quote_plusAl principio crearemos una variable donde crearemos la cabecera de la petición a la API:
cabecera = """\ GET /maps/api/geocode/json?address={}&sensor=false HTTP/1.1\r\n\ Host: maps.google.com:80\r\n\ User-Agent: \r\n\ Connection: close\r\n\ \r\n\ """En la primera línea verás {} después de address=, es así para poder pasarle la calle de la que deseamos información.
- Tipo de petición: GET
- El recurso de la petición: /maps/api/geocode/json?address={}&sensor=false
- El tipo de HTTP que usamos: HTTP 1.1
- El host donde se hará la petición (incluye el puerto): maps.google.com:80
- El user agent que no es más que el navegador desde el que se hace (lo deje en blanco, en este caso no es importante)
- El tipo de conexión: close. Es decir que tras la petición se cerrará.
Tenemos una función llamada localizar, que recibe un parámetro, éste será la dirección de la que queremos información. Vamos a explicar la función paso a paso:
En las primeras 2 líneas creamos el socket y lo conectamos a la dirección deseada (fíjate que la función connect de socket recibe una tupla, un solo arghumento).
conexion = socket.socket() conexion.connect(('maps.google.com', 80))La tercera línea de código se utiliza para rellenar el hueco {} de la cabecera con la dirección que se pasa a la función (fíjate en quote_plus, se usa aquí).
cabeceraAux = cabecera.format(quote_plus(direccion))En la siguiente línea se envía la petición, observa que usamos la función encode, lo que hacemos es enviar los datos codificados en utf-8, si no lo hiciéramos obtendrías un error como observarás en la siguiente imagen:
conexion.sendall(cabeceraAux.encode('utf-8'))
La siguiente parte del código crea una variable de tipo byte, nos servirá para recoger los datos que nos llegan desde internet si no recibirás un error como el siguiente:
datos = b''
Ahora lo que hacemos es un bucle donde recibimos la información de la respuesta de Google, y la vamos almacenando en la variable datos, la función recv es la que devuelve los datos (el parámetro que recibe es el máximo de datos que devolverá la función). El bucle sigue hasta que no hay se devuelven más datos, que se saldrá del while.
d = conexion.recv(1024) while d: datos += d d = conexion.recv(1024)[color=#a9a9a9]Bucle que recibe la información de la API[/color]
Al terminar de recibir todos los datos podemos pintar solo los datos que nos interesen o todos, aquí devuelvo todos:
print(datos.decode('utf-8'))La última parte del código no tiene nada que ver con la petición, es una comprobación que lo único que hace es ver si es el archivo que se está ejecutando (si es así se lanza la función) o si se está importando en otro archivo Python (no se llamaría a la función), son cosas de Python que se pueden aprender en su documentación:
if __name__ == '__main__': localizar('Calle Desarrollo, Móstoles')Os dejo una parte de la salida del programa, hay más datos, como la latitud y la longitud que no se muestran:
Esta es una de las formas con las que se pueden hacer peticiones, a continuación te dejo un breve código de una forma de hacerlo en Python 2 usando request y json, pero puedes crear tus propios programas con estas peticiones.
import requests def localizar(direccion): parametros = {'address': direccion, 'sensor': 'false'} respuesta = requests.get('http://maps.googleapis.com/maps/api/geocode/json', params = parametros) print(respuesta.json()) if __name__ == '__main__': localizar('Calle Desarrollo, Móstoles')
Y por si queréis descargar el código:
geolocalizacionPython.zip 833 bytes 290 Descargas