<jupyter_start><jupyter_text>Adquisión de datos `API`- [ ] descarga directa- [X] petición GET a través de API de terceros (ej. AEMET, Ayto. Barcelona....)- web crawling (que es una práctica ilegal...pero muy de moda entre los hackers!?¿!) ***  Acceso a API manualmentePodemos utilizar la librería de Python [Requests](http://docs.python-requests.org/) para realizar peticiones a web API de manera manual. Para ello, tendremos que acceder a la documentación de la API con la que queramos actuar, construir manualmente las peticiones para obtener la información deseada y procesar también manualmente la respuesta recibida.Veamos un ejemplo de petición HTTP a una API pública. El sitio http://postcodes.io/ ofrece una API de geolocalización sobre códigos postales en el Reino Unido. Leyendo la documentación, podemos ver que tiene un método GET con la URL http://api.postcodes.io/postcodes/código-postal que nos retorna información del código postal especificado.<jupyter_code># Importamos la librería requests
import requests
# El parámetro sort_keys FALSE para ordenar o no alfabeticamente
# el parámetro indent para buscar entre los anidados (niveles)
def json_print(json_data, limit=None):
    if isinstance(json_data, (str)):
        json_data = json.loads(json_data)
    nice = json.dumps(json_data, sort_keys=False, indent=3, separators=(',',':'))
    print("\n".join(nice.split("\n")[0:limit]))
    if limit is not None:
        print("[....]")
# Realizamos una petición GET a la API por un código postal `E98 1TT`
# Podemos utilizar opcionalmente en caso de separación por espacio la codificación ASCII %20
response = requests.get('http://api.postcodes.io/postcodes/E98%201TT')
# Realizamos una petición GET a la API por un código postal `E98 1TT`
# Podemos utilizar opcionalmente en caso de separación por espacio la codificación ASCII %20
response_emt = requests.get('https://openapi.emtmadrid.es/v1/hello/')
response_emt
response
# Mostramos los resultados de la respuesta recibida en caso de obtener `200`
print(u"Código de estado de la respuesta: ",response.status_code, "\n")
# Mostramos la cabecera de la respuesta
print(response.headers)
print(type(response.headers))
print(type(dict(response.headers)))
# Vamos a imprimirlo en manera "nice" pero devolverá error si no le indico que tipo
# de objeto tiene que ser convertido a dict o list
import json
from json_print import *
json_print(response.headers)
# Imprimimos en pantalla el header
json_print(dict(response.headers))
# Imprimimos el cuerpo del json
json_print(str(response.text))
response.raw<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.08786127167630058, 'fraction_numerical': 0.008092485549132947, 'mean_word_length': 5.108235294117647, 'pattern_counts': {'":': 0, '<': 5, '<?xml version=': 0, '>': 5, 'https://': 1, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '1', 'dir': 'jupyter-structured-clean-dedup', 'id': '176390', 'license': 'MIT', 'n_tokens_mistral': 836, 'n_tokens_neox': 822, 'n_words': 304, 'path': '02-python-201/labs/APIs/02.Acceso_API.ipynb', 'repo_name': 'MariaPCampos/NEOLAND-DS2020-datalabs', 'size': '2595'}