Une API (Application Programming Interface) est une interface permettant à un programme d'intéragir avec les fonctionnalités d'un autre programme. Elle peut se présenter sous la forme d'une librairie à utiliser dans un programme, d'un service web, etc.
Par exemple, il est possible d'intéragir avec Twitter (poster un tweet, le supprimer, lister les contacts d'un utilisateur, etc) via une API web. La même chose est possible avec Gtihub, Facebook, Google, etc.
Dans cet exervice, nous allons vous montrer comment intéragir avec une API web.
En utilisant le protocole du web le plus courant: HTTP. Utiliser une API web est aussi simple que de visiter une page web!
Python intègre plusieurs modules permettant de faire des requêtes HTTP dans sa librairie standard. Nous allons utiliser urllib.request
.
urllib.request
In [1]:
import urllib.request
response = urllib.request.urlopen('http://www.afpy.org')
print(response)
print(response.read(300).decode('utf-8')) # affiche les 300 premiers caractères du code HTML de la page requêtée
Nous allons utiliser http://openweathermap.org/API pour récupérer la météo actuelle d'une ville entrée par l'utilisateur, ainsi que les prévisions météos.
Note: L'API de OpenWeatherMap renvoie des données en format JSON. Afin de transformer ces données en un format natif python, il faudra utiliser le module json
.
In [2]:
import urllib.request
import json
def meteo(ville, lang):
"""Retourne la météo actuelle de la ville, dans la langue passée en argument.
>>> w = weather(city='lyon,fr', lang='fr')
>>> w
{'weather': [{'main': 'Clear',
'icon': '01d',
'description': 'ensoleillé',
'id': 800}],
'base': 'cmc stations',
'sys': {'message': 0.3494,
'country': 'FR',
'sunrise': 1396761011,
'sunset': 1396808137},
'cod': 200,
'name': 'Lyon',
'clouds': {'all': 0},
'main': {'temp_min': 288.71,
'pressure': 1020,
'temp_max': 292.15,
'humidity': 42,
'temp': 290.61},
'dt': 1396785710,
'coord': {'lat': 45.75, 'lon': 4.85},
'id': 2996944,
'wind': {'deg': 360, 'speed': 4.6}}
"""
url = 'http://api.openweathermap.org/data/2.5/weather?q={ville}&lang={ville}&units=metric'.format(ville=ville, lang=lang)
reponse = urllib.request.urlopen(url)
meteo_dict = json.loads(reponse.read().decode('utf-8'))
return meteo_dict
Écrire une fonction retournant les prévisions météo pour une ville donnée. Cette fonction prendra en argument le nom d'une ville, la langue de la prévision et le nombre de jours de prévisions requis, appelant l'API d'OpenWeatherMap, parsant le JSON retourné afin de le transformer en dict
python, et retourant finalement ce dict
.
Le nombre de jours de prévisions par défaut sera 7.
In [9]:
def prevision(ville, lang, nb_jours=7):
"""Retourne la météo actuelle de la ville, dans la langue passée en argument.
>>> f = forecast(city='lyon,fr', lang='fr', nb_days=10)
>>> f
{'message': 0.0219,
'city': {'sys': {'population': 0},
'name': 'Lyon',
'country': 'FR',
'population': 0,
'coord': {'lat': 45.748459, 'lon': 4.84671},
'id': 2996944},
'list': [{'weather': [{'main': 'Clear',
'icon': '01d',
'description': 'ensoleillé',
'id': 800}],
'pressure': 979.54,
'temp': {'night': 283.92,
'day': 293.18,
'morn': 290.63,
'min': 283.92,
'max': 293.71,
'eve': 290.75},
'deg': 346,
'dt': 1396782000,
'clouds': 0,
'humidity': 79,
'speed': 2.61},
{'weather': [{'main': 'Rain',
'icon': '10d',
...
}
"""
url = 'http://api.openweathermap.org/data/2.5/forecast/daily?q={}&lang={}&cnt={}&units=metric'.format(ville, lang, str(nb_jours))
reponse = urllib.request.urlopen(url)
prevision_dict = json.loads(reponse.read().decode('utf-8'))
return prevision_dict
In [18]:
villes = ['Lyon', 'Paris', 'Nantes', 'Marseille', 'Toulouse']
max_temperatures, min_temperatures = [], []
for ville in villes:
previsions = prevision(ville, 'fr')
for prev in previsions['list']:
max_temperatures.append(prev['temp']['max'])
min_temperatures.append(prev['temp']['min'])
print("%s : min %f°C, max %f°C" % (ville, min(min_temperatures), max(max_temperatures)))
max_temperatures, min_temperatures = [], [] # reinitialisation des listes pour la ville suivante
In [ ]: