Erreur code vba pour "programme extraction données web"
:D Bonjour à tous !!!
Je suis débutant (je pars de zéro ! :oops:) en programmation vba (pour Excel 2013 sous Windows7).
J’essaie d’écrire un programme pour récupérer des infos sur un site web à partir d'un tableau Excel pour ensuite les réintégrer dedans.
Pour être « franc » et plus précis (vous le comprendrez en voyant le début du code), ce serait pour compléter des infos sur un tableau un peu comme le modèle dans excel : « liste de films ». En « automatisant » bien sur l’enregistrement des infos qui m’intéressent ! :mouarf:
Je suis donc parti du "code source" de la page d'accueil du site (je ne pense "déroger" à des "droits privés", ce faisant...) et repéré les valeurs concernées avec leurs propriétés.
Je voudrai dans un premier temps pouvoir « placer » une valeur dans le champ « recherche » et lancer celle-ci automatiquement. Je verrai après comment récupérer mes données… :aie:
Mais je bloque déjà sur une partie de mon code (ça commence mal et j’ai l’impression que ce n’est pas fini !!!) avec ce message d'erreur: :aie::aie:
"Erreur d'exécution '91': variable objet ou variable de bloc with non définie"...
Le code bloque à cet endroit :
Set Input_allocine_ZoneTexte = IEDoc.all("search_input") :cry::cry::cry:
Est-ce que quelqu’un pourrait m’aider, SVP ? :ccool:
Voici le code :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| Sub Recherche_infos_films()
'Déclaration des variables
Dim IE As New InternetExplorer
Dim IEDoc As HTMLDocument
'avec Dim Input_allocine_ZoneTexte as HTMLInputElement ou Dim Input_allocine_ZoneTexte As Variant, le code ne fonctionne pas...
Dim Input_allocine_ZoneTexte As Variant
Dim Input_allocine_Bouton As HTMLButtonElement
'Chargement d'une page Web
IE.Navigate "http://www.allocine.fr/"
'Affichage de la fenêtre IE
IE.Visible = True
'On attend le chargement complet de la page
Do Until IE.readyState = READYSTATE_COMPLETE
DoEvents
Loop
'On pointe le membre Document
Set IEDoc = IE.document
'On pointe notre Zone de texte avec la formule IEDoc.all("q")ou IEDoc.all("search_input")
Set Input_allocine_ZoneTexte = IEDoc.all("search_input")
'On définit le texte que l'on souhaite placer à l'intérieur
Input_allocine_ZoneTexte.Value = "titre au hasard"
'On pointe notre bouton
Set Input_allocine_Bouton = IEDoc.all("btn_form")
'On simule un clic
Input_allocine_Bouton.Click
'On attend le chargement complet de la page
Do Until IE.readyState = READYSTATE_COMPLETE
DoEvents
Loop
'On libère les variables
Set IE = Nothing
Set IEDoc = Nothing
End Sub |
Ah oui, je vous précise qu'au début, à la ligne 25, j'avais écris:
Code:
Set Input_allocine_ZoneTexte = IEDoc.all("q")
Mais comme bizarrement il y a plusieurs " id="q"", j'ai remplacé le code par :
Code:
Set Input_allocine_ZoneTexte = IEDoc.all("search_input")
pour "spécifier" la valeur qui m’intéresse, main en vain... :calim2:
Comment "trier+pointer" sur liens qui n'ont pas de "Name,Id ou Class" mais sous forme de : <a href= "...">
Bonjour à tous, :coucou:
J’ai dû rechanger mon code (fallait s’y attendre et ce n’est pas fini à mon avis…) :piou: car je n’ai pas réussi à exploiter la manière de faire (bbil) pour écrire le titre du film dans le « input_ rechercher » pour valider ensuite le bouton « rechercher (btn_form) ». :mur:
Je vous passe les détails des différents codes utilisés…
J’ai donc réussi en utilisant la fonction « oDoc.getElementsByClassName("btn_form")(0).Click » pour valider le bouton de recherche. :king:
Pour cela, il m’a fallu télécharger la version IE10 avec les mises à jour…puisque cette fonction n’est pas exploitable avec IE8 (je crois ?). :evilred:
Si je mets autant de détails, c’est pour le « pauvre pèlerin » qui rencontrerait les mêmes difficultés que moi. Si ça peut aider, j’en serais ravi ! Car je suis sûr que le code final en intéressera plus d’un quand il sera terminé (faudra être patient !)
Alors voilà le nouveau problème : :rouleau: :mur: :fou:
Avant, avec le titre exact du film, le moteur de recherche de « allociné » pointait directement sur la fiche du film. Ce qui n’est plus tout à fait le cas maintenant. Prenons l’exemple de « Terminator (The Terminator) ».
http://www.allocine.fr/recherche/?q=Terminator
On arrive sur une page avec 4 résultats dans les « titres de films » et 2 résultats dans celui des « séries TV ».
Sans compter les résultats des « vidéos » et « photos » qui ne m’intéressent pas...
Comment faire pour « récupérer » le bon titre du film (du lien) et pointer ensuite sur celui-ci pour enfin « arriver » sur sa fiche ? :cfou:
Car le lien n’a pas de classe, ni de nom, ni d’Id (comme moi !!! :lol:) :
<a href= « /film/fichefilm_gen_cfilm=183219.html » >
Pas facile pour le comparer aux autres liens et le différencier… J’ai essayé de récupérer tous les liens de « <h2> Films » par son id ou sa classe mais pas de résultat valable :
<a name="121001" class="anchor" id="121001"/>
Je vous donne mon code actuel (ce qui fonctionne pour l’instant !) et si quelqu’un a des idées, je suis preneur !!! :ccool: :idea:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| ' Attend que la page internet soit chargée
' pTimeOut est un time out en secondes (WaitIE vaut True si Timeout)
Public Function WaitIE(oIE As InternetExplorer, Optional pTimeOut As Long = 0) As Boolean
Dim lTimer As Double
lTimer = Timer
Do
DoEvents
If oIE.readyState = READYSTATE_COMPLETE And Not oIE.Busy Then Exit Do
If pTimeOut > 0 And Timer - lTimer > pTimeOut Then
WaitIE = True
Exit Do
End If
Loop
End Function
Public Sub CreerNavigateur()
Dim oNav As SHDocVw.InternetExplorer
Dim oDoc As MSHTML.HTMLDocument
' variables d'essais pour la suite du code et " trouver le bon lien puis pointer dessus"...
'Dim MesElements As Objet, i As Long, j As Long
Set oNav = New SHDocVw.InternetExplorer
oNav.Visible = True
oNav.navigate "http://www.allocine.fr/"
' Attente avec timeout de 10 s
If WaitIE(oNav, 10) Then
' 10 s écoulées et page non chargée
MsgBox "Time out!"
Else
' Page chargée, on continue
Set oDoc = oNav.document
End If
' Valeur recherchée
oDoc.getElementsByName("q")(0).Value = "Terminator (The Terminator)"
' Clic sur bouton
oDoc.getElementsByClassName("btn_form")(0).Click
' Attente avec timeout de 10 s
If WaitIE(oNav, 10) Then
' 10 s écoulées et page non chargée
MsgBox "Time out!"
Else
' Page chargée, on continue
Set oDoc = oNav.document
End If
End Sub |