Prédiction météo


Introduction aux requêtes API via HTTP

Le but ce cet exercice est de présenter le concept d'une API HTTP au lecteur, ainsi que les différents packages permettant d'interactir avec celles-ci.

Qu'est ce qu'une API?

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.

Comment intéréagir 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.

Exemple de requête HTTP avec 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


<http.client.HTTPResponse object at 0x7f35143d1550>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml" lang="fr">

    
    
    
    
    


<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

    
        <base href="http://www.afpy.org/" /><!--[if lt IE 7]></base><![endif]-->
    

    
        <meta name="d

Prédiction météos avec openweathermap.org

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.

Exercice 1

Écrire une fonction retournant la météo actuelle d'une ville donnée. Cette fonction prendra en argument le nom d'une ville, la langue de la prévision, appelant l'API d'OpenWeatherMap, parsant le JSON retourné afin de le transformer en dict python, et retourant finalement ce dict.


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}}
    """
    pass

Exercice 2:

É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',
        ...
    }
    """
    pass

Exercice 3:

Afficher les températures minimales et maximales de 5 villes françaises pour les 10 prochains jours en utilisant la fonction définie dans l'exercice 2.


In [0]: