Python et les API Web #
La plupart des services Web proposent maintenant une API (Application Programming Interface), rendant le service accessible à un programme plutôt qu’à une personne derrière une machine. C’est grâce à l’existence de ces API qu’il existe par exemple plusieurs clients (qui ne sont pas des navigateurs) pour un service particulier (Twitter par exemple).
L’utilisation de certains services nécessite une phase d’authentification (Facebook, Twitter, la plupart des services Google), et d’autres non, comme OpenStreetMap, OpenFoodFacts… L’utilisation peut être gratuite ou payante.
Exploitation d’une API Web #
L’idée derrière ces API est d’accéder via une méthode GET, POST ou PUT du protocole HTTP (voir Couche Application) à une URL particulière permettant d’effectuer une opération ou de récupérer un résultat dans un format facile à analyser (par exemple JSON ou XML).
Le site web openfoodfacts.org propose par exemple une API permettant d’obtenir des informations sur des produits alimentaires. L’URL à utiliser dans une requête (GET) est de la forme : https://world.openfoodfacts.org/api/v0/product/code-barre.json
Le champ code-barre
doit être rempli avec le code du produit.
Le résultat obtenu est au format JSON, facilement exploitable par un programme informatique :
{
"product": {
"amino_acids_tags": [],
"ingredients_text": "Café torréfié moul'YArabica Origine Pérou biologique et
Max Havelaar Ingrédient : 100% café Arabica Origine Pérou
certifié biologique et Max Havelaar.",
"nutriscore_grade": "b",
"unique_scans_n": 28,
"nutriments": {
"saturated-fat": 0,
"proteins_100g": 0,
"sodium": 0,
"energy_100g": 0,
},
"product_name_fr": "Café Pur Arabica Pérou Doux Et Fruité Bio",
"image_front_thumb_url":
"https://static.openfoodfacts.org/images/products/20713096/front_fr.19.100.jpg",
},
"code": "20713096",
"status": 1,
"status_verbose": "product found"
}
Le dictionnaire contient par exemple le nom du produit, un lien vers une photo de l’emballage, et différentes valeurs nutritionnelles (ici à 0).
Voici un exemple de programme Python qui récupère ces données et les affiche.
import urllib.request as req
url = "https://world.openfoodfacts.org/api/v0/product/20713096.json"
u = req.urlopen(url)
content = u.read()
jsonstr = content.decode('utf8')
print(jsonstr)
Dans le code qui précède content
contient un objets de type bytes
. On le transforme en chaîne de
caractères avec la méthode decode
, en supposant que l’encodage utilisé est ici
UTF-8. La chaîne obtenue est au format JSON
est peut être affichée ou transformée en objet Python (ici un dictionnaire) à l’aide du module json
:
import json
data = json.loads(jsonstr)
urlproduit = data['product']['image_front_thumb_url']
sodium = data['product']['nutriments']['sodium']
print("URL Image produit", urlproduit)
print("Teneur en sodium :", sodium)
Notons que le module requests
(non inclus dans la bibliothèque standard) permet
de simplifier la récupération des données (son utilisation est encouragée) :
import requests
url = "https://world.openfoodfacts.org/api/v0/product/20713096.json"
content = requests.get(url)
data = content.json()
sodium = data['product']['nutriments']['sodium']
print("Teneur en sodium :", sodium)
Exemples (peut être plus à jour) d’API Webs #
En règle générale, les APIs sont documentées :
- https://developers.google.com/youtube/2.0/developers_guide_json
- http://developer.vimeo.com/apis/
- https://dev.twitter.com/docs/api/1.1/overview
- http://www.reddit.com/dev/api
- http://wiki.openstreetmap.org/wiki/API_v0.6
- https://code.google.com/p/google-api-python-client/
Voici quelques exemples de ce qu’il est possible de faire avec Python,
en utilisant le module requests
pour simplifier les requêtes Web.
Météo France #
Météo France propose un API Web depuis peu (https://portail-api.meteofrance.fr/web/fr/)
On y trouve des API publiques, contenant par exemple des données climatologiques, ou les données de vigilance.
L’accès à ces API nécessite l’obtention d’une token de connexion qui peut vous être fourni en TP.
Exemple, pour la récupération des stations climatologiques d’un département envoyant les données à la fréquence de 6 minutes :
token = """XXXXX"""
r = requests.get('https://public-api.meteofrance.fr/public/DPClim/v1/liste-stations/infrahoraire-6m?id-departement=33',
headers = {"Authorization": f'Bearer {token}', "accept": "*/*"})
r.json()
[
...
{'id': '33550001',
'nom': "VILLENAVE D'ORNON-INRA",
'posteOuvert': True,
'typePoste': 3,
'lon': -0.576667,
'lat': 44.79,
'alt': 25,
'postePublic': True}
]
Une cartes des stations est disponible.
Vigilance crues, hub’eau #
- https://www.vigicrues.gouv.fr/services/1/ (dashboard exemple : https://www.vigicrues.gouv.fr/niv3-station.php?CdEntVigiCru=31&CdStationHydro=L234161002&GrdSerie=H&ZoomInitial=3)
- https://hubeau.eaufrance.fr/page/api-hydrometrie (https://www.hydro.eaufrance.fr/stationhydro/L234161002/synthese)
Récupérer des objets OpenStreetMap #
import requests
r = requests.get('http://api06.dev.openstreetmap.org/api/0.6/map?bbox=0.2,46.5,0.4,46.7')
print(r)
Accéder à un flux RSS (ici celui d’Interstices) #
Utilisation du module python-feedparser
(http://pythonhosted.org/feedparser/)
import feedparser
d = feedparser.parse('https://interstices.info/feed/Rss2.jsp?id=c_13634')
print(d.feed.title)
for i in d.entries :
print(i.title,i.published,"\n================")
print(i.id)
print(i.link)
print(i.description)
print()
Le numéro id=XXX
de l’URL est susceptible de
changer. Vous pouvez le trouver sur la page de garde
d’Interstices
OpenWeatherMap #
Il faut avoir uné clé API (à ajouter dans l’URL) pour utiliser openweathermap.
Le site web http://openweathermap.org propose une API permettant de
connaître les conditions météo sur n’importe quel point du globe. La
requête GET
est de la forme :
http://api.openweathermap.org/data/2.5/weather?q=LIEU
Le lieu est alors un nom de ville comme Poitiers,fr. On peut aussi rechercher par coordonnées (latitude, longitude) ou identifiant de ville. La documentation est ici https://openweathermap.org/api/
Le résultat obtenu, au format JSON (d’autres formats sont disponibles), est de ce type :
{'base': 'gdps stations',
'clouds': {'all': 90},
'cod': 200,
'coord': {'lat': 46.583328, 'lon': 0.33333},
'dt': 1379489400,
'id': 2986495,
'main': {'humidity': 100,
'pressure': 1008,
'temp': 290.15,
'temp_max': 290.15,
'temp_min': 290.15},
'name': 'Poitiers',
'rain': {'3h': 1},
'sys': {'country': 'FR', 'sunrise': 1379482876, 'sunset': 1379527430},
'weather': [{'description': 'overcast clouds',
'icon': '04d',
'id': 804,
'main': 'Clouds'}],
'wind': {'deg': 240, 'speed': 6.2}}
Le dictionnaire main
contient par exemple la température (en Kelvins),
la pression (en hectopascals), et le taux d’humidité de l’air.
Voici un exemple de programme Python qui récupère ces données et les affiche.
import requests
url="http://api.openweathermap.org/data/2.5/weather?q=Poitiers,fr&appid=XXXX"
content=requests.get(url)
data=content.json()
t=data['main']['temp']
print("La température est de {} degrés C".format(t-273.15))
On peut aussi se passer du module requests
, mais le code devient moins
clair :
import urllib.request as req
import json
url="http://api.openweathermap.org/data/2.5/weather?q=Poitiers,fr&appid=XXXX"
u=req.urlopen(url)
content=u.read()
jsonstr=content.decode('ascii')
data=json.loads(jsonstr)
t=data['main']['temp']
print("La température est de {} degrés C".format(t-273.15))
OpenFoodFacts #
Le site http://fr.openfoodfacts.org/ recense des données sur les produits alimentaires. L’alimentation 8-) de la base est faite grâce au crowdsourcing, et les données sont librement accessibles.
On peut interroger la base à partir du code barre d’un produit : http://fr.openfoodfacts.org/api/v0/produit/3029330003533.json
Plus d’infos ici : http://fr.openfoodfacts.org/data
Sites proposant ou référençant des API #
- https://data.enedis.fr/explore/?sort=modified (enedis)
- https://public.opendatasoft.com/ (divers)
- http://fr.openfoodfacts.org/data (nourriture)
- http://fr.openbeautyfacts.org/data (produits cosmétiques)
- http://api.open-notify.org/ (station spatiale internationale)
- https://www.flickr.com/services/api/ (flicker)
- https://www.imdb.com/ BDD de films
- https://www.themoviedb.org/?language=fr BDD de films
- Site qui référence des API Web : https://www.programmableweb.com/
- https://github.com/public-apis/public-apis (grosse liste)
- https://api.gouv.fr/ API des services publics
Ressources #
- Using APIs with Python requests module
- http://c0ding.github.io/tweetuoso/
- https://github.com/sixohsix/twitter
- https://github.com/i-kiwamu/python3-oauth2
- http://www.pythonforbeginners.com/python-on-the-web/how-to-access-various-web-services-in-python/
- http://www.pythonforbeginners.com/python-on-the-web/using-requests-in-python/
- http://www.pythonforbeginners.com/code-snippets-source-code/bitly-shortener-with-python/
- http://jsonviewer.stack.hu/ ou http://jsonlint.com/
- http://test.data-sncf.com/index.php/