Extraire des données web depuis un site qui utilise javascript
Résolu
captoine
Messages postés
15
Date d'inscription
Statut
Membre
Dernière intervention
-
stef -
stef -
Bonjour,
Cela fait deux jours que je cherche une solution à mon probleme sur les forums et malgré la relative fréquence à laquelle il doit se poser a des internautes je ne trouve pas de solutions dans ce cas précis :
L'exercice est simple, je veux exploiter des données d'un site web sur excel. Aujourd'hui je fais des copier-coller de centaines de pages et je voudrais automatiser. J'utilise donc la fonction données externes « a partir du web », je peux même intégrer l'import dans une macro qui va générer automatiquement les URL à importer mais problème : le site sur lequel je recupere les données utilise des commandes javascript pour afficher les données... je ne peux donc pas entrer les parametres de recherche dans l'url et excel comme IE me repond «Données non disponibles car les paramètres dans la requête http sont incorrects »
Voici le site en question :
http://alize2.finances.gouv.fr/communes/eneuro/RDep.php?type=BPS&dep=001 (base de données publique sur la comptabilité des communes - ici, celles de l'ain)
et l'url de la page que je souhaite recupérer :
http://alize2.finances.gouv.fr/communes/eneuro/detail.php
Vous remarquerez dans mes descriptions que je suis néophyte mais je me suis accroché pour chercher des solutions dans 4 directions entre lesquelles je ne sais pas choisir et que je ne sais pas mettre en oeuvre :
1 - Je charge http://alize2.finances.gouv.fr/communes/eneuro/detail.php et dans la cosole d'IE ou firefox je saisie la commande : javascript=openWithPostData('detail.php',{'ICOM':'001','DEP':'001','TYPE':'BPS','PARAM':0,'EXERCICE':'2013'})
Cela m'ouvre les données de la commune 001 (ICOM) du departement 001 (DEP) pour 2013.
1ere piste : construire une macro qui permet d'ouvrir une page web et envoyer une commande javascript via la console (ctrl+shift+k) d'IE, puis recuperer la page sur excel ??
2 - Utiliser l'importateur excel de données externes « a partir du web » et intégrer la commande javascript dans l'url (est ce que c'est possible ?)
3 - Lancer une commande javascript a partir d'excel. C'est possible en saisissant la commande dans une cellule en tant que lien hypertexte : javascript:document.open();document.write("toto");document.close()
Ducoup la commande serait un truc du style :
javascript=ouvre l'url (http://alize2.finances.gouv.fr/communes/eneuro/detail.php) ; openWithPostData('detail.php',{'ICOM':'001','DEP':'001','TYPE':'BPS','PARAM':0,'EXERCICE':'2013'}) ; copie les données().
4 - une macro qui ouvre http://alize2.finances.gouv.fr/communes/eneuro/RDep.php?type=BPS&dep=001 et ouvre successivement tous les bons liens jusqu'à arriver a la feuille que je souhaite ??
Merci par avance de votre aide
Cela fait deux jours que je cherche une solution à mon probleme sur les forums et malgré la relative fréquence à laquelle il doit se poser a des internautes je ne trouve pas de solutions dans ce cas précis :
L'exercice est simple, je veux exploiter des données d'un site web sur excel. Aujourd'hui je fais des copier-coller de centaines de pages et je voudrais automatiser. J'utilise donc la fonction données externes « a partir du web », je peux même intégrer l'import dans une macro qui va générer automatiquement les URL à importer mais problème : le site sur lequel je recupere les données utilise des commandes javascript pour afficher les données... je ne peux donc pas entrer les parametres de recherche dans l'url et excel comme IE me repond «Données non disponibles car les paramètres dans la requête http sont incorrects »
Voici le site en question :
http://alize2.finances.gouv.fr/communes/eneuro/RDep.php?type=BPS&dep=001 (base de données publique sur la comptabilité des communes - ici, celles de l'ain)
et l'url de la page que je souhaite recupérer :
http://alize2.finances.gouv.fr/communes/eneuro/detail.php
Vous remarquerez dans mes descriptions que je suis néophyte mais je me suis accroché pour chercher des solutions dans 4 directions entre lesquelles je ne sais pas choisir et que je ne sais pas mettre en oeuvre :
1 - Je charge http://alize2.finances.gouv.fr/communes/eneuro/detail.php et dans la cosole d'IE ou firefox je saisie la commande : javascript=openWithPostData('detail.php',{'ICOM':'001','DEP':'001','TYPE':'BPS','PARAM':0,'EXERCICE':'2013'})
Cela m'ouvre les données de la commune 001 (ICOM) du departement 001 (DEP) pour 2013.
1ere piste : construire une macro qui permet d'ouvrir une page web et envoyer une commande javascript via la console (ctrl+shift+k) d'IE, puis recuperer la page sur excel ??
2 - Utiliser l'importateur excel de données externes « a partir du web » et intégrer la commande javascript dans l'url (est ce que c'est possible ?)
3 - Lancer une commande javascript a partir d'excel. C'est possible en saisissant la commande dans une cellule en tant que lien hypertexte : javascript:document.open();document.write("toto");document.close()
Ducoup la commande serait un truc du style :
javascript=ouvre l'url (http://alize2.finances.gouv.fr/communes/eneuro/detail.php) ; openWithPostData('detail.php',{'ICOM':'001','DEP':'001','TYPE':'BPS','PARAM':0,'EXERCICE':'2013'}) ; copie les données().
4 - une macro qui ouvre http://alize2.finances.gouv.fr/communes/eneuro/RDep.php?type=BPS&dep=001 et ouvre successivement tous les bons liens jusqu'à arriver a la feuille que je souhaite ??
Merci par avance de votre aide
A voir également:
- Extraire données site web vers excel vba
- Création site web - Guide
- Site de telechargement - Accueil - Outils
- Web office - Guide
- Site comme coco - Accueil - Réseaux sociaux
- Extraire une video youtube - Guide
7 réponses
On se contente donc d'un copié/collé?
Si oui, voici le code complet :
Et le classeur exemple : https://www.cjoint.com/c/DGDmkDrvlzU
Cordialement,
Franck
Si oui, voici le code complet :
Option Explicit 'SOURCES : 'Manipuler IE depuis VBA : 'http://qwazerty.developpez.com/tutoriels/vba/ie-et-vba-excel/ 'Sendkeys & Vider_Presse_Papier : MichDenis 'http://www.generation-nt.com/reponses/pb-avec-sendkeys-ctrl-plusa-ctrl-plusc-ctrl-plusv-entraide-3545931.html 'REFERENCES : 'Pour manipuler IE, il nous faudra activer deux références : '« Microsoft Internet Controls » '« Microsoft HTML Object Library ». 'Pour accéder aux références dans VBA, menu Outils -> Références. Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long Private Declare Function EmptyClipboard Lib "user32" () As Long Private Declare Function CloseClipboard Lib "user32" () As Long Dim Trouve As Boolean Sub VaChercherSurInternet(Site As String, Ville As String, Annee As String) Dim IE As New InternetExplorer Dim IEDoc As HTMLDocument Dim htmlTagCol As IHTMLElementCollection Dim Lien As String, MsgErreur As String Vider_Presse_Papier 'Ouvre Internet Explorer à la page référencée en B1 et B2 IE.navigate Site IE.Visible = True WaitIE IE Set IEDoc = IE.document Set htmlTagCol = IEDoc.getElementsByTagName("a") 'Boucle sur tous les liens et clic sur celui de la première lettre de la ville référencée en B3 Lien = Left(Ville, 1) Trouve = False Clic_Sur_Lien htmlTagCol, Lien, IE 'Traitement si la première lettre n'est pas trouvée dans les liens If Trouve = False Then MsgErreur = Left(Ville, 1) & " non trouvée dans les liens du site : " & Site GoTo ErreurUrl End If Set IEDoc = IE.document Set htmlTagCol = IEDoc.getElementsByTagName("a") 'Boucle sur tous les liens et clic sur celui de la ville référencée en B3 Lien = "*" & Ville & "*" Trouve = False Clic_Sur_Lien htmlTagCol, Lien, IE 'Traitement si la ville n'est pas trouvée dans les liens If Trouve = False Then MsgErreur = "Ville " & Ville & " non trouvée." GoTo ErreurUrl End If Set IEDoc = IE.document Set htmlTagCol = IEDoc.getElementsByTagName("a") 'Boucle sur tous les liens et clic sur celui de la ville référencée en B3 + "Budget principal" Lien = "*" & Ville & "*" & "(Budget principal" & "*" Trouve = False Clic_Sur_Lien htmlTagCol, Lien, IE 'Traitement si budget prinicpal n'est pas trouvée dans les liens If Trouve = False Then MsgErreur = "Le lien budget principal de la ville " & Ville & " n'a pas été trouvé." GoTo ErreurUrl End If Set IEDoc = IE.document Set htmlTagCol = IEDoc.getElementsByTagName("a") 'Boucle sur tous les liens et clic sur celui de l'année référencée en B4 Lien = Annee Trouve = False Clic_Sur_Lien htmlTagCol, Lien, IE 'Traitement si l'année n'est pas trouvée dans les liens If Trouve = False Then MsgErreur = "Le lien budget principal de la ville " & Ville & " pour l'année : " & Annee & " n'a pas été trouvé." GoTo ErreurUrl End If Set IEDoc = IE.document Set htmlTagCol = IEDoc.getElementsByTagName("a") 'Boucle sur tous les liens et clic sur "Fiche détaillée" Lien = "Fiche détaillée" Trouve = False Clic_Sur_Lien htmlTagCol, Lien, IE 'Traitement si la fiche n'est pas trouvée dans les liens If Trouve = False Then MsgErreur = "La fiche détaillée du budget de la ville " & Ville & " pour l'année : " & Annee & " n'a pas été trouvé." GoTo ErreurUrl End If Application.SendKeys "^a" Application.Wait Now + TimeValue("00:00:01") Application.SendKeys "^c" Application.Wait Now + TimeValue("00:00:01") With Sheets("Feuil2") .Select .Cells.Delete 'suppression de toutes les lignes de la feuille!!!!! .Range("A1").Select .Paste End With IE.Quit Set IE = Nothing Set IEDoc = Nothing Set htmlTagCol = Nothing Vider_Presse_Papier MsgBox "Importation terminée avec succès.", vbInformation Exit Sub ErreurUrl: MsgBox MsgErreur End Sub Function Clic_Sur_Lien(CollectionLiens As IHTMLElementCollection, Lien As String, IE As InternetExplorer) Dim mesLiens As IHTMLElement, Attente As Long If Sheets("Feuil1").Range("B5").Value = "" Then Sheets("Feuil1").Range("B5").Value = 2 Attente = CLng(Sheets("Feuil1").Range("B5").Value) * 1000 For Each mesLiens In CollectionLiens If mesLiens.innerText Like Lien Then mesLiens.Click Trouve = True End If If Trouve Then Exit For Next Sleep Attente WaitIE IE End Function Sub WaitIE(IE As InternetExplorer) 'On boucle tant que la page n'est pas totalement chargée Do Until IE.readyState = READYSTATE_COMPLETE DoEvents Loop End Sub Sub Vider_Presse_Papier() OpenClipboard 0 EmptyClipboard CloseClipboard End Sub
Et le classeur exemple : https://www.cjoint.com/c/DGDmkDrvlzU
Cordialement,
Franck
c'est parfait, merci pijaku, merci la belgique!!
RESOLU!
A+