2A.eco - API, API REST

Links: notebook, html, PDF, python, slides, GitHub

Petite revue d’API REST.

from jyquickhelper import add_notebook_menu
add_notebook_menu()

Définition :

API, à part que ce mot qui vaut 5 au scrabble, c’est quoi au juste ?

API signifie Application Programming Interface. Le mot le plus important est “interface”, et c’est le mot le plus simple, car nous utilisons tous des interfaces.

Bon, et une interface ?

Définition Larrouse : “Une interface est un dispositif qui permet des échanges et interactions entre différents acteurs”

Pour faire simple, une API est un moyen efficace de faire communiquer entre elles deux applications : concrètement, un fournisseur de service met à disposition des développeurs une interface codifiée, qui leur permet d’obtenir des informations à partir de requêtes.

Sans rentrer dans le détail technique, le dialogue ressemble à : “envoie moi ton adresse sous la forme X = rue, Y = Ville, Z = Pays” et moi, en retour, je t’enverrai le code à afficher sur ton site pour avoir la carte interactive.

Les API qui existent

De plus en plus de sites mettent à disposition des développeurs et autres curieux des API.

Pour en citer quelques-uns :

Ou encore :

Comment parler à une API ?

La plupart des API donnent des exemples par communiquer avec les données présentes sur le site.

Simplement, il faut trouver l’url qui renvoit les données que vous souhaitez avoir

Par exemple, avec l’API de la Banque mondiale, voici comme s’écrit une requête pour les données de la Banque Mondiale :

http://api.worldbank.org/countries?incomeLevel=LMC

Avec cette url, on demande la liste des pays dont le niveau de revenus est LMC, c’est à dire “Lower middle income”.

En cliquant sur le lien, le site renvoit des données en XML, qui ressemblent pas mal à ce qu’on a vu plus tôt avec le scraping : une structure avec des balises qui s’ouvrent et qui se ferment.

<wb:countries xmlns:wb= »http://www.worldbank.org » page= »1 » pages= »2 » per_page= »50 » total= »52 »> <wb:country id= »ARM »>

<wb:iso2Code>AM</wb:iso2Code> <wb:name>Armenia</wb:name> <wb:region id= »ECS »>Europe & Central Asia</wb:region> <wb:adminregion id= »ECA »>Europe & Central Asia (excluding high income)</wb:adminregion> <wb:incomeLevel id= »LMC »>Lower middle income</wb:incomeLevel> <wb:lendingType id= »IBD »>IBRD</wb:lendingType> <wb:capitalCity>Yerevan</wb:capitalCity> <wb:longitude>44.509</wb:longitude> <wb:latitude>40.1596</wb:latitude>

</wb:country>

<wb:country id= »BGD »>

<wb:iso2Code>BD</wb:iso2Code> <wb:name>Bangladesh</wb:name> <wb:region id= »SAS »>South Asia</wb:region> <wb:adminregion id= »SAS »>South Asia</wb:adminregion> <wb:incomeLevel id= »LMC »>Lower middle income</wb:incomeLevel> <wb:lendingType id= »IDX »>IDA</wb:lendingType> <wb:capitalCity>Dhaka</wb:capitalCity> <wb:longitude>90.4113</wb:longitude> <wb:latitude>23.7055</wb:latitude>

</wb:country>


Quand on regare de plus près, on voit que les informations suivantes apparaissent

Code du pays | Nom du pays | Région | Classification en termes de revenus | Les types de prêt pour ces pays | La capitale | Longitude | Latitude


AM Armenia Europe & Central Asia Europe & Central Asia (excluding high income) Lower middle income IBRD Yerevan 44.509 40.1596

BD Bangladesh South Asia South Asia Lower middle income IDA Dhaka 90.4113 23.7055

En utilisant cette url ci : http://api.worldbank.org/countries?incomeLevel=LMC&format=json, on obtient directement un json, qui est finalement presque comme un dictionnaire en python.

Rien de plus simple donc pour demander quelque chose à une API, il suffit d’avoir la bonne url.

Et Python : comment il s’adresse aux API ?

C’est là qu’on revient aux fondamentaux : on va avoir besoin du module requests de Python et suivant les API, un parser comme BeautifulSoup ou rien si on réussit à obtenir un json.

On va utiliser le module requests et sa méthode get : on lui donne l’url de l’API qui nous intéresse, on lui demande d’en faire un json et le tour est joué !

Faire appel à l’API de la Banque Mondiale

import requests
data_json = requests.get("http://api.worldbank.org/countries?incomeLevel=LMC&format=json").json()
data_json
[{'page': 1, 'pages': 2, 'per_page': '50', 'total': 53},
 [{'adminregion': {'id': 'SSA',
    'value': 'Sub-Saharan Africa (excluding high income)'},
   'capitalCity': 'Luanda',
   'id': 'AGO',
   'incomeLevel': {'id': 'LMC', 'value': 'Lower middle income'},
   'iso2Code': 'AO',
   'latitude': '-8.81155',
   'lendingType': {'id': 'IBD', 'value': 'IBRD'},
   'longitude': '13.242',
   'name': 'Angola',
   'region': {'id': 'SSF', 'value': 'Sub-Saharan Africa '}},
  {'adminregion': {'id': 'ECA',
    'value': 'Europe & Central Asia (excluding high income)'},
   'capitalCity': 'Yerevan',
   'id': 'ARM',
   'incomeLevel': {'id': 'LMC', 'value': 'Lower middle income'},
   'iso2Code': 'AM',
   'latitude': '40.1596',
   'lendingType': {'id': 'IBD', 'value': 'IBRD'},
   'longitude': '44.509',
   'name': 'Armenia',
   'region': {'id': 'ECS', 'value': 'Europe & Central Asia'}},
  {'adminregion': {'id': 'SAS', 'value': 'South Asia'},
   'capitalCity': 'Dhaka',
   'id': 'BGD',
   'incomeLevel': {'id': 'LMC', 'value': 'Lower middle income'},
   'iso2Code': 'BD',
   'latitude': '23.7055',
   'lendingType': {'id': 'IDX', 'value': 'IDA'},
   'longitude': '90.4113',
   'name': 'Bangladesh',
   'region': {'id': 'SAS', 'value': 'South Asia'}},
  {'adminregion': {'id': 'LAC',
    'value': 'Latin America & Caribbean (excluding high income)'},
   'capitalCity': 'La Paz',
   'id': 'BOL',
   'incomeLevel': {'id': 'LMC', 'value': 'Lower middle income'},
   'iso2Code': 'BO',
   'latitude': '-13.9908',
   'lendingType': {'id': 'IBD', 'value': 'IBRD'},
   'longitude': '-66.1936',
   'name': 'Bolivia',
   'region': {'id': 'LCN', 'value': 'Latin America & Caribbean '}},
  {'adminregion': {'id': 'SAS', 'value': 'South Asia'},
   'capitalCity': 'Thimphu',
   'id': 'BTN',
   'incomeLevel': {'id': 'LMC', 'value': 'Lower middle income'},
   'iso2Code': 'BT',
   'latitude': '27.5768',
   'lendingType': {'id': 'IDX', 'value': 'IDA'},
   'longitude': '89.6177',
   'name': 'Bhutan',
   'region': {'id': 'SAS', 'value': 'South Asia'}},
  {'adminregion': {'id': 'SSA',
    'value': 'Sub-Saharan Africa (excluding high income)'},
   'capitalCity': 'Yamoussoukro',
   'id': 'CIV',
   'incomeLevel': {'id': 'LMC', 'value': 'Lower middle income'},
   'iso2Code': 'CI',
   'latitude': '5.332',
   'lendingType': {'id': 'IDX', 'value': 'IDA'},
   'longitude': '-4.0305',
   'name': "Cote d'Ivoire",
   'region': {'id': 'SSF', 'value': 'Sub-Saharan Africa '}},
  {'adminregion': {'id': 'SSA',
    'value': 'Sub-Saharan Africa (excluding high income)'},
   'capitalCity': 'Yaounde',
   'id': 'CMR',
   'incomeLevel': {'id': 'LMC', 'value': 'Lower middle income'},
   'iso2Code': 'CM',
   'latitude': '3.8721',
   'lendingType': {'id': 'IDB', 'value': 'Blend'},
   'longitude': '11.5174',
   'name': 'Cameroon',
   'region': {'id': 'SSF', 'value': 'Sub-Saharan Africa '}},
  {'adminregion': {'id': 'SSA',
    'value': 'Sub-Saharan Africa (excluding high income)'},
   'capitalCity': 'Brazzaville',
   'id': 'COG',
   'incomeLevel': {'id': 'LMC', 'value': 'Lower middle income'},
   'iso2Code': 'CG',
   'latitude': '-4.2767',
   'lendingType': {'id': 'IDB', 'value': 'Blend'},
   'longitude': '15.2662',
   'name': 'Congo, Rep.',
   'region': {'id': 'SSF', 'value': 'Sub-Saharan Africa '}},
  {'adminregion': {'id': 'SSA',
    'value': 'Sub-Saharan Africa (excluding high income)'},
   'capitalCity': 'Praia',
   'id': 'CPV',
   'incomeLevel': {'id': 'LMC', 'value': 'Lower middle income'},
   'iso2Code': 'CV',
   'latitude': '14.9218',
   'lendingType': {'id': 'IDB', 'value': 'Blend'},
   'longitude': '-23.5087',
   'name': 'Cabo Verde',
   'region': {'id': 'SSF', 'value': 'Sub-Saharan Africa '}},
  {'adminregion': {'id': 'MNA',
    'value': 'Middle East & North Africa (excluding high income)'},
   'capitalCity': 'Djibouti',
   'id': 'DJI',
   'incomeLevel': {'id': 'LMC', 'value': 'Lower middle income'},
   'iso2Code': 'DJ',
   'latitude': '11.5806',
   'lendingType': {'id': 'IDX', 'value': 'IDA'},
   'longitude': '43.1425',
   'name': 'Djibouti',
   'region': {'id': 'MEA', 'value': 'Middle East & North Africa'}},
  {'adminregion': {'id': 'MNA',
    'value': 'Middle East & North Africa (excluding high income)'},
   'capitalCity': 'Cairo',
   'id': 'EGY',
   'incomeLevel': {'id': 'LMC', 'value': 'Lower middle income'},
   'iso2Code': 'EG',
   'latitude': '30.0982',
   'lendingType': {'id': 'IBD', 'value': 'IBRD'},
   'longitude': '31.2461',
   'name': 'Egypt, Arab Rep.',
   'region': {'id': 'MEA', 'value': 'Middle East & North Africa'}},
  {'adminregion': {'id': 'EAP',
    'value': 'East Asia & Pacific (excluding high income)'},
   'capitalCity': 'Palikir',
   'id': 'FSM',
   'incomeLevel': {'id': 'LMC', 'value': 'Lower middle income'},
   'iso2Code': 'FM',
   'latitude': '6.91771',
   'lendingType': {'id': 'IDX', 'value': 'IDA'},
   'longitude': '158.185',
   'name': 'Micronesia, Fed. Sts.',
   'region': {'id': 'EAS', 'value': 'East Asia & Pacific'}},
  {'adminregion': {'id': 'ECA',
    'value': 'Europe & Central Asia (excluding high income)'},
   'capitalCity': 'Tbilisi',
   'id': 'GEO',
   'incomeLevel': {'id': 'LMC', 'value': 'Lower middle income'},
   'iso2Code': 'GE',
   'latitude': '41.71',
   'lendingType': {'id': 'IBD', 'value': 'IBRD'},
   'longitude': '44.793',
   'name': 'Georgia',
   'region': {'id': 'ECS', 'value': 'Europe & Central Asia'}},
  {'adminregion': {'id': 'SSA',
    'value': 'Sub-Saharan Africa (excluding high income)'},
   'capitalCity': 'Accra',
   'id': 'GHA',
   'incomeLevel': {'id': 'LMC', 'value': 'Lower middle income'},
   'iso2Code': 'GH',
   'latitude': '5.57045',
   'lendingType': {'id': 'IDX', 'value': 'IDA'},
   'longitude': '-0.20795',
   'name': 'Ghana',
   'region': {'id': 'SSF', 'value': 'Sub-Saharan Africa '}},
  {'adminregion': {'id': 'LAC',
    'value': 'Latin America & Caribbean (excluding high income)'},
   'capitalCity': 'Guatemala City',
   'id': 'GTM',
   'incomeLevel': {'id': 'LMC', 'value': 'Lower middle income'},
   'iso2Code': 'GT',
   'latitude': '14.6248',
   'lendingType': {'id': 'IBD', 'value': 'IBRD'},
   'longitude': '-90.5328',
   'name': 'Guatemala',
   'region': {'id': 'LCN', 'value': 'Latin America & Caribbean '}},
  {'adminregion': {'id': 'LAC',
    'value': 'Latin America & Caribbean (excluding high income)'},
   'capitalCity': 'Tegucigalpa',
   'id': 'HND',
   'incomeLevel': {'id': 'LMC', 'value': 'Lower middle income'},
   'iso2Code': 'HN',
   'latitude': '15.1333',
   'lendingType': {'id': 'IDX', 'value': 'IDA'},
   'longitude': '-87.4667',
   'name': 'Honduras',
   'region': {'id': 'LCN', 'value': 'Latin America & Caribbean '}},
  {'adminregion': {'id': 'EAP',
    'value': 'East Asia & Pacific (excluding high income)'},
   'capitalCity': 'Jakarta',
   'id': 'IDN',
   'incomeLevel': {'id': 'LMC', 'value': 'Lower middle income'},
   'iso2Code': 'ID',
   'latitude': '-6.19752',
   'lendingType': {'id': 'IBD', 'value': 'IBRD'},
   'longitude': '106.83',
   'name': 'Indonesia',
   'region': {'id': 'EAS', 'value': 'East Asia & Pacific'}},
  {'adminregion': {'id': 'SAS', 'value': 'South Asia'},
   'capitalCity': 'New Delhi',
   'id': 'IND',
   'incomeLevel': {'id': 'LMC', 'value': 'Lower middle income'},
   'iso2Code': 'IN',
   'latitude': '28.6353',
   'lendingType': {'id': 'IBD', 'value': 'IBRD'},
   'longitude': '77.225',
   'name': 'India',
   'region': {'id': 'SAS', 'value': 'South Asia'}},
  {'adminregion': {'id': 'MNA',
    'value': 'Middle East & North Africa (excluding high income)'},
   'capitalCity': 'Amman',
   'id': 'JOR',
   'incomeLevel': {'id': 'LMC', 'value': 'Lower middle income'},
   'iso2Code': 'JO',
   'latitude': '31.9497',
   'lendingType': {'id': 'IBD', 'value': 'IBRD'},
   'longitude': '35.9263',
   'name': 'Jordan',
   'region': {'id': 'MEA', 'value': 'Middle East & North Africa'}},
  {'adminregion': {'id': 'SSA',
    'value': 'Sub-Saharan Africa (excluding high income)'},
   'capitalCity': 'Nairobi',
   'id': 'KEN',
   'incomeLevel': {'id': 'LMC', 'value': 'Lower middle income'},
   'iso2Code': 'KE',
   'latitude': '-1.27975',
   'lendingType': {'id': 'IDB', 'value': 'Blend'},
   'longitude': '36.8126',
   'name': 'Kenya',
   'region': {'id': 'SSF', 'value': 'Sub-Saharan Africa '}},
  {'adminregion': {'id': 'ECA',
    'value': 'Europe & Central Asia (excluding high income)'},
   'capitalCity': 'Bishkek',
   'id': 'KGZ',
   'incomeLevel': {'id': 'LMC', 'value': 'Lower middle income'},
   'iso2Code': 'KG',
   'latitude': '42.8851',
   'lendingType': {'id': 'IDX', 'value': 'IDA'},
   'longitude': '74.6057',
   'name': 'Kyrgyz Republic',
   'region': {'id': 'ECS', 'value': 'Europe & Central Asia'}},
  {'adminregion': {'id': 'EAP',
    'value': 'East Asia & Pacific (excluding high income)'},
   'capitalCity': 'Phnom Penh',
   'id': 'KHM',
   'incomeLevel': {'id': 'LMC', 'value': 'Lower middle income'},
   'iso2Code': 'KH',
   'latitude': '11.5556',
   'lendingType': {'id': 'IDX', 'value': 'IDA'},
   'longitude': '104.874',
   'name': 'Cambodia',
   'region': {'id': 'EAS', 'value': 'East Asia & Pacific'}},
  {'adminregion': {'id': 'EAP',
    'value': 'East Asia & Pacific (excluding high income)'},
   'capitalCity': 'Tarawa',
   'id': 'KIR',
   'incomeLevel': {'id': 'LMC', 'value': 'Lower middle income'},
   'iso2Code': 'KI',
   'latitude': '1.32905',
   'lendingType': {'id': 'IDX', 'value': 'IDA'},
   'longitude': '172.979',
   'name': 'Kiribati',
   'region': {'id': 'EAS', 'value': 'East Asia & Pacific'}},
  {'adminregion': {'id': 'EAP',
    'value': 'East Asia & Pacific (excluding high income)'},
   'capitalCity': 'Vientiane',
   'id': 'LAO',
   'incomeLevel': {'id': 'LMC', 'value': 'Lower middle income'},
   'iso2Code': 'LA',
   'latitude': '18.5826',
   'lendingType': {'id': 'IDX', 'value': 'IDA'},
   'longitude': '102.177',
   'name': 'Lao PDR',
   'region': {'id': 'EAS', 'value': 'East Asia & Pacific'}},
  {'adminregion': {'id': 'SAS', 'value': 'South Asia'},
   'capitalCity': 'Colombo',
   'id': 'LKA',
   'incomeLevel': {'id': 'LMC', 'value': 'Lower middle income'},
   'iso2Code': 'LK',
   'latitude': '6.92148',
   'lendingType': {'id': 'IBD', 'value': 'IBRD'},
   'longitude': '79.8528',
   'name': 'Sri Lanka',
   'region': {'id': 'SAS', 'value': 'South Asia'}},
  {'adminregion': {'id': 'SSA',
    'value': 'Sub-Saharan Africa (excluding high income)'},
   'capitalCity': 'Maseru',
   'id': 'LSO',
   'incomeLevel': {'id': 'LMC', 'value': 'Lower middle income'},
   'iso2Code': 'LS',
   'latitude': '-29.5208',
   'lendingType': {'id': 'IDX', 'value': 'IDA'},
   'longitude': '27.7167',
   'name': 'Lesotho',
   'region': {'id': 'SSF', 'value': 'Sub-Saharan Africa '}},
  {'adminregion': {'id': 'MNA',
    'value': 'Middle East & North Africa (excluding high income)'},
   'capitalCity': 'Rabat',
   'id': 'MAR',
   'incomeLevel': {'id': 'LMC', 'value': 'Lower middle income'},
   'iso2Code': 'MA',
   'latitude': '33.9905',
   'lendingType': {'id': 'IBD', 'value': 'IBRD'},
   'longitude': '-6.8704',
   'name': 'Morocco',
   'region': {'id': 'MEA', 'value': 'Middle East & North Africa'}},
  {'adminregion': {'id': 'ECA',
    'value': 'Europe & Central Asia (excluding high income)'},
   'capitalCity': 'Chisinau',
   'id': 'MDA',
   'incomeLevel': {'id': 'LMC', 'value': 'Lower middle income'},
   'iso2Code': 'MD',
   'latitude': '47.0167',
   'lendingType': {'id': 'IDB', 'value': 'Blend'},
   'longitude': '28.8497',
   'name': 'Moldova',
   'region': {'id': 'ECS', 'value': 'Europe & Central Asia'}},
  {'adminregion': {'id': 'EAP',
    'value': 'East Asia & Pacific (excluding high income)'},
   'capitalCity': 'Naypyidaw',
   'id': 'MMR',
   'incomeLevel': {'id': 'LMC', 'value': 'Lower middle income'},
   'iso2Code': 'MM',
   'latitude': '21.914',
   'lendingType': {'id': 'IDX', 'value': 'IDA'},
   'longitude': '95.9562',
   'name': 'Myanmar',
   'region': {'id': 'EAS', 'value': 'East Asia & Pacific'}},
  {'adminregion': {'id': 'EAP',
    'value': 'East Asia & Pacific (excluding high income)'},
   'capitalCity': 'Ulaanbaatar',
   'id': 'MNG',
   'incomeLevel': {'id': 'LMC', 'value': 'Lower middle income'},
   'iso2Code': 'MN',
   'latitude': '47.9129',
   'lendingType': {'id': 'IDB', 'value': 'Blend'},
   'longitude': '106.937',
   'name': 'Mongolia',
   'region': {'id': 'EAS', 'value': 'East Asia & Pacific'}},
  {'adminregion': {'id': 'SSA',
    'value': 'Sub-Saharan Africa (excluding high income)'},
   'capitalCity': 'Nouakchott',
   'id': 'MRT',
   'incomeLevel': {'id': 'LMC', 'value': 'Lower middle income'},
   'iso2Code': 'MR',
   'latitude': '18.2367',
   'lendingType': {'id': 'IDX', 'value': 'IDA'},
   'longitude': '-15.9824',
   'name': 'Mauritania',
   'region': {'id': 'SSF', 'value': 'Sub-Saharan Africa '}},
  {'adminregion': {'id': 'SSA',
    'value': 'Sub-Saharan Africa (excluding high income)'},
   'capitalCity': 'Abuja',
   'id': 'NGA',
   'incomeLevel': {'id': 'LMC', 'value': 'Lower middle income'},
   'iso2Code': 'NG',
   'latitude': '9.05804',
   'lendingType': {'id': 'IDB', 'value': 'Blend'},
   'longitude': '7.48906',
   'name': 'Nigeria',
   'region': {'id': 'SSF', 'value': 'Sub-Saharan Africa '}},
  {'adminregion': {'id': 'LAC',
    'value': 'Latin America & Caribbean (excluding high income)'},
   'capitalCity': 'Managua',
   'id': 'NIC',
   'incomeLevel': {'id': 'LMC', 'value': 'Lower middle income'},
   'iso2Code': 'NI',
   'latitude': '12.1475',
   'lendingType': {'id': 'IDX', 'value': 'IDA'},
   'longitude': '-86.2734',
   'name': 'Nicaragua',
   'region': {'id': 'LCN', 'value': 'Latin America & Caribbean '}},
  {'adminregion': {'id': 'SAS', 'value': 'South Asia'},
   'capitalCity': 'Islamabad',
   'id': 'PAK',
   'incomeLevel': {'id': 'LMC', 'value': 'Lower middle income'},
   'iso2Code': 'PK',
   'latitude': '30.5167',
   'lendingType': {'id': 'IDB', 'value': 'Blend'},
   'longitude': '72.8',
   'name': 'Pakistan',
   'region': {'id': 'SAS', 'value': 'South Asia'}},
  {'adminregion': {'id': 'EAP',
    'value': 'East Asia & Pacific (excluding high income)'},
   'capitalCity': 'Manila',
   'id': 'PHL',
   'incomeLevel': {'id': 'LMC', 'value': 'Lower middle income'},
   'iso2Code': 'PH',
   'latitude': '14.5515',
   'lendingType': {'id': 'IBD', 'value': 'IBRD'},
   'longitude': '121.035',
   'name': 'Philippines',
   'region': {'id': 'EAS', 'value': 'East Asia & Pacific'}},
  {'adminregion': {'id': 'EAP',
    'value': 'East Asia & Pacific (excluding high income)'},
   'capitalCity': 'Port Moresby',
   'id': 'PNG',
   'incomeLevel': {'id': 'LMC', 'value': 'Lower middle income'},
   'iso2Code': 'PG',
   'latitude': '-9.47357',
   'lendingType': {'id': 'IDB', 'value': 'Blend'},
   'longitude': '147.194',
   'name': 'Papua New Guinea',
   'region': {'id': 'EAS', 'value': 'East Asia & Pacific'}},
  {'adminregion': {'id': 'MNA',
    'value': 'Middle East & North Africa (excluding high income)'},
   'capitalCity': '',
   'id': 'PSE',
   'incomeLevel': {'id': 'LMC', 'value': 'Lower middle income'},
   'iso2Code': 'PS',
   'latitude': '',
   'lendingType': {'id': 'LNX', 'value': 'Not classified'},
   'longitude': '',
   'name': 'West Bank and Gaza',
   'region': {'id': 'MEA', 'value': 'Middle East & North Africa'}},
  {'adminregion': {'id': 'SSA',
    'value': 'Sub-Saharan Africa (excluding high income)'},
   'capitalCity': 'Khartoum',
   'id': 'SDN',
   'incomeLevel': {'id': 'LMC', 'value': 'Lower middle income'},
   'iso2Code': 'SD',
   'latitude': '15.5932',
   'lendingType': {'id': 'IDX', 'value': 'IDA'},
   'longitude': '32.5363',
   'name': 'Sudan',
   'region': {'id': 'SSF', 'value': 'Sub-Saharan Africa '}},
  {'adminregion': {'id': 'EAP',
    'value': 'East Asia & Pacific (excluding high income)'},
   'capitalCity': 'Honiara',
   'id': 'SLB',
   'incomeLevel': {'id': 'LMC', 'value': 'Lower middle income'},
   'iso2Code': 'SB',
   'latitude': '-9.42676',
   'lendingType': {'id': 'IDX', 'value': 'IDA'},
   'longitude': '159.949',
   'name': 'Solomon Islands',
   'region': {'id': 'EAS', 'value': 'East Asia & Pacific'}},
  {'adminregion': {'id': 'LAC',
    'value': 'Latin America & Caribbean (excluding high income)'},
   'capitalCity': 'San Salvador',
   'id': 'SLV',
   'incomeLevel': {'id': 'LMC', 'value': 'Lower middle income'},
   'iso2Code': 'SV',
   'latitude': '13.7034',
   'lendingType': {'id': 'IBD', 'value': 'IBRD'},
   'longitude': '-89.2073',
   'name': 'El Salvador',
   'region': {'id': 'LCN', 'value': 'Latin America & Caribbean '}},
  {'adminregion': {'id': 'SSA',
    'value': 'Sub-Saharan Africa (excluding high income)'},
   'capitalCity': 'Sao Tome',
   'id': 'STP',
   'incomeLevel': {'id': 'LMC', 'value': 'Lower middle income'},
   'iso2Code': 'ST',
   'latitude': '0.20618',
   'lendingType': {'id': 'IDX', 'value': 'IDA'},
   'longitude': '6.6071',
   'name': 'Sao Tome and Principe',
   'region': {'id': 'SSF', 'value': 'Sub-Saharan Africa '}},
  {'adminregion': {'id': 'SSA',
    'value': 'Sub-Saharan Africa (excluding high income)'},
   'capitalCity': 'Mbabane',
   'id': 'SWZ',
   'incomeLevel': {'id': 'LMC', 'value': 'Lower middle income'},
   'iso2Code': 'SZ',
   'latitude': '-26.5225',
   'lendingType': {'id': 'IBD', 'value': 'IBRD'},
   'longitude': '31.4659',
   'name': 'Swaziland',
   'region': {'id': 'SSF', 'value': 'Sub-Saharan Africa '}},
  {'adminregion': {'id': 'MNA',
    'value': 'Middle East & North Africa (excluding high income)'},
   'capitalCity': 'Damascus',
   'id': 'SYR',
   'incomeLevel': {'id': 'LMC', 'value': 'Lower middle income'},
   'iso2Code': 'SY',
   'latitude': '33.5146',
   'lendingType': {'id': 'IDX', 'value': 'IDA'},
   'longitude': '36.3119',
   'name': 'Syrian Arab Republic',
   'region': {'id': 'MEA', 'value': 'Middle East & North Africa'}},
  {'adminregion': {'id': 'ECA',
    'value': 'Europe & Central Asia (excluding high income)'},
   'capitalCity': 'Dushanbe',
   'id': 'TJK',
   'incomeLevel': {'id': 'LMC', 'value': 'Lower middle income'},
   'iso2Code': 'TJ',
   'latitude': '38.5878',
   'lendingType': {'id': 'IDX', 'value': 'IDA'},
   'longitude': '68.7864',
   'name': 'Tajikistan',
   'region': {'id': 'ECS', 'value': 'Europe & Central Asia'}},
  {'adminregion': {'id': 'EAP',
    'value': 'East Asia & Pacific (excluding high income)'},
   'capitalCity': 'Dili',
   'id': 'TLS',
   'incomeLevel': {'id': 'LMC', 'value': 'Lower middle income'},
   'iso2Code': 'TL',
   'latitude': '-8.56667',
   'lendingType': {'id': 'IDB', 'value': 'Blend'},
   'longitude': '125.567',
   'name': 'Timor-Leste',
   'region': {'id': 'EAS', 'value': 'East Asia & Pacific'}},
  {'adminregion': {'id': 'MNA',
    'value': 'Middle East & North Africa (excluding high income)'},
   'capitalCity': 'Tunis',
   'id': 'TUN',
   'incomeLevel': {'id': 'LMC', 'value': 'Lower middle income'},
   'iso2Code': 'TN',
   'latitude': '36.7899',
   'lendingType': {'id': 'IBD', 'value': 'IBRD'},
   'longitude': '10.21',
   'name': 'Tunisia',
   'region': {'id': 'MEA', 'value': 'Middle East & North Africa'}},
  {'adminregion': {'id': 'ECA',
    'value': 'Europe & Central Asia (excluding high income)'},
   'capitalCity': 'Kiev',
   'id': 'UKR',
   'incomeLevel': {'id': 'LMC', 'value': 'Lower middle income'},
   'iso2Code': 'UA',
   'latitude': '50.4536',
   'lendingType': {'id': 'IBD', 'value': 'IBRD'},
   'longitude': '30.5038',
   'name': 'Ukraine',
   'region': {'id': 'ECS', 'value': 'Europe & Central Asia'}},
  {'adminregion': {'id': 'ECA',
    'value': 'Europe & Central Asia (excluding high income)'},
   'capitalCity': 'Tashkent',
   'id': 'UZB',
   'incomeLevel': {'id': 'LMC', 'value': 'Lower middle income'},
   'iso2Code': 'UZ',
   'latitude': '41.3052',
   'lendingType': {'id': 'IDB', 'value': 'Blend'},
   'longitude': '69.269',
   'name': 'Uzbekistan',
   'region': {'id': 'ECS', 'value': 'Europe & Central Asia'}},
  {'adminregion': {'id': 'EAP',
    'value': 'East Asia & Pacific (excluding high income)'},
   'capitalCity': 'Hanoi',
   'id': 'VNM',
   'incomeLevel': {'id': 'LMC', 'value': 'Lower middle income'},
   'iso2Code': 'VN',
   'latitude': '21.0069',
   'lendingType': {'id': 'IBD', 'value': 'IBRD'},
   'longitude': '105.825',
   'name': 'Vietnam',
   'region': {'id': 'EAS', 'value': 'East Asia & Pacific'}},
  {'adminregion': {'id': 'EAP',
    'value': 'East Asia & Pacific (excluding high income)'},
   'capitalCity': 'Port-Vila',
   'id': 'VUT',
   'incomeLevel': {'id': 'LMC', 'value': 'Lower middle income'},
   'iso2Code': 'VU',
   'latitude': '-17.7404',
   'lendingType': {'id': 'IDX', 'value': 'IDA'},
   'longitude': '168.321',
   'name': 'Vanuatu',
   'region': {'id': 'EAS', 'value': 'East Asia & Pacific'}}]]
data_json[0]
# On voit qu'il y a nous manque des informations :
# il y a un total de 52 éléments
data_json_page_2 = requests.get("http://api.worldbank.org/countries?incomeLevel=LMC&format=json&page=2").json()
# pour obtenir une observation
# on voit dans l'objet que l'élément 0 correspond à des informations sur les pages
data_json[1][0]
{'adminregion': {'id': 'SSA',
  'value': 'Sub-Saharan Africa (excluding high income)'},
 'capitalCity': 'Luanda',
 'id': 'AGO',
 'incomeLevel': {'id': 'LMC', 'value': 'Lower middle income'},
 'iso2Code': 'AO',
 'latitude': '-8.81155',
 'lendingType': {'id': 'IBD', 'value': 'IBRD'},
 'longitude': '13.242',
 'name': 'Angola',
 'region': {'id': 'SSF', 'value': 'Sub-Saharan Africa '}}

Faire appel à l’API de Tastekid

La Banque Mondiale c’était assez soft : on va passer sur du un peu plus costaud. On va utiliser l’API de Tastekid, site de recommandations de films, livres etc.

Pour cela, il faut commencer par créer un compte :

import keyring, os
key = keyring.get_password("tastekid", "ensae_teaching_cs,key")

Pour demander à l’API quels sont les oeuvres similaires à Pulp Fiction, nous utilisons la requête suivante

recommandations_res = requests.get("https://www.tastekid.com/api/similar?q=pulp+fiction&info=1&k={}".format(key))
try:
    recommandations = recommandations_res.json()
except Exception as e:
    # Parfois le formart json est mal formé. On regarde pourquoi.
    raise Exception(recommandations_res.text) from e
# on nous rappelle les informations sur l'élement que l'on recherche : Pulp Fiction
recommandations['Similar']['Info']
[{'Name': 'Pulp Fiction',
  'Type': 'movie',
  'wTeaser': 'Pulp Fiction is a 1994 American black comedy neo-noir crime film written and directed by Quentin Tarantino, from a story by Tarantino and Roger Avary, and starring John Travolta, Samuel L. Jackson, Bruce Willis, Ving Rhames, and Uma Thurman. Directed in a highly stylized manner, the film tells a few stories of criminal Los Angeles. The film's title refers to the pulp magazines and hardboiled crime novels popular during the mid-20th century, known for their graphic violence and punchy dialogue.The screenplay of Pulp Fiction was written in 1992 and 1993, and incorporated some scenes originally written by Avary for True Romance. Its plot is presented out of chronological order. The film is also self-referential from its opening moments, beginning with a title card that gives two dictionary definitions of "pulp". Considerable screen time is devoted to monologues and casual conversations with eclectic dialogue revealing each character's perspectives on several subjects, and the film features an ironic combination of humor and strong violence. Its script was reportedly turned down by Columbia TriStar as "too demented". Miramax co-chairman Harvey Weinstein was instantly enthralled with it, however, and the film became the first that Miramax fully financed.',
  'wUrl': 'http://en.wikipedia.org/wiki/Pulp_Fiction_(movie)',
  'yID': 's7EdQ4FqbhY',
  'yUrl': 'https://www.youtube-nocookie.com/embed/s7EdQ4FqbhY'}]
# on nous donnes des livres / filmes proches selon le gout des gens
for element in recommandations['Similar']['Results'] :
    print(element['Name'],element['Type'])
Reservoir Dogs movie
Kill Bill movie
Death Proof movie
Jackie Brown movie
Inglourious Basterds movie
From Dusk Till Dawn movie
The Big Lebowski movie
Goodfellas movie
Four Rooms movie
Taxi Driver movie
Snatch movie
Django Unchained movie
Sin City movie
Natural Born Killers movie
Full Metal Jacket movie
Trainspotting movie
Lock, Stock And Two Smoking Barrels movie
No Country For Old Men movie
Scarface movie
A Clockwork Orange movie

On peut aussi ne demander que des films, on ajoute juste l’option type = movies dans l’url

recommandations_films = requests.get("https://www.tastekid.com/api/similar?q=pulp+fiction&type=movies&info=1&k={}"
                               .format(key)).json()
# on nous donnes des livres / filmes proches selon le gout des gens
for element in recommandations_films['Similar']['Results'] :
    print(element['Name'],element['Type'])
Reservoir Dogs movie
Kill Bill movie
Death Proof movie
Jackie Brown movie
Inglourious Basterds movie
From Dusk Till Dawn movie
The Big Lebowski movie
Goodfellas movie
Four Rooms movie
Taxi Driver movie
Snatch movie
Django Unchained movie
Sin City movie
Natural Born Killers movie
Full Metal Jacket movie
Trainspotting movie
Lock, Stock And Two Smoking Barrels movie
No Country For Old Men movie
Scarface movie
A Clockwork Orange movie
film_suivant = "Reservoir Dogs"
recommandations_suivantes_films = requests.get("https://www.tastekid.com/api/similar?q={}&type=movies&info=1&k={}"
                               .format(film_suivant, key)).json()
# on nous donnes des livres / filmes proches selon le gout des gens
for element in recommandations_suivantes_films['Similar']['Results'] :
    print(element['Name'],element['Type'])
Jackie Brown movie
From Dusk Till Dawn movie
Death Proof movie
Four Rooms movie
Planet Terror movie
Lock, Stock And Two Smoking Barrels movie
Taxi Driver movie
Natural Born Killers movie
True Romance movie
Snatch movie
Sin City movie
Rocknrolla movie
Goodfellas movie
Fargo movie
No Country For Old Men movie
Grindhouse movie
Full Metal Jacket movie
The Usual Suspects movie
Kill Bill movie
Inglourious Basterds movie
## On peut ensuite comparer les films communs aux deux recherches
liste1 = [element['Name'] for element in recommandations_films['Similar']['Results'] ]
liste2 = [element['Name'] for element in recommandations_suivantes_films['Similar']['Results'] ]
films_commun = set(liste1).intersection(liste2)
films_commun, len(films_commun)
({'Death Proof',
  'Four Rooms',
  'From Dusk Till Dawn',
  'Full Metal Jacket',
  'Goodfellas',
  'Inglourious Basterds',
  'Jackie Brown',
  'Kill Bill',
  'Lock, Stock And Two Smoking Barrels',
  'Natural Born Killers',
  'No Country For Old Men',
  'Sin City',
  'Snatch',
  'Taxi Driver'},
 14)
films_non_partages = [f for f in liste1 if f not in liste2] + [f for f in liste2 if f not in liste1]
films_non_partages
['Reservoir Dogs',
 'The Big Lebowski',
 'Django Unchained',
 'Trainspotting',
 'Scarface',
 'A Clockwork Orange',
 'Planet Terror',
 'True Romance',
 'Rocknrolla',
 'Fargo',
 'Grindhouse',
 'The Usual Suspects']

A partir de ces requêtes, on peut facilement construire le réseau des films que les gens aiment en utilisant le package networkx.