{"id":12303,"date":"2024-01-21T01:21:23","date_gmt":"2024-01-21T00:21:23","guid":{"rendered":"https:\/\/www.auditsi.eu\/?p=12303"},"modified":"2024-07-19T11:12:29","modified_gmt":"2024-07-19T09:12:29","slug":"python-automatiser-le-telechargement-en-masse-des-documents-juridiques-et-financiers-des-entreprises-au-format-pdf-a-laide-de-lapi-de-linpi","status":"publish","type":"post","link":"https:\/\/www.auditsi.eu\/?p=12303","title":{"rendered":"Python : automatiser le t\u00e9l\u00e9chargement en masse des documents juridiques et financiers des entreprises au format PDF \u00e0 l&#8217;aide de l&#8217;API de l&#8217;INPI"},"content":{"rendered":"<p style=\"text-align: justify;\">Le besoin en <strong>information sur les entreprises<\/strong> est croissant. Que ce soit pour \u00e9valuer la <strong>solvabilit\u00e9<\/strong> ou la fiabilit\u00e9 de clients et de fournisseurs avant d&#8217;entamer une relation commerciale, se conformer \u00e0 la <strong>loi Sapin 2<\/strong>, mener un <strong>audit d&#8217;acquisition<\/strong>..<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12304\" style=\"text-align: justify;\" src=\"https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/01\/PYTHON-API-INPI.png\" alt=\"PYTHON API INPI\" width=\"805\" height=\"610\" srcset=\"https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/01\/PYTHON-API-INPI.png 805w, https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/01\/PYTHON-API-INPI-300x227.png 300w, https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/01\/PYTHON-API-INPI-768x582.png 768w, https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/01\/PYTHON-API-INPI-730x553.png 730w\" sizes=\"auto, (max-width: 805px) 100vw, 805px\" \/><\/p>\n<p style=\"text-align: justify;\">L&#8217;INPI propose diff\u00e9rentes solutions pour acc\u00e9der aux <strong>informations juridiques et financi\u00e8res<\/strong> publi\u00e9es par les entreprises : <a href=\"https:\/\/www.auditsi.eu\/?p=8584\">portail<\/a>, FTP et API.<\/p>\n<p style=\"text-align: justify;\">L&#8217;objet de cet article est de fournir quelques clefs pour d\u00e9montrer tout l&#8217;int\u00e9r\u00eat d&#8217;utiliser un <strong>script Python<\/strong> pour automatiser la <strong>collecte en masse de la documentation juridique et financi\u00e8res<\/strong> des entreprises \u00e0 l&#8217;aide de <strong>requ\u00eates sur l&#8217;API<\/strong> (<em>Application Programming Interface<\/em> ou interface de programmation applicative) <strong>de l&#8217;INPI<\/strong>.<\/p>\n<p style=\"text-align: justify;\">Pour fonctionner le script Python n\u00e9cessite des identifiants de connexion \u00e0 l&#8217;API INPI stock\u00e9s dans un fichier texte nomm\u00e9 Identifiants_API_INPI.txt et une liste de num\u00e9ros SIREN enregistr\u00e9s dans un fichier intitul\u00e9 SIREN \u00e0 interroger.txt.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12307\" src=\"https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/01\/API-INPI-Fichiers.png\" alt=\"API INPI Fichiers\" width=\"604\" height=\"93\" srcset=\"https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/01\/API-INPI-Fichiers.png 604w, https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/01\/API-INPI-Fichiers-300x46.png 300w\" sizes=\"auto, (max-width: 604px) 100vw, 604px\" \/><\/p>\n<p style=\"text-align: justify;\">Pour obtenir ses identifiants, il faut au pr\u00e9alable s&#8217;inscrire sur le site de l&#8217;INPI : <a href=\"https:\/\/data.inpi.fr\/login\" target=\"_blank\" rel=\"noopener\">https:\/\/data.inpi.fr\/login<\/a>.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12321\" src=\"https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/01\/INPI-Connexion.png\" alt=\"INPI Connexion\" width=\"563\" height=\"556\" srcset=\"https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/01\/INPI-Connexion.png 563w, https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/01\/INPI-Connexion-300x296.png 300w, https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/01\/INPI-Connexion-120x120.png 120w\" sizes=\"auto, (max-width: 563px) 100vw, 563px\" \/><\/p>\n<p style=\"text-align: justify;\">Une fois l&#8217;inscription r\u00e9alis\u00e9e, se rendre dans l&#8217;espace personnel :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12322\" src=\"https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/01\/INPI-Espace-personnel.png\" alt=\"INPI Espace personnel\" width=\"268\" height=\"149\"><\/p>\n<p style=\"text-align: justify;\">Puis cliquer sur Mes acc\u00e8s APIS \/ SFTP puis Acc\u00e8s APIs RNE :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12323\" src=\"https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/01\/INPI-Mes-acces.png\" alt=\"INPI Mes acc\u00e8s\" width=\"1079\" height=\"384\" srcset=\"https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/01\/INPI-Mes-acces.png 1079w, https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/01\/INPI-Mes-acces-300x107.png 300w, https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/01\/INPI-Mes-acces-1024x364.png 1024w, https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/01\/INPI-Mes-acces-768x273.png 768w, https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/01\/INPI-Mes-acces-730x260.png 730w\" sizes=\"auto, (max-width: 1079px) 100vw, 1079px\" \/><\/p>\n<p>Ensuite, cliquer sur le bouton :<\/p>\n<p style=\"text-align: justify;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12324\" src=\"https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/01\/INPI-Demande-acces.png\" alt=\"INPI Demande acc\u00e8s\" width=\"397\" height=\"61\" srcset=\"https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/01\/INPI-Demande-acces.png 397w, https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/01\/INPI-Demande-acces-300x46.png 300w\" sizes=\"auto, (max-width: 397px) 100vw, 397px\" \/>Enfin, d\u00e9crire le projet dans la zone de saisie et cocher les API voulues (Actes et Comptes annuels).<\/p>\n<p style=\"text-align: justify;\">Le script Python \u00e0 r\u00e9diger doit reprendre les \u00e9tapes d\u00e9crites ci-apr\u00e8s :<\/p>\n<p style=\"text-align: justify;\"><em>1\u00e8re \u00e9tape : lecture des identifiants de connexion \u00e0 l&#8217;API<\/em><\/p>\n<p style=\"text-align: justify;\">Dans notre exemple, les identifiants sont lus \u00e0 partir d&#8217;un fichier et stock\u00e9s dans les variables <em>username<\/em> et <em>password<\/em>.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\"># Lecture des identifiants depuis un fichier\r\ndef lecture_des_identifiants(fichier_ID_API_INPI):\r\n    try:\r\n        with open(fichier_ID_API_INPI, 'r') as file:\r\n            lignes = file.readlines()\r\n            if len(lignes) &gt;= 2:\r\n                username = lignes[0].strip()\r\n                password = lignes[1].strip()\r\n                return username, password\r\n            else:\r\n                raise Exception(\"Le fichier ne contient pas les informations d'identification n\u00e9cessaires.\")\r\n    except Exception as e:\r\n        raise Exception(f\"Erreur lors de la lecture du fichier d'identifiants : {str(e)}\")<\/pre>\n<p style=\"text-align: justify;\"><em>2\u00e8me \u00e9tape : lecture de la liste des num\u00e9ros SIREN \u00e0 interroger<\/em><\/p>\n<p style=\"text-align: justify;\">La liste des SIREN \u00e0 interroger est stock\u00e9e dans un fichier texte (un SIREN par ligne). Le code suivant en assure la lecture (<em>open<\/em>) et le stockage (l<em>iste_siren = [line.strip() for line in file]<\/em>) dans la variable <em>liste_siren<\/em>.<\/p>\n<p style=\"text-align: justify;\">La variable <em>nb_siren<\/em> d\u00e9nombre les SIREN \u00e0 interroger.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\"># Lecture des SIREN \u00e0 interroger \u00e0 partir d'un fichier\r\ndef lecture_liste_siren(fichier_siren):\r\n    liste_siren = []\r\n    with open(fichier_siren, 'r') as file:\r\n        liste_siren = [line.strip() for line in file]\r\n    with open(fichier_siren, 'r') as file:\r\n        nb_siren = len(file.readlines())\r\n    return liste_siren, nb_siren<\/pre>\n<p style=\"text-align: justify;\"><em>3\u00e8me \u00e9tape : connexion \u00e0 l&#8217;API<\/em><\/p>\n<p style=\"text-align: justify;\">Avant d&#8217;interroger les fiches SIREN, il est n\u00e9cessaire d&#8217;<strong>obtenir un <em>token<\/em><\/strong>. Ce dernier est obtenu apr\u00e8s <strong>communication des identifiants<\/strong> (<em>username<\/em> et <em>password<\/em>) au registre national des entreprises g\u00e9r\u00e9 par l&#8217;INPI (<em>url = &#8220;https:\/\/registre-national-entreprises.inpi.fr\/api\/sso\/login&#8221;<\/em>).<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\"># Connexion API et obtention token\r\ndef collecte_token(username, password):\r\n    url = \"https:\/\/registre-national-entreprises.inpi.fr\/api\/sso\/login\"\r\n    headers = {\"Content-Type\": \"application\/json\"}\r\n    data = {\"username\": username, \"password\": password}\r\n\r\n    response = requests.post(url, json=data, headers=headers)\r\n\r\n    if response.status_code == 200:\r\n        return response.json()[\"token\"]\r\n    else:\r\n        raise Exception(f\"\u00c9chec de l'authentification. Code d'erreur : {response.status_code}\")<\/pre>\n<p style=\"text-align: justify;\">La variable <em>response<\/em> lit le <strong>statut du serveur<\/strong>. Par exemple, si l&#8217;authentification aboutit, cette variable \u00e9gale \u00e0 <strong>200 (statut OK)<\/strong>. Les principaux statuts (ou codes d&#8217;erreur) sont list\u00e9s plus loin.<\/p>\n<p style=\"text-align: justify;\"><em>4\u00e8me \u00e9tape : collecte de la liste des documents disponibles<\/em><\/p>\n<p style=\"text-align: justify;\">Une requ\u00eate est envoy\u00e9e \u00e0 l&#8217;API (<em>url = f&#8221;https:\/\/registre-national-entreprises.inpi.fr\/api\/companies\/{siren}\/attachments&#8221;<\/em>) incluant le <em>token<\/em> (<em>headers = {&#8220;Authorization&#8221;: f&#8221;Bearer {token}&#8221;}<\/em>).<\/p>\n<p style=\"text-align: justify;\">Si la requ\u00eate aboutit (<em>if response.status_code == 200<\/em>), l&#8217;API retourne la <strong>liste des documents<\/strong> (<em>documents = response.json()<\/em>) disponibles au t\u00e9l\u00e9chargement.<\/p>\n<p style=\"text-align: justify;\">Ensuite, la boucle <em>for document_type in [&#8220;bilans&#8221;, &#8220;actes&#8221;]<\/em> passe en revue tous les documents financiers et juridiques. Le nom du fichier \u00e0 t\u00e9l\u00e9charger (variable <em>nom_fichier<\/em>) est calcul\u00e9 fonction de la nature du document (<em>match document_type<\/em>).<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\"># Liste les documents et lance leur t\u00e9l\u00e9chargement\r\ndef telecharge_documents(siren, token, dossier_siren):\r\n    # Param\u00e8tres requ\u00eate API\r\n    url = f\"https:\/\/registre-national-entreprises.inpi.fr\/api\/companies\/{siren}\/attachments\"\r\n    headers = {\"Authorization\": f\"Bearer {token}\"}\r\n\r\n    # Interroge le serveur INPI\r\n    response = requests.get(url, headers=headers)\r\n\r\n    # Statut API ok...\r\n    if response.status_code == 200:\r\n        # Collecte liste des documents disponibles au t\u00e9l\u00e9chargement\r\n        documents = response.json()\r\n\r\n        # Passe en revue tous les documents disponibles pour \u00e9ventuel t\u00e9l\u00e9chargement\r\n        for document_type in [\"bilans\", \"actes\"]:\r\n            for document in documents.get(document_type, []):\r\n                document_id = document[\"id\"]\r\n                document_date_depot = document[\"dateDepot\"]\r\n\r\n                match document_type:\r\n                    case \"bilans\":\r\n                        document_type_bilan = document[\"typeBilan\"]\r\n                        document_date_cloture = document[\"dateCloture\"]\r\n                        nom_fichier = f\"{document_type}_{siren}_{document_date_cloture}_{document_type_bilan}_{document_date_depot}_{document_id}.pdf\"\r\n                        telecharge_document(document_type, document_id, nom_fichier, siren, token, dossier_siren)\r\n                    case \"actes\":\r\n                        type_acte = \"type acte inconnu\"\r\n                        if \"typeRdd\" in document and document[\"typeRdd\"]:\r\n                            type_acte = document[\"typeRdd\"][0][\"typeActe\"]\r\n                        nom_fichier = f\"{document_type}_{siren}_{type_acte}_{document_date_depot}_{document_id}.pdf\"\r\n                        telecharge_document(document_type, document_id, nom_fichier, siren, token, dossier_siren)\r\n                    case _:\r\n                        print(f\"Type de document non g\u00e9r\u00e9 : {document_type}\")\r\n    # ... ou Statut API = erreur\r\n    else:\r\n        raise Exception(f\"\u00c9chec de la r\u00e9cup\u00e9ration des documents. Code d'erreur : {response.status_code}\")<\/pre>\n<p style=\"text-align: justify;\">Ceci fait, le programme appelle la <strong>fonction <\/strong><em><strong>telecharge_document<\/strong>(document_type, document_id, nom_fichier, siren, token, dossier_siren)<\/em> afin de lancer le t\u00e9l\u00e9chargement du document :<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\"># T\u00e9l\u00e9charge un document (bilan, bilan saisi, ou acte) \u00e0 partir de son identifiant\r\ndef telecharge_document(document_type, document_id, nom_fichier, siren, token, dossier_siren):\r\n    # Param\u00e8tres requ\u00eate API\r\n    url = f\"https:\/\/registre-national-entreprises.inpi.fr\/api\/{document_type}\/{document_id}\/download\"\r\n    headers = {\"Authorization\": f\"Bearer {token}\"}\r\n\r\n    try:\r\n        # Affiche le nom du fichier en cours\r\n        message=f\"\\tDocument {nom_fichier} : \"\r\n        message_complet=message\r\n        print(message,end=\"\")\r\n\r\n        # V\u00e9rifie si le fichier existe d\u00e9j\u00e0\r\n        # Si existe d\u00e9j\u00e0 : affiche le message \"Le document existe d\u00e9j\u00e0. T\u00e9l\u00e9chargement abandonn\u00e9...\"...\r\n        chemin_fichier = os.path.join(dossier_siren, nom_fichier)\r\n        if fichier_existe(chemin_fichier):\r\n            message=\"Le document existe d\u00e9j\u00e0. T\u00e9l\u00e9chargement abandonn\u00e9...\"\r\n            message_complet=message_complet + message\r\n            print(message)\r\n        # ... sinon interrogation de L'API\r\n        else:\r\n            # Interroge le serveur INPI\r\n            response = requests.get(url, headers=headers)\r\n\r\n            # Statut API ok\r\n            if response.status_code == 200:\r\n                # Sauvegarde le contenu dans le dossier correspondant au SIREN\r\n                with open(chemin_fichier, \"wb\") as pdf_file:\r\n                    pdf_file.write(response.content)\r\n                    message=\"Le document est t\u00e9l\u00e9charg\u00e9.\"\r\n                    message_complet=message_complet + message\r\n                    print(message)\r\n            elif response.status_code == 404:\r\n                message=\"Le document n'a pas \u00e9t\u00e9 trouv\u00e9.\"\r\n                message_complet=message_complet + message\r\n                print(message)\r\n            else:\r\n                message=f\"\u00c9chec du t\u00e9l\u00e9chargement du document. Code d'erreur : {response.status_code}\"\r\n                message_complet=message_complet + message\r\n                raise Exception(message)\r\n        journalisation_message(siren, message_complet, dossier_siren)\r\n    except Exception as e:\r\n        message=f\"Une exception s'est produite lors du t\u00e9l\u00e9chargement du document : {str(e)}\"\r\n        message_complet=message_complet + message\r\n        print(message)\r\n        journalisation_message(siren, message_complet, dossier_siren)<\/pre>\n<p style=\"text-align: justify;\">Le t\u00e9l\u00e9chargement passe, une fois encore, par l&#8217;<strong>interrogation du serveur (avec authentification)<\/strong>. Chaque r\u00e9ponse du serveur est <strong>journalis\u00e9e dans un fichier texte<\/strong> enregistr\u00e9 dans le m\u00eame dossier (\\{siren}) que les documents t\u00e9l\u00e9charg\u00e9s afin de pouvoir v\u00e9rifier ult\u00e9rieurement l&#8217;exhaustivit\u00e9 des t\u00e9l\u00e9chargements.<\/p>\n<p style=\"text-align: justify;\">Les documents d\u00e9j\u00e0 t\u00e9l\u00e9charg\u00e9s (<em>if fichier_existe(chemin_fichier)<\/em>) ne sont pas t\u00e9l\u00e9charg\u00e9s une nouvelle fois.<\/p>\n<p style=\"text-align: justify;\">Exemple de contenu d&#8217;un dossier SIREN \u00e0 l&#8217;issue de la boucle de t\u00e9l\u00e9chargement :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12305\" src=\"https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/01\/API-INPI-Fichiers-telecharges.png\" alt=\"API INPI Fichiers t\u00e9l\u00e9charg\u00e9s\" width=\"827\" height=\"229\" srcset=\"https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/01\/API-INPI-Fichiers-telecharges.png 827w, https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/01\/API-INPI-Fichiers-telecharges-300x83.png 300w, https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/01\/API-INPI-Fichiers-telecharges-768x213.png 768w, https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/01\/API-INPI-Fichiers-telecharges-730x202.png 730w\" sizes=\"auto, (max-width: 827px) 100vw, 827px\" \/><\/p>\n<p>Fonction de journalisation des \u00e9v\u00e9nements de t\u00e9l\u00e9chargement :<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\"># Journalisation des messages\r\ndef journalisation_message(siren, message, dossier_siren):\r\n    nom_fichier_journalisation = f\"Journalisation_API_INPI_{siren}.txt\"\r\n    chemin_journalisation = os.path.join(dossier_siren, nom_fichier_journalisation)\r\n    \r\n    # Test existence du fichier de journalisation\r\n    fichier_existe = os.path.exists(chemin_journalisation)\r\n\r\n    # Ouverture fichier en mode \"a\" (ajout) s'il existe, sinon cr\u00e9ation et ouverture en mode \"w\" (\u00e9criture)\r\n    with open(chemin_journalisation, \"a\" if fichier_existe else \"w\", encoding=\"utf-8\") as journal_file:\r\n        journal_file.write(message + \"\\n\")<\/pre>\n<p>Exemple de fichier de journalisation :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12306\" src=\"https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/01\/API-INPI-Journalisation.png\" alt=\"API INPI Journalisation\" width=\"1147\" height=\"348\" srcset=\"https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/01\/API-INPI-Journalisation.png 1147w, https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/01\/API-INPI-Journalisation-300x91.png 300w, https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/01\/API-INPI-Journalisation-1024x311.png 1024w, https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/01\/API-INPI-Journalisation-768x233.png 768w, https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/01\/API-INPI-Journalisation-730x221.png 730w\" sizes=\"auto, (max-width: 1147px) 100vw, 1147px\" \/><\/p>\n<p>Liste des codes d&#8217;erreur (statuts) de l&#8217;API :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12311\" src=\"https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/01\/API-INPI-Codes-erreurs-retour.png\" alt=\"API INPI Codes erreurs retour\" width=\"825\" height=\"307\" srcset=\"https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/01\/API-INPI-Codes-erreurs-retour.png 825w, https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/01\/API-INPI-Codes-erreurs-retour-300x112.png 300w, https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/01\/API-INPI-Codes-erreurs-retour-768x286.png 768w, https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/01\/API-INPI-Codes-erreurs-retour-730x272.png 730w\" sizes=\"auto, (max-width: 825px) 100vw, 825px\" \/><\/p>\n<p style=\"text-align: justify;\">A noter : les transferts de donn\u00e9es depuis l&#8217;API de l&#8217;INPI sont limit\u00e9s par des <strong>quotas quotidiens<\/strong> : 10 000 requ\u00eates et 10 Go.<\/p>\n<p style=\"text-align: justify;\">___<\/p>\n<p style=\"text-align: justify;\">Pour approfondir le sujet : <strong>autres API<\/strong>&nbsp;utiles avec des exemples de codes VBA :<\/p>\n<ul>\n<li>Obtenir les&nbsp;<strong>distances et temps de parcours d\u2019un trajet<\/strong>&nbsp;<a href=\"https:\/\/www.auditsi.eu\/?p=11129\">Google Maps<\/a><\/li>\n<li>Automatiser le t\u00e9l\u00e9chargement en masse des <strong>avis de situation <\/strong><a href=\"https:\/\/www.auditsi.eu\/?p=11626\"><strong>SIRENE<\/strong> (avec l\u2019API de l\u2019INSEE)<\/a><\/li>\n<li>Obtenir les&nbsp;<strong>informations juridiques d\u2019une soci\u00e9t\u00e9<\/strong>&nbsp;\u00e0 l\u2019aide de l\u2019<a href=\"https:\/\/www.auditsi.eu\/?p=9377\">API de Pappers.fr<\/a><\/li>\n<\/ul>\n<p style=\"text-align: justify;\">Exemple de&nbsp;<strong>requ\u00eates web<\/strong>&nbsp;:&nbsp;<a href=\"https:\/\/www.auditsi.eu\/?p=10797\">Automatiser la lecture des donn\u00e9es boursi\u00e8res Yahoo Finance<\/a><\/p>\n<div id=\"sconnect-is-installed\" style=\"display: none;\">2.13.0.0<\/div>\n<div id=\"sconnect-is-installed\" style=\"display: none;\">2.13.0.0<\/div>\n<div id=\"sconnect-is-installed\" style=\"display: none;\">2.13.0.0<\/div>\n<div id=\"sconnect-is-installed\" style=\"display: none;\">2.13.0.0<\/div>\n<div id=\"sconnect-is-installed\" style=\"display: none;\">2.13.0.0<\/div>\n<div id=\"sconnect-is-installed\" style=\"display: none;\">2.13.0.0<\/div>\n<div id=\"sconnect-is-installed\" style=\"display: none;\">2.13.0.0<\/div>\n<div id=\"sconnect-is-installed\" style=\"display: none;\">2.13.0.0<\/div>\n<div id=\"sconnect-is-installed\" style=\"display: none;\">2.13.0.0<\/div>\n<div id=\"sconnect-is-installed\" style=\"display: none;\">2.13.0.0<\/div>\n<div id=\"sconnect-is-installed\" style=\"display: none;\">2.13.0.0<\/div>\n<div id=\"sconnect-is-installed\" style=\"display: none;\">2.13.0.0<\/div>\n<div id=\"sconnect-is-installed\" style=\"display: none;\">2.13.0.0<\/div>\n<div id=\"sconnect-is-installed\" style=\"display: none;\">2.13.0.0<\/div>\n<div style=\"padding-bottom:20px; padding-top:10px;\" class=\"hupso-share-buttons\"><!-- Hupso Share Buttons - https:\/\/www.hupso.com\/share\/ --><a class=\"hupso_counters\" href=\"https:\/\/www.hupso.com\/share\/\"><img decoding=\"async\" src=\"https:\/\/static.hupso.com\/share\/buttons\/lang\/fr\/share-small.png\" style=\"border:0px; padding-top:2px; float:left;\" alt=\"Share Button\"\/><\/a><script type=\"text\/javascript\">var hupso_services_c=new Array(\"twitter\",\"facebook_like\",\"facebook_send\",\"email\",\"print\",\"linkedin\");var hupso_counters_lang = \"fr_FR\";var hupso_image_folder_url = \"\";var hupso_twitter_via=\"BenoitRiviere14\";var hupso_url_c=\"\";var hupso_title_c=\"Python%20%3A%20automatiser%20le%20t%C3%A9l%C3%A9chargement%20en%20masse%20des%20documents%20juridiques%20et%20financiers%20des%20entreprises%20au%20format%20PDF%20%C3%A0%20l%27aide%20de%20l%27API%20de%20l%27INPI\";<\/script><script type=\"text\/javascript\" src=\"https:\/\/static.hupso.com\/share\/js\/counters.js\"><\/script><!-- Hupso Share Buttons --><\/div>","protected":false},"excerpt":{"rendered":"<p>Le besoin en information sur les entreprises est croissant. Que ce soit pour \u00e9valuer la solvabilit\u00e9 ou la fiabilit\u00e9 de clients et de fournisseurs avant d&#8217;entamer une relation commerciale, se conformer \u00e0 la loi Sapin 2, mener un audit d&#8217;acquisition.. L&#8217;INPI propose diff\u00e9rentes solutions pour acc\u00e9der aux informations juridiques et financi\u00e8res publi\u00e9es par les entreprises &#8230;<\/p>\n<p><a href=\"https:\/\/www.auditsi.eu\/?p=12303\" class=\"more-link\">Continue reading &lsquo;Python : automatiser le t\u00e9l\u00e9chargement en masse des documents juridiques et financiers des entreprises au format PDF \u00e0 l&#8217;aide de l&#8217;API de l&#8217;INPI&rsquo; &raquo;<\/a><\/p>\n<div style=\"padding-bottom:20px; padding-top:10px;\" class=\"hupso-share-buttons\"><!-- Hupso Share Buttons - https:\/\/www.hupso.com\/share\/ --><a class=\"hupso_counters\" href=\"https:\/\/www.hupso.com\/share\/\"><img src=\"https:\/\/static.hupso.com\/share\/buttons\/lang\/fr\/share-small.png\" style=\"border:0px; padding-top:2px; float:left;\" alt=\"Share Button\"\/><\/a><script type=\"text\/javascript\">var hupso_services_c=new Array(\"twitter\",\"facebook_like\",\"facebook_send\",\"email\",\"print\",\"linkedin\");var hupso_counters_lang = \"fr_FR\";var hupso_image_folder_url = \"\";var hupso_twitter_via=\"BenoitRiviere14\";var hupso_url_c=\"\";var hupso_title_c=\"Python%20%3A%20automatiser%20le%20t%C3%A9l%C3%A9chargement%20en%20masse%20des%20documents%20juridiques%20et%20financiers%20des%20entreprises%20au%20format%20PDF%20%C3%A0%20l%27aide%20de%20l%27API%20de%20l%27INPI\";<\/script><script type=\"text\/javascript\" src=\"https:\/\/static.hupso.com\/share\/js\/counters.js\"><\/script><!-- Hupso Share Buttons --><\/div>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"ngg_post_thumbnail":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[39,3087],"tags":[2115,2116,3151,815,1650,1645,2513,2113,519,233,2398,258,2118,3088,2112,2358,2336],"class_list":["post-12303","post","type-post","status-publish","format-standard","hentry","category-cas-pratiques","category-python","tag-actes-juridiques","tag-api","tag-audit-dacquisition","tag-automatisation","tag-comptes-annuels","tag-comptes-consolides","tag-conformite","tag-inpi","tag-insee","tag-len","tag-loi-sapin-2","tag-open","tag-open-data","tag-python","tag-rcs","tag-sirene","tag-www-pappers-fr"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_likes_enabled":false,"_links":{"self":[{"href":"https:\/\/www.auditsi.eu\/index.php?rest_route=\/wp\/v2\/posts\/12303","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.auditsi.eu\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.auditsi.eu\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.auditsi.eu\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.auditsi.eu\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=12303"}],"version-history":[{"count":13,"href":"https:\/\/www.auditsi.eu\/index.php?rest_route=\/wp\/v2\/posts\/12303\/revisions"}],"predecessor-version":[{"id":12460,"href":"https:\/\/www.auditsi.eu\/index.php?rest_route=\/wp\/v2\/posts\/12303\/revisions\/12460"}],"wp:attachment":[{"href":"https:\/\/www.auditsi.eu\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=12303"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.auditsi.eu\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=12303"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.auditsi.eu\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=12303"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}