IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Import de données web [XL-2019]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 55
    Par défaut Import de données web
    Bonjour à tous.
    J’essaie d’importé les données du lien https://www.flashscore.fr/match/0fZO...r-statistics;0 en utilisant la méthode avec Internet exp de qwazerty

    Cependant le site semble ne plus fonctionner avec IE
    Existe-t-il une autre méthode pour importer les données ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Sub importWEB2()
     
     
    'Déclaration des variables
    Dim IE As New InternetExplorer
    Dim IEDoc As HTMLDocument
    Dim HtmlElementStandard As HTMLGenericElement
    Dim lien As String
    Dim coll_class As IHTMLElementCollection
    Dim li As HTMLGenericElement
     
    'On ouvre la page Web
       IE.navigate "https://www.flashscore.fr/match/0fZOvsc0/#player-statistics;0"
       IE.Visible = True
       WaitIE IE
       Set IEDoc = IE.document
     
     
       End Sub



    Merci pour votre aide

  2. #2
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 241
    Par défaut
    hello,
    si tu as edge chromium ou google chrome ou firefox tu peux utiliser selenium basic ( voir ici)

    voici par exemple comment charger ta page avec selenium basic en utilisant chrome :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Public Sub RecuperFlashscore()
    Dim robot As New WebDriver
    Dim elem As Object
    robot.Timeouts.ImplicitWait = 8000  ' temps max 8 secondes pour les commandes find avant exception
    robot.Start "chrome", "https://www.flashscore.fr"
    robot.Get "/match/0fZOvsc0/#player-statistics;0"
    robot.Wait (20000) ' temporisation de 20 secondes avant de sortir
    robot.Quit
    End Sub
    Ami calmant, J.P

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 55
    Par défaut
    Bonjour jurassic pork

    Merci beaucoup ça marche super bien

    J’essaie de reproduire une macro déjà faite en version IE en version Selenium que tu as fournis afin de comprendre un peu le fonctionnement (pour l’instant j’arrive à prendre les données du tableaux)

    Je bloque sur les fameux « .Children » ( avec selenium je ne trouve pas comment faire ) afin de prendre un élément précis

    Voici en exemple

    Ex : version IE

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
    Sub testIE()
     
    'Déclaration des variables
    Dim IE As New InternetExplorer
    Dim IEDoc As HTMLDocument
    Dim HtmlElementStandard As HTMLGenericElement
    Dim coll_class As IHTMLElementCollection
    Dim li As HTMLGenericElement
    Dim y As Byte
    Dim b As Byte
     
     
    Sheets("Feuil1").Range("A2:G100").ClearContents
     y = 2
     b = 18
    'On ouvre la page Web
       IE.Navigate "https://fr.global.nba.com/boxscore/#!/0041900406"
       IE.Visible = True
       WaitIE IE
       Set IEDoc = IE.Document
       Application.Wait Now + TimeValue("00:00:02")
     
     
    'click pour equipe 1
    For Each bt In IEDoc.getElementsByClassName("pills-boxscore__container")(0).getElementsByTagName("div")
    bt.Children(0).Click
    Next
     
    Application.Wait Now + TimeValue("00:00:01")
     
    'click pour recuperation
    For Each li In IEDoc.getElementsByClassName("nba-stat-table__overflow")(0).getElementsByTagName("tr")
    On Error Resume Next
       Sheets("Feuil1").Range("a" & y) = li.Children(0).Children(1).Children(0).innerText 'nom
       Sheets("Feuil1").Range("b" & y) = li.Children(0).Children(1).Children(2).innerText ' prenom
       Sheets("Feuil1").Range("d" & y) = li.Children(4).innerText 'point
     y = y + 1
     
    Next
     
    'click pour equipe 2
    For Each bt In IEDoc.getElementsByClassName("pills-boxscore__container")(0).getElementsByTagName("div") 'click pour equipe 2
    bt.Children(1).Click
    Next
     
    Application.Wait Now + TimeValue("00:00:01")
     
    For Each li In IEDoc.getElementsByClassName("nba-stat-table__overflow")(0).getElementsByTagName("tr")
    On Error Resume Next
     Sheets("Feuil1").Range("a" & b) = li.Children(0).Children(1).Children(0).innerText 'nom
     Sheets("Feuil1").Range("b" & b) = li.Children(0).Children(1).Children(2).innerText ' prenom
      Sheets("Feuil1").Range("d" & b) = li.Children(4).innerText 'point
     b = b + 1
     
    Next
     
       'On libère les variables
       IE.Quit
       Set IE = Nothing
       Set IEDoc = Nothing
       Application.ScreenUpdating = True
     
       MsgBox " FIN IMPORT WEB"
    End Sub
     
     
    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


    VERSION SELENIUM ( en test )


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    Public Sub testselenium()
    Dim robot As New WebDriver
    Dim elem As Object
    cc = 1
    robot.Timeouts.ImplicitWait = 8000  ' temps max 8 secondes pour les commandes find avant exception
    robot.Start "chrome", "https://fr.global.nba.com"
    robot.Get "/boxscore/#!/0041900406"
     
    robot.Wait (3000)
    For Each li In robot.FindElementByClass("nba-stat-table__overflow").FindElementByTag("table").FindElementsByTag("tbody")
    For Each t In li.FindElementsByTag("tr")
     
        For Each h In t.FindElementsByTag("td")
              Sheets("Feuil1").Cells(cc, 1) = h.Text
    cc = cc + 1
    Next
     
    Next t
    Next
     
    'robot.Wait (20000) ' temporisation de 20 secondes avant de sortir
    robot.Quit
    End Sub


    merci encore pour votre aide et conseil


    ps : Selenium doit être installer sur chaque poste qui utilise la macro ?

  4. #4
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 241
    Par défaut
    hello,
    Citation Envoyé par vad92 Voir le message
    Je bloque sur les fameux « .Children » ( avec selenium je ne trouve pas comment faire ) afin de prendre un élément précis
    ps : Selenium doit être installer sur chaque poste qui utilise la macro ?
    il y a la recherche par XPath qui permet de faire des recherches ciblées
    exemple pour ton cas pour récupérer tous les éléments du tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Public Sub RecupTableauFlashscore()
    Dim robot As New WebDriver
    Dim elem, maTable, colonnes, colonne, lignes, ligne As Object
    Dim x, y As Integer
    robot.Timeouts.ImplicitWait = 8000  ' temps max 8 secondes pour les commandes find avant exception
    robot.Start "chrome", "https://www.flashscore.fr"
    robot.Get "/match/0fZOvsc0/#player-statistics;0"
    Set maTable = robot.FindElementById("player-statistics-basketball")
    Set colonnes = maTable.FindElementsByClass("txt")
    x = 1
    y = 1
    For Each colonne In colonnes
    'Debug.Print colonne.Attribute("textContent")
    Cells(x, y).Value = colonne.Attribute("textContent")
    y = y + 1
    Next
    x = 2
    Set lignes = maTable.FindElementsByXPath(".//tbody/tr")
    'Debug.Print lignes.Count
    For Each ligne In lignes
        y = 1
        Set colonnes = ligne.FindElementsByXPath(".//td")
        For Each colonne In colonnes
            'Debug.Print colonne.Attribute("textContent")
            Cells(x, y).Value = colonne.Attribute("textContent")
            y = y + 1
        Next
        x = x + 1
    Next
    robot.Wait (1000) ' temporisation de 1 seconde avant de sortir
    robot.Quit
    End Sub
    L'execution est assez lente car on fait les recherches sur chaque élément.
    J'ai trouvé une méthode beaucoup plus rapide :
    Le copier / coller du tableau en utilisant le presse papier. Pour pouvoir utiliser les fonctions du presse-papier il faut qu'il y ait une userform (même sans rien) sinon la référence Microsoft Forms 2 qu'il faut utiliser n'existe pas dans les références.
    Voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Public Sub RecupTableauFlashscore2()
    Dim robot As New WebDriver
    Dim  maTable As Object
    Dim clipboard As MSForms.DataObject
    robot.Timeouts.ImplicitWait = 8000  ' temps max 8 secondes pour les commandes find avant exception
    robot.Start "chrome", "https://www.flashscore.fr"
    robot.Get "/match/0fZOvsc0/#player-statistics;0"
    Set maTable = robot.FindElementById("player-statistics-basketball")
    Set clipboard = New MSForms.DataObject
    clipboard.SetText maTable.Attribute("outerHTML")
    clipboard.PutInClipboard
    Range("A1").Select
    ActiveSheet.Paste
    robot.Wait (1000) ' temporisation de 1 seconde avant de sortir
    robot.Quit
    End Sub
    ce code est peut-être faisable avec IE sans selenium.

    Oui il faut installer selenium, là où la macro doit fonctionner. On ne peut pas "embarquer" selenium.

    Ami calmant, J.P

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 55
    Par défaut
    Fantastique !!!!
    la deuxième soluce whoua
    Merci beaucoup

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 55
    Par défaut
    Bonjour,

    Je réouvre le sujet pour une petite question.

    Les méthodes du dessus marche super bien , mais je suis bloquer sur le click d'un bouton

    exemple sur le site "https://fr.global.nba.com/boxscore/#!/0012000028"

    je n'arrive pas à sélectionner les boutons "CLE" ou "NYK" ce qui permet de sélectionner l'équipe pour les stats

    j'essaye ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    robot.FindElementByXPath("/html/body/div[2]/div[2]/div[3]/div/div[2]/div[2]/section/div/div/div/div[2]/div/div/div[1]/div/a[2]").Click
    mais ca ne marche pas

    Merci pour votre aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Macro pour importer des données web avec plusieurs variables
    Par lajim dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 17/04/2015, 15h46
  2. [XL-2010] Impossible d'importer des données web
    Par josmel dans le forum Excel
    Réponses: 1
    Dernier message: 17/12/2014, 22h31
  3. [WD15] importation de donnée web vers une table windev
    Par didiflo dans le forum WinDev
    Réponses: 2
    Dernier message: 21/03/2012, 12h02
  4. importer des données web sur excel
    Par irouni dans le forum Excel
    Réponses: 3
    Dernier message: 18/12/2007, 11h12
  5. Importer base données (web) sous Excel ou Access
    Par altarez dans le forum Général VBA
    Réponses: 5
    Dernier message: 20/08/2007, 11h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo