Partage
  • Partager sur Facebook
  • Partager sur Twitter

VBA Excel - Extraire donnée depuis le Web

    27 juin 2021 à 15:16:55

    Bonjour, 

    Je suis tombé sur plusieurs tutoriel qui expliquent comment extraire une donnée précise d'un site web pour l'actualiser sur Excel en utilisant des commandes type getElementsById.

    J'ai essayé ce code que j'ai trouvé sur Youtube, sur des sites comme google et yahoo par exemple : 

    Sub Get_Web_Data()
    ' TeachExcel.com
    
    Dim request As Object
    Dim response As String
    Dim html As New HTMLDocument
    Dim website As String
    Dim price As Variant
    
    ' Website to go to.
    website = "https://finance.yahoo.com/quote/EURUSD=X?p=EURUSD=X"
    
    ' Create the object that will make the webpage request.
    Set request = CreateObject("MSXML2.XMLHTTP")
    
    ' Where to go and how to go there - probably don't need to change this.
    request.Open "GET", website, False
    
    ' Get fresh data.
    request.setRequestHeader "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT"
    
    ' Send the request for the webpage.
    request.send
    
    ' Get the webpage response data into a variable.
    response = StrConv(request.responseBody, vbUnicode)
    
    ' Put the webpage into an html object to make data references easier.
    html.body.innerHTML = response
    
    ' Get the price from the specified element on the page.
    price = html.getElementsByClassName("Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(ib)").Item(0).innerText
    
    ' Output the price into a message box.
    MsgBox price
    
    End Sub

    J'ai donc essayé de faire pareil sur ce site : 

    https://just-wiped.net/rust_servers/845180

    Mon objectif serait de pouvoir rafraichir le nombre de joueurs sur ma cellule excel.

    J'ai donc changé l'url dans le code, et dans 

    price = html.getElementsByClassName("Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(ib)").Item(0).innerText

    J'ai remplacé le nom de la classe par Value que je trouve dans le code source, et j'ai mis Item(7) car c'est le 7eme item qui m'interesse (en partant de 0). Cependant j'obtient toujours une erreur 91. J'ai essayé par mal de trucs, changer le nom de la variable ou essayer un autre navigateur pour voir si le nom de la classe changeait mais rien n'y fait.

    --> Sauriez-vous extraire le nombre de joueur pour le rafraichir sur ma page Excel ? 

    Merci

    • Partager sur Facebook
    • Partager sur Twitter
      28 juin 2021 à 11:56:39

      le problème c'est que ça (le request de VBA) utilise le moteur d'internet explorer, et là le site renvoie une autre page indiquant qu'il faut indiquer qu'on utilise un navigateur plus récent, en définissant dans le header le bon User-Agent.

      (et le nombre de joueurs c'est le 4ème élément, pas le 7ème)

      Sub Get_Web_Data()
       
          Dim request As Object
          Dim response As String
          Dim html As New HTMLDocument
          Dim website As String
          Dim nbplayers As Variant
       
          ' Website to go to.
          website = "https://just-wiped.net/rust_servers/845180"
           
          ' Create the object that will make the webpage request.
          Set request = CreateObject("MSXML2.XMLHTTP")
           
          ' Where to go and how to go there - probably don't need to change this.
          request.Open "GET", website, False
           
          request.setRequestHeader "User-Agent", "Mozilla/5.0"
          
          ' Send the request for the webpage.
          request.send
           
          ' Get the webpage response data into a variable.
          response = StrConv(request.responseBody, vbUnicode)
           
          ' Put the webpage into an html object to make data references easier.
          html.body.innerHTML = response
          
          ' 1ère méthode: on récupère tous les éléments de classe "value" et on récupère le 4ème
          nbplayers = html.getElementsByClassName("value").Item(4).innerText
          ' 2ème méthode: on récupère la valeur de l'élément "value" de l'élément de classes "info" et "i-player"
          nbplayers = html.querySelector(".info.i-player>.value").innerText
          ' Output the price into a message box.
          MsgBox nbplayers
       
      End Sub
      



      -
      Edité par umfred 28 juin 2021 à 11:57:14

      • Partager sur Facebook
      • Partager sur Twitter
        30 juin 2021 à 11:24:25

        Merci beaucoup pour votre aide ! 

        Maintenant je suis curieux de comprendre :D

        Pour dire que c'est le 7ème élément j'ai fais ctrl+f et je suis tombé sur la 6eme itération. 

        http://image.noelshack.com/fichiers/2021/26/3/1625044850-openclasseroom.png

        Est-ce la mauvaise méthode ?

        Je m'étais rendu compte qu'il y avait un problème avec explorer mais je n'arrivais pas à le résoudre, merci pour cette astuce !

        Par contre un petit problème : j'ai essayé de relancer la macro avec votre programme, mais pour une raison que j'ignore, j'ai le message suivant dès la première ligne : Erreur de compilation : type défini par l'utilisateur non défini. Pour la faire fonctionner j'ai repris l'excel du site internet et je l'ai remplacé par le bon code, mais je n'arrive pas à le faire fonctionner dans une feuille vide.

        Ma prochaine étape est de réussir à afficher la valeur directement dans une cellule, et dans l'idéal de pouvoir effectuer la même opération sur une 50ène de page au même temps, j'espère que vous ne partirez pas de cette page trop vite :D

        Merci encore !

        -
        Edité par SpiickSpiick 30 juin 2021 à 11:30:32

        • Partager sur Facebook
        • Partager sur Twitter
          30 juin 2021 à 15:51:15

          avec le CTRL+F, ça te sors bien l'occurrence du mot "value", qui n'est pas forcément toujours une classe (ça peut une variable ou une partie d'un classe contenant ce mot. 

          la bonne façon (pour moi) c'est plutôt d'utiliser "l'inspecteur" (l'icone avec un curseur qui te permet de sélectionner un élément de la page et qui te montre alors son emplacement dans le code de la page)

          L'erreur est étrange parce que je n'ai pas fondamentalement changer ton code initial (quel mot était souligné lors de l'erreur ?)

          tu as sans doute oublié de cocher la référence Microsoft HTML Object Library dans le menu Outils > Références

          ou alors de passer par du late binding

          Dim html as Object
          Set html = CreateObject("htmlfile")
          



          • Partager sur Facebook
          • Partager sur Twitter
            2 juillet 2021 à 10:10:26

            Bonjour, 

            Oui j'avais bien oublié de cocher la case ! 

            Je mets un peu de temps à répondre car je voulais tout tester et c'est bon, mon programme fonctionne comme je veux grâce à vous !

            Merci beaucoup !

            • Partager sur Facebook
            • Partager sur Twitter

            VBA Excel - Extraire donnée depuis le Web

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown