Cargando



Cómo hacer peticiones a la API de google con Python

En este tutorial veras cómo hacer una petición a la API de Google a través de Python para obtener información de una determinada dirección


jun 17 2016 10:51
Intermedio
jun 17 2016 11:15

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_plus
Al 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.

 

Esta cabecera tiene
  • 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'))

falloPeticion.jpg

 

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

falloPeticion2.jpg

 

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]

 

Nota
Este bucle se podría a ver realizado de una manera diferente, con un bucle infinito y haciendo break cuando recv no devuelva más información.

 

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:

 

 

peticion.jpg

 

 

Nota

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:

 

Fichero Adjunto  geolocalizacionPython.zip   833 bytes   290 Descargas


¿Te ayudó este Tutorial?


Sin comentarios, sé el primero!

No esperes más y entra en Solvetic
Deja tus comentarios y aprovecha las ventajas de la cuenta de usuario ¡Únete!

X