0
votes

Comment extraire des données d'un site dans VBA?

J'essaie d'extraire une donnée spécifique d'un site et d'une pâte à une feuille de calcul pour mettre à jour quotidiennement une base de données. Mais comme il est impossible, téléchargez la table comme Excel ou CSV, je devrais extraire la table directement du site.

Suivez mon code et où je suis avec problème (où il y a "ici"). xxx


9 commentaires

Quelle est la solution?


Je ne peux pas extraire les données d'un site et de coller à mon Excel. Ainsi, les étapes "désignent le tableau à extraire et copier les données du tableau - ici" "et" "" zone claire et coller du texte extrait dans la feuille / cellules appropriées - ici "ne sont pas complétés


Vous n'avez pas de code ici qui extrait des données d'un site Web. Il ne fait que naviguer sur le site Web, le permet de charger, puis de le fermer. Quel est votre résultat attendu?


Je ne connais pas le code correct pour extraire des données d'un site, j'ai donc laissé les espaces vides. (J'ai essayé beaucoup d'autres exemples)


Avez-vous une idée de code qui fait cette fonction?


Pouvez-vous publier quelques-uns des exemples afin que nous puissions voir ce qui ne fonctionne pas et suggère comment le faire fonctionner ou supprimer cette option de nos tentatives. On dirait qu'il n'y a pas d'utilisation des commandes de la page Web du tout dans le code, des objets pour les détenir ou les référencer.


Ce n'est pas un service de codage où vous indiquez vos exigences et récupérez le code débogué prêt à exécuter. Vous devez mettre en œuvre vous-même des efforts. Montrez-nous votre code et lisez également ceci: Stackoverflow.com/help/mcve


Vous pouvez essayer de faire référence à ces liens pour obtenir une idée de la manière d'extraire des données de site Web pour exceller. (1) officeetricks.com/extract-data-from-website- to-exceller-vba (2) ExceltrainingVidéos.com/... (3) .uk / blog / S393 / Query-Table.htm (4) WISEOWOOK.CO.UK/BLOG/S393/SCRAPE-WBSITE-HTML.HTM


Avez-vous essayé les solutions données?


3 Réponses :


3
votes

Quelque chose comme devrait fonctionner, j'utilise le presse-papiers pour déplacer les données de la table sur une seule fois.

Sub Scrape_Stats()
    Dim Clip As Object: Set Clip = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
    Dim Text As String
    Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("Sheet1")

    With CreateObject("internetexplorer.application")
        .Navigate "https://www.infomoney.com.br/mercados/ferramentas/contratos-di-futuro"
         Do While .Busy And .readyState <> 4: DoEvents: Loop
         Text = .Document.getElementsByTagName("Table")(1).outerhtml
        .Quit
    End With

    Clip.SetText Text
    Clip.PutInClipboard

    ws.Range("A2:H1000").ClearContents
    ws.Range("A2").Select
    ws.PasteSpecial Format:="Unicode Text"
    Set Clip = Nothing
End Sub


0 commentaires

3
votes

Il est beaucoup plus rapide de délivrer une demande XMLHTTP sans ouvrir un navigateur et analysez le JSON caché dans l'un des attributs ( dicontrancts-dicontract code>) de la réponse.

J'utilise jsonconverter.bas que vous pouvez télécharger à partir de ici . Une fois que vous avez ajouté les .bas à votre projet, allez à Vbe> Outils> Références et ajoutez une référence à Microsoft Scripting Runtime CODE> ET UN POUR Microsoft HTML Library CODE>. P>.

La ligne p> xxx pré>

est de se protéger contre des résultats mis en cache de servie compte tenu des mises à jour de la page fréquentes. P>

Option Explicit
Public Sub GetTable()
    Dim sResponse As String, html As HTMLDocument, json As Object, i As Long
    Application.ScreenUpdating = False
    Set html = New HTMLDocument
    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", "https://www.infomoney.com.br/mercados/ferramentas/contratos-di-futuro", False
        .setRequestHeader "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT"
        .send
        sResponse = StrConv(.responseBody, vbUnicode)
    End With
    With html
        .body.innerHTML = sResponse
        Set json = JsonConverter.ParseJson(.querySelector("#serverDI").getAttribute("data-DIContracts"))
    End With 
    With ThisWorkbook.Worksheets("Sheet1")
        .Cells.ClearContents
        .Cells(1, 1).Resize(1, UBound(json(1).keys) + 1) = json(1).keys
        For i = 1 To json.Count
            .Cells(i + 1, 1).Resize(1, UBound(json(i).keys) + 1) = json(i).Items
        Next
    End With
    Application.ScreenUpdating = True
End Sub


0 commentaires

2
votes

Il y a une autre approche que vous pouvez essayer. J'ai utilisé des sélecteurs dans le script pour secouer la verbosité. XXX PRE>

Référence à ajouter avant exécution: P>

Microsoft Internet Controls
Microsoft HTML Object Library


0 commentaires