Extraire des données web depuis un site qui utilise javascript

Résolu/Fermé
captoine Messages postés 15 Date d'inscription lundi 28 juillet 2014 Statut Membre Dernière intervention 29 juillet 2014 - 28 juil. 2014 à 11:47
 stef - 26 févr. 2016 à 20:31
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

7 réponses

pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
Modifié par pijaku le 29/07/2014 à 12:12
On se contente donc d'un copié/collé?

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
1
captoine Messages postés 15 Date d'inscription lundi 28 juillet 2014 Statut Membre Dernière intervention 29 juillet 2014
29 juil. 2014 à 12:40
excellent!!
c'est parfait, merci pijaku, merci la belgique!!

RESOLU!
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
29 juil. 2014 à 12:42
Mais de rien le Parisien...
A+
0