Récupération de données (scraping) en VBA
Bonjour à tous,
J'avais fabriqué un outil en vba pour récupérer régulièrement et archiver de manière structurée (dans Excel) les données en ligne concernant une liste de sociétés (à partir d'Excel). Une démonstration sur mon site perso ici (sans les [ ]) :
lucwalraf[.]com/2019/10/24/recuperation-de-donnees-sur-internet/
Tout reposait sur la possibilité de commander IE à partir de vba (parser le HTML). Mais maintenant, quand la macro lance IE sur certains sites (Linkedin, Facebook) ils renvoient vers Edge - et là ça la plante. Apparemment, vba ne sait pas commander Edge. Donc je cherchais une autre solution.
J'ai essayé Selenium pour ouvrir et naviguer sur Chrome ou Firefox, mais ça ne fonctionne pas : problèmes de compatibilité des versions de soft apparemment.
J'ai essayé aussi cette méthode, qui m'ouvre bien [ma page] sur Chrome - mais je ne sais pas comment la traiter ensuite.
Option Explicit
Private pWebAddress As String
Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
(ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, _
ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Sub LoadExplorer()
ShellExecute 0, "Open", "Chrome.exe", [ma page], "", 1 ' You can change the URL.
End SubSi quelqu'un a des idées, je suis preneur de toutes les pistes,
Merci
Luc
Bonjour
Pas de solution mais une précision : le nouvel Edge repose sur le moteur Chrome
Bonjour,
Voici une solution, qui fonctionne mais reste très artisanale ! C'est pour cela que ce post m'intéresse si quelqu'un avait une solution plus confortable.
L'idée est que, une fois signé dans chrome ou firefox (le navigateur par défaut doit être l'un des deux), le code VBA lance les pages souhaitées en faisant précéder l'url par view-source: On récupère alors le code source par copier/coller.
Il ne faut rien toucher tant que l'application n'est pas revenue sur excel (réglage à faire si problème) ou tant que ce message n'apparait pas !
Dans ce cas de figure, il faut que toutes les infos nécessaires soient dans l'url (méthode get si form)
#If VBA7 Then
Private Declare PtrSafe Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
(ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
#Else
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
(ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
#End If
Sub telecharger()
Dim nav As Long, MyData As DataObject
Set MyData = New DataObject
Dim page As New HTMLDocument, elem As Object
fenetre = ActiveWindow.Caption
nav = ShellExecute(0, "open", "https://www.qwant.com/", 0, 0, 1)
Application.Wait (Now + TimeValue("00:00:02"))
For ligne = 2 To Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row
url = Sheets(1).Cells(ligne, 1)
SendKeys "%d"
Application.Wait (Now + TimeValue("00:00:01"))
SendKeys "view-source:" & url
SendKeys "{ENTER}"
Application.Wait (Now + TimeValue("00:00:10"))
SendKeys "^a"
Application.Wait (Now + TimeValue("00:00:01"))
SendKeys "^c"
Application.Wait (Now + TimeValue("00:00:01"))
MyData.GetFromClipboard
txt = MyData.GetText(1)
' version DOM
page.body.innerHTML = txt
For Each elem In page.getElementsByTagName("div")
If elem.getAttribute("id") = "VL" Then Sheets(1).Cells(ligne, 2) = elem.innerHTML
Next
Next
fin
Application.Wait (Now + TimeValue("00:00:02"))
AppActivate fenetre & " - Excel"
End Sub
Sub fin()
Open Environ("TEMP") & "\" & "fin" & ".htm" For Output As #1
Print #1, "<html><body>Fin du traitement, retour sur excel ...</body></html>"
Close #1
ShellExecute 0, "open", Environ("TEMP") & "\" & "fin" & ".htm", vbNullString, "C:\TEMP\", 1 'SW_SHOWNORMAL
End Sub
Merci, je n'avais pas vu que l'activation des références s'applique au classeur et pas à l'application en général. Ca marche très bien maintenant.
Question suivante : j'ai moyen d'interagir quand je suis sur la page cible ? Par exemple de cliquer sur "Export" pour télécharger automatiquement mon rapport de stats sur Linkedin ?
Question suivante : j'ai moyen d'interagir quand je suis sur la page cible ? Par exemple de cliquer sur "Export" pour télécharger automatiquement mon rapport de stats sur Linkedin ?
C'est tout là le problème pour moi, et c'est ce qu'apportait Selenium.
Ce que je faisais "dans le temps", c'est envoyer des sendkeys pour naviguer dans le document et interagir ! en renseignant des données et en cliquant {ENTER} sur les boutons !
Bonjour le fil,
8.2. À ne pas faire
Vous vous engagez à ne pas :
- créer une fausse identité sur LinkedIn, contrefaire votre identité, créer un profil de Membre pour n’importe qui d’autre que vous-même, ou utiliser ou tenter d’utiliser le compte d’un autre ;
- développer, prendre en charge ou utiliser des logiciels, des dispositifs, des scripts, des robots ou tout autre moyen ou processus (notamment des robots d’indexation, des modules d’extension de navigateur et compléments, ou toute autre technologie) visant à effectuer du web scraping des Services ou à copier par ailleurs des profils et d’autres données des Services ;

