Web Requests VBA

LeRevenant

XLDnaute Occasionnel
Salut,

Pour mon travail, j'ai fait une macro qui va chercher toutes les données sur nos produits en utilisant ce que j'ai pu apprendre ici . Hors la boite a plus de 800 produits par site, donc pour chaque site il faut 1-2h pour faire tourner la machine (ebay, amazon etc etc)...

Maintenant que je me débrouille avec le webcontrol, je voudrais faire des webrequests : pour aller plus vite.

VB:
Sub TestWebRequests()
Dim oHtml       As New HTMLDocument
Dim oElement    As Object


With CreateObject("WINHTTP.WinHTTPRequest.5.1")
    .Open "GET", "http://www.ebay.de/sch/m.html?_nkw=&_armrs=1&_from=&_ssn=www.expondo.de*&_ipg=200&rt=nc", False
    .send
    oHtml.body.innerHTML = .responseText
End With

    oHtml.getElementsByClassName("gspr next")(0).Click ' C'est ici que ça coince....

For Each oElement In oHtml.getElementsByClassName("vip")
MsgBox oElement.innerText
Next oElement

End Sub

Donc c'est cool => je peux récupérer des éléments en utilisant le classname et l'id (les msgbox l'ont démontrées). Par contre, pas moyen de naviguer, pour aller sur une autre page..... J'espère que vous avez des astuces :)


À bient^t
 

Lone-wolf

XLDnaute Barbatruc
Bien le bonjour LeRevenant :)

J'ai fait un test, et pas de msgbox en vue. Ensuite j'ai fait une recherche avec IE pour touver gspr next et il n'a rien trouvé. De plus, si tu enlève (0) .Click et tu remet le point, click n'est pas dans la liste. Tu n'as pas par hazard pris le code ici: stackoverflow???.

D'après Silkyroads tu devrais avoir une ligne comme celle-ci (utilisée avec IE)
'Allons chercher ce texte dans notre Item46
Set HtmlElementStandard = IEDoc.body.all(32)
 

david84

XLDnaute Barbatruc
Bonjour,
la manière dont tu procèdes n'est pas cohérente : soit tu choisis d'ouvrir Internet Explorer pour pouvoir interagir avec le navigateur comme expliqué dans le tutoriel que tu cites, soit tu utilises une requête WinHttp ou XmlHttp qui te permet comme son nom l'indique d'envoyer une requête vers une page Web afin de récupérer le résultat de cette requête.
L'intérêt d'utiliser les requêtes sont multiples, notamment le fait de ne pas avoir à ouvrir Internet Explorer, de ne pas devoir manipuler les bandeaux ou fenêtres de téléchargement, etc., sans compter que cela va beaucoup plus vite.
Cela nécessite cependant de savoir utiliser la fenêtre des outils de développement du navigateur afin d'en extraire la requête voulue (touche F12 du clavier).
Tu trouveras des exemples sur la manière de faire sur le site d'où le tutoriel est issu car sur Excel Downloads ce type de demande n'est pas toujours en adéquation avec certains points de la charte.
J'avais produit quelques exemples utilisant des requêtes dans ce lien.
A+
 

LeRevenant

XLDnaute Occasionnel
Bonjour à vous 3,

Merci pour vos réponses. J'essayais de répondre depuis quelque temps, mais en fait j'ai été déconnecté automatiquement donc le captcha ne marchait pas....

@Lone-wolf : Webcontrols = passer par un navigateur pour naviguer (chose que je sais faire) et ce que tu me donnes c'est du webcontrol car tu passes par Internet Explorer.

@david84 : Je sais bien que passer par un navigateur est different d'une requête. Je sais faire l'un mais pas l'autre. J'ai fait un outil qui allait chercher les infos en passant par IE, sauf que quand il y a 800 liens à chercher, si je peux aller plus vite : je fais.

@tatiak: "En jouant avec les adresses, il est simple d'aller d'une page à une autre." tu as raison. Je vais faire d'une manière légèrement différente, mais qui est semblable : choper le lien derrière le bouton "page suivante" et dire d'aller sur ce lien ;)

Par chance le code que j'ai donné dans le message 1 contient un wrapper qui permet de """"naviguer""" comme sur un webcontrol. J'ai aussi appris qu'il est impossible de simuler un clic sur un une requête (ce qui est logique, mais bon quand on sait pas).


Merci à vous.
 

LeRevenant

XLDnaute Occasionnel
@tatiak

Bonjour Tatiak,

Je me suis penché de plus prêt sur ton code. Et je rencontre quelque chose d’intrigant:
Je peux faire un code qui va marcher (en m'inspirant de ta méthode) correctement la première fois, puis j ajoute des choses : il arrête de marcher. Et impossible de revenir en arrière pour le faire marcher...

Code:
Function RequeteWebNombrePage(URL As String)
Dim oHtml As New HTMLDocument
Dim oElement As Object

    On Error Resume Next
    With CreateObject("WINHTTP.WinHTTPRequest.5.1")
        .Open "GET", URL, False
        .send
        oHtml.Body.innerHTML = .responseText
    End With

RequeteWebNombrePage = oHtml.getElementsByClassName("pagnDisabled")(0).innerText

End Function

Sub WebRequest_ExportAMAZON()
Dim NombrePages As Variant
Dim ProchainURL As String
Dim BoucleNombrePage As Variant
Dim YesOrNoAnswerToMessageBox As String
Dim QuestionToMessageBox As String



NombrePages = RequeteWebNombrePage("https://www.amazon.de/s/ref=sr_pg_1?me=A1D3W69YJ66YIO&rh=i%3Amerchant-items&ie=UTF8&qid=1480347628")
MsgBox NombrePages

End Sub

Par exemple le code ci dessus m a bien donné 34. Puis a arrêté de marcher. Puis a refonctionné. Puis a arrêté de marcher...
Tu sais si c'est normal? Y a t il quelque chose que j'ai oublié de faire?

Merci.
 

LeRevenant

XLDnaute Occasionnel
salut tatiak et Wolf,

Merci pour ta réponse.

En fait, c'était mon antivirus qui bloquait la requête. Enfin c'est ma supposition car j ai tout simplement supprimé l'antivirus chez moi et ça marche très bien depuis. Et quand je tentais la requête au boulot (=l'endroit où je vais pas supprimer l'antivirus lol), j'avais le même problème. Il suffit de faire comme ça, et ça marche pour moi :
Code:
With CreateObject("WINHTTP.WinHTTPRequest.5.1")
    .SetTimeouts Resolve, Connect, Send And Receive ' c'est ici la nouveauté
    .Open "GET", "http://www.ebay.de/sch/m.html?_nkw=&_armrs=1&_from=&_ssn=www.expondo.de*&_ipg=200&rt=nc", False
    .send
    oHtml.body.innerHTML = .responseText
End With

@Lone-wolf : J'ai tout simplement pas apprécié que tu dises que je suis un menteur et un imbécile (alors que jusque là j'étais plutôt cool avec toi) quand bien même tu lisais même pas correctement mes messages. Donc avant de dire que les autres mentent, vérifie si tu comprends bien ce qu'il se passe.
 

Statistiques des forums

Discussions
312 294
Messages
2 086 928
Membres
103 404
dernier inscrit
sultan87