API de diffusion de la base SIRENE de l'INSEE

4 288 vues

Publié le

Le répertoire des entreprises est sous Licence ouverte depuis le 4 Janvier. Il s'agit d'un fichier de 10 millions de ligne au format CSV. Je vous propose de créer vous même l'API qui vous permettra d'exploiter la base SIRENE.

Publié dans : Données & analyses
1 commentaire
5 j’aime
Statistiques
Remarques
Aucun téléchargement
Vues
Nombre de vues
4 288
Sur SlideShare
0
Issues des intégrations
0
Intégrations
36
Actions
Partages
0
Téléchargements
59
Commentaires
1
J’aime
5
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

API de diffusion de la base SIRENE de l'INSEE

  1. 1. API de diffusion de la base SIRENE de l’INSEE Publié le 9 Janvier 2017
  2. 2. Rappel sur le répertoire SIRENE de l’INSEE  Système d'Identification du Répertoire des ENtreprises et de leurs Etablissements  Environ 10 millions d’établissements actifs  SIREN : numéro unique pour identifier les entreprises françaises, constitué de 9 chiffres  SIRET : numéro unique pour identifier les établissements français, constitué du SIREN suivi du NIC (Numéro Interne de Classement constitué de 5 chiffres)  Eléments d'identification et d'adresses des établissements au format postal  Eléments sur la localisation géographique de l'établissement (région, département, commune, rue...)  Caractéristiques économiques de l'établissement et de l'entreprise (activité, tranche d'effectifs, chiffre d'affaires...)  Caractère exploitant de l'établissement ou de l'entreprise  Activités secondaires  Date de création de l'entreprise…
  3. 3. La Base SIRENE est sous Licence Ouverte depuis le 4 Janvier 2017  https://www.data.gouv.fr/fr/datasets/base-sirene-des-entreprises-et-de-leurs- etablissements-siren-siret/  Le 6 Janvier, on apprend que : « L'ouverture d'une API, qui complètera la diffusion des données Sirene courant 2017, est à l'étude. Elle permettra notamment à l'utilisateur de choisir de recevoir les données en JSON ou en XML. »  Pour ceux qui ne peuvent pas attendre, je propose de créer une API, rapidement et simplement. C’est parti pour 9 étapes…
  4. 4. 1. Installation de MySQL, Apache, et PHP Pour aller au plus simple, j’ai choisi d’installer WampServer qui intègre les trois.  http://www.wampserver.com/  WampServer est une plate-forme de développement Web sous Windows pour des applications Web dynamiques à l’aide du serveur Apache2, du langage de scripts PHP et d’une base de données MySQL. Il possède également PHPMyAdmin pour gérer plus facilement vos bases de données. 1/9
  5. 5. 2. Création de la base INSEE  Si WampServer est démarré, vous avez accès à http://localhost  Et à http://localhost/phpmyadmin/  Exécution de la requête SQL suivante : 2/9 CREATE DATABASE insee;
  6. 6. 3. Création de la table SIRENE  Pour aller au plus simple, j’ai choisi de mettre tous les champs sous le type CHAR ou VARCHAR en respectant les tailles données dans le dessin « L2 https://www.sirene.fr/static- resources/doc/dessin_L2_description_complete.pdf?version=1.14  Exécution de la requête SQL suivante : CREATE TABLE SIRENE ( SIREN CHAR(9), NIC CHAR(5), L1_NORMALISEE VARCHAR(38), L2_NORMALISEE VARCHAR(38), L3_NORMALISEE VARCHAR(38), L4_NORMALISEE VARCHAR(38), L5_NORMALISEE VARCHAR(38), L6_NORMALISEE VARCHAR(38), L7_NORMALISEE VARCHAR(38), L1_DECLAREE VARCHAR(38), L2_DECLAREE VARCHAR(38), L3_DECLAREE VARCHAR(38), L4_DECLAREE VARCHAR(38), L5_DECLAREE VARCHAR(38), L6_DECLAREE VARCHAR(38), L7_DECLAREE VARCHAR(38), NUMVOIE VARCHAR(4), INDREP CHAR(1), TYPVOIE VARCHAR(4), LIBVOIE VARCHAR(32), CODPOS CHAR(5), CEDEX CHAR(5), RPET CHAR(2), LIBREG VARCHAR(70), DEPET CHAR(2), ARRONET CHAR(2), CTONET CHAR(3), COMET CHAR(3), LIBCOM VARCHAR(32), DU CHAR(2), TU CHAR(1), UU CHAR(2), EPCI CHAR(9), TCD CHAR(2), ZEMET CHAR(4), SIEGE CHAR(1), ENSEIGNE VARCHAR(50), IND_PUBLIPO CHAR(1), DIFFCOM CHAR(1), AMINTRET CHAR(6), NATETAB CHAR(1), LIBNATETAB VARCHAR(30), APET700 CHAR(5), LIBAPET VARCHAR(65), DAPET CHAR(4), TEFET CHAR(2), LIBTEFET VARCHAR(23), EFETCENT VARCHAR(6), DEFET CHAR(4), ORIGINE VARCHAR(2), DCRET CHAR(8), DDEBACT CHAR(8), ACTIVNAT CHAR(2), LIEUACT CHAR(2), ACTISURF CHAR(2), SAISONAT CHAR(2), MODET CHAR(1), PRODET CHAR(1), PRODPART CHAR(1), AUXILT CHAR(1), NOMEN_LONG VARCHAR(131), SIGLE VARCHAR(20), NOM VARCHAR(100), PRENOM VARCHAR(30), CIVILITE CHAR(1), RNA CHAR(10), NICSIEGE CHAR(5), RPEN CHAR(2), DEPCOMEN CHAR(5), ADR_MAIL VARCHAR(80), NJ CHAR(4), LIBNJ VARCHAR(100), APEN700 CHAR(5), LIBAPEN VARCHAR(65), DAPEN CHAR(4), APRM CHAR(6), ESS CHAR(1), DATEESS CHAR(8), TEFEN CHAR(2), LIBTEFEN VARCHAR(23), EFENCENT CHAR(6), DEFEN CHAR(4), CATEGORIE CHAR(5), DCREN CHAR(8), AMINTREN CHAR(6), MONOACT CHAR(1), MODEN CHAR(1), PRODEN CHAR(1), ESAANN CHAR(4), TCA CHAR(1), ESAAPEN CHAR(5), ESASEC1N CHAR(5), ESASEC2N CHAR(5), ESASEC3N CHAR(5), ESASEC4N CHAR(5), VMAJ CHAR(1), VMAJ1 CHAR(1), VMAJ2 CHAR(1), VMAJ3 CHAR(1), DATEMAJ CHAR(19) ) ; 3/9
  7. 7. 4. Chargement de la table SIRENE  Exécution de la requête SQL suivante : LOAD DATA LOCAL INFILE 'C:/Users/BG/Documents/Projet_API/SIRENE/sirc-17804_9075_14209_201612_L_M_20170104_171522721.csv' INTO TABLE insee.sirene FIELDS TERMINATED BY ';' ENCLOSED BY '"' LINES TERMINATED BY 'rn' IGNORE 1 LINES ;  Avec mon 2.30 GHz, le chargement a pris 5 minutes. 4/9
  8. 8. 5. Création de quelques INDEX  Pour aller au plus simple, j’ai choisi d’indexer les champs correspondant aux principaux critères que j’utilise le plus souvent.  Exécution de la requête SQL suivante : ALTER TABLE `sirene` ADD INDEX `Index 1` (`APEN700`), ADD INDEX `Index 2` (`RPET`), ADD INDEX `Index 3` (`SIEGE`), ADD INDEX `Index 4` (`DEPET`), ADD INDEX `Index 5` (`SIREN`);  Cette action dure plus longtemps ; elle a pris… le temps de prendre un café ;-) 5/9
  9. 9. 6. Une petite requête pour tester ? SELECT COUNT(*) FROM sirene WHERE APEN700="6311Z" AND SIEGE="1" AND RPET="11";  En 26 secondes j’ai mon compteur : 2811. 6/9
  10. 10. 7. Ajout un VirtualHost  http://localhost  Ne pas oublier de redémarrer les services avec WampServer 7/9
  11. 11. 8. Création de l’API en PHP 8/9 <?php $mysqli = new mysqli("localhost", "root", "", "insee"); if (mysqli_connect_errno()) { printf("Echec de la connexion : %sn", mysqli_connect_error()); exit(); } if (isset($_GET['q'])) { $query = "SELECT COUNT(*) FROM sirene WHERE " . $_GET['q']; if ($result = $mysqli->query($query)) { echo '{"nhits":'; $row = $result->fetch_assoc(); $counter = $row["COUNT(*)"]; echo $counter; echo ', "parameters": {"q": "' . $_GET['q'] . '", "format": "json", "facet": ["SIREN", "NIC", "RPET", "LIBREG", "DEPET", "LIBCOM", "SIEGE", "LIBNATETAB", "ACTIVNAT", "NOMEN_LONG", "ADR_MAIL", "NJ", "LIBNJ", "APEN700", "LIBAPEN", "DAPEN", "APRM", "TEFEN", "LIBTEFEN", "EFENCENT", "DEFEN", "CATEGORIE", "DCREN", "TCA"]}, '; $result->close(); } // si le compteur est inférieur à 40000 ok sinon message spécial if ($counter <= 40000) { $query = "SELECT SIREN,NIC,RPET,LIBREG,DEPET,LIBCOM,SIEGE,LIBNATETAB,ACTIVNAT,NOMEN_LONG,ADR_MAIL,NJ,LIBNJ,APEN700,LIBAPEN,DAPEN,APRM,TEFEN,LIBTEFEN,EFENCE NT,DEFEN,CATEGORIE,DCREN,TCA FROM sirene WHERE " . $_GET['q']; if ($result = $mysqli->query($query)) { echo '"records": ['; $row = $result->fetch_assoc(); $row = array_map('utf8_encode', $row); echo json_encode($row, JSON_UNESCAPED_UNICODE); while ($row = $result->fetch_assoc()) { $row = array_map('utf8_encode', $row); echo "," . json_encode($row, JSON_UNESCAPED_UNICODE); } echo ']}'; $result->close(); } $mysqli->close(); } else { echo '"errors": [{"source": { "parameter": "q" }, "title": "API Limited", "detail": "Max counter : 40000"}]}'; } } Else { echo '{"errors": [{"source": { "parameter": "q" }, "title": "Invalid Query Parameter", "detail": "For example ?q=APEN700='6311Z'+AND+SIEGE='1'+AND+RPET='11'"}]}'; } ?>
  12. 12. 9. Test de l’API  http://apisirene/apisirene.php  http://apisirene/apisirene.php?q=APEN700=’6311Z’+AND+SIEGE=’1’+AND+RPET=’11’ {"errors": [{"source": { "parameter": "q" }, "title": "Invalid Query Parameter", "detail": "For example ?q=APEN700='6311Z'+AND+SIEGE='1'+AND+RPET='11'"}]} {"nhits":2811, "parameters": {"q": "APEN700='6311Z' AND SIEGE='1' AND RPET='11'", "format": "json", "facet": ["SIREN", "NIC", "RPET", "LIBREG", "DEPET", "LIBCOM", "SIEGE", "LIBNATETAB", "ACTIVNAT", "NOMEN_LONG", "ADR_MAIL", "NJ", "LIBNJ", "APEN700", "LIBAPEN", "DAPEN", "APRM", "TEFEN", "LIBTEFEN", "EFENCENT", "DEFEN", "CATEGORIE", "DCREN", "TCA"]}, "records": [{"SIREN":"027350321","NIC":"00074","RPET":"11","LIBREG":"Île-de-France","DEPET":"75","LIBCOM":"PARIS 6","SIEGE":"1","LIBNATETAB":"","ACTIVNAT":"12","NOMEN_LONG":"OPENHEALTH COMPANY","ADR_MAIL":"","NJ":"5599","LIBNJ":"SA à conseil d'administration (s.a.i.)","APEN700":"6311Z","LIBAPEN":"Traitement de données, hébergement et activités connexes","DAPEN":"2009","APRM":"","TEFEN":"12","LIBTEFEN":"20 à 49 salariés","EFENCENT":"20","DEFEN":"2015","CATEGORIE":"PME","DCREN":"19730101","TCA":"5"},{"SIREN":"130021256","NIC":"00024","R PET":"11","LIBREG":"Île-de-France",… 9/9
  13. 13. Contactez votre Data Manager par téléphone ou par courriel : Benoit Génot 06.66.24.49.65 benoit.genot@decisioneo.fr

×