-2
votes

Web raclant dans investir.com avec Excel VBA

Je n'ai aucune connaissance de VBA. Seul l'enregistreur de macro est utilisé. J'ai besoin de télécharger les données d'une page Web à une feuille de calcul Excel et avec mes connaissances de VBA, je ne suis pas capable.

En particulier, ce que je veux faire une macro à télécharger pour exceler une table de données de la page: https://www.investing.com/equiités/cellnex-telecom-historical-Data P>

Ce téléchargement devrait être configuré en termes de temps, de plage de dates et de commande. p>

Les étapes seraient les suivantes: 1.- L'objectif est de copier les données de la table "ClnX Historical Data" à une feuille de calcul Excel. 2.- Ce téléchargement doit être effectué en sélectionnant précédemment "Mensuel" dans le menu déroulant en appelant "Terme". 3.- Que le téléchargement est effectué en sélectionnant précédemment la gamme de dates depuis 2 ans. 4.- Enfin, commandez le tableau en ordre décroissant par la colonne "maximum". 5.- Une fois le terme, la plage de date et la commande sont sélectionnés, copiez les données de la table "CLNX Historical Data" à une feuille de calcul Excel. P>

J'ai essayé avec l'enregistreur macro, mais je ne suis pas Capable de configurer le terme, la plage de date ou la commande. p>

Quelqu'un pourrait-il m'aider? p>

Merci pour votre aide. P>

Le code: P> >

Sub DataInvesting()

Dim IE As Object

Set IE = CreateObject("InternetExplorer.Application")

IE.navigate "https://www.investing.com/equities/cellnex-telecom-historical-data"

Do Until IE.readyState = 4

DoEvents

Loop

IE.Document.getElementsByClassName("newInput selectBox float_lang_base_1")(0).Value = "Monthly"

IE.Visible = True

Set IE = Nothing

Set appIE = Nothing

End Sub


4 commentaires

Partagez le code que vous avez et expliquez ce qui ne fonctionne pas. Limite à une question par message que je suggérerais.


Sub Datainvesting () Dim Ie comme clé d'objet IE = CreateObject ("Internetexplorer.application") ie.navigater " es.investing.com/equitivities/acs-cons-y-serv-historical-data " faire jusqu'à ce que IE.Readystate = 4 Doopents boucle IE.Document.getelementsBlassName ("newinput Selectbox float_lang_base_1 ") (0) .Value =" Mensuel "IE.Visible = VRAI SET IE = Rien défini appie = rien de fin


Maximum quoi? Changer (dernière colonne?) Et est une option de liste déroulante?


Avez-vous essayé les solutions qui vous sont données?


3 Réponses :


1
votes

Je ne peux pas tester cela comme malgré la mise en place d'un compte gratuit, il continue à dire que le mot de passe est faux. Marre avec 5 réinitiations de mot de passe et même problème et soupçonnez que mes informations sur les médias sociaux.

Les mesures suivantes décrivent largement les étapes que je considérerais bien que certaines attentes chronométrées sont probablement nécessaires. P>

Option Explicit
'VBE > Tools > References:
' Microsoft Internet Controls
Public Sub Info()
    Dim ie As New InternetExplorer  
    Const URL As String  = ""https://www.investing.com/equities/cellnex-telecom-historical-data""
    With ie
        .Visible = True
        .Navigate2 URL

        While .Busy Or .readyState < 4: DoEvents: Wend

        .document.querySelector(".login").Click

        While .Busy Or .readyState < 4: DoEvents: Wend

        .Navigate2 URL

        While .Busy Or .readyState < 4: DoEvents: Wend


        With .document.querySelector("#loginFormUser_email")
            .Focus
            .Value = "Bob@gmail.com"
        End With
        With .document.querySelector("#loginForm_password")
            .Focus
            .Value = "systemSucksDoesn'tAcceptMyPassword"
        End With

        Application.Wait Now + TimeSerial(0, 0, 2)

        .document.querySelector("[onclick*=submitLogin]").Click

        While .Busy Or .readyState < 4: DoEvents: Wend

        .document.querySelector("#data_interval").Click
        .document.querySelector("[value=Monthly]").Click
        With .document.querySelector("#picker")
            .Focus
            .Value = "03/08/2017 - 03/08/2019"
            .FireEvent "onchange"
        End With

        'TODO Sorting column when clarified which column
        .document.querySelector("[title='Download Data']").Click

        Application.Wait Now + TimeSerial(0, 0, 10)

        Stop
        .Quit
    End With
End Sub


0 commentaires

0
votes

Essayez ceci. XXX


0 commentaires

2
votes

Je viens de tester le code suivant et cela fonctionne, au lieu de créer une instance d'Internet Explorer chaque fois que nous devons exécuter cette macro, nous utiliserons des demandes XMLHTTP. Copiez simplement le code entier et collez-le dans un module dans VBA. N'oubliez pas d'ajouter des références (outils / références) à Microsoft HTML Object Library et Microsoft XML V6.0.

Option Explicit
Sub Export_Table()

'Html Objects---------------------------------------'
 Dim htmlDoc As MSHTML.HTMLDocument
 Dim htmlBody As MSHTML.htmlBody
 Dim ieTable As MSHTML.HTMLTable
 Dim Element As MSHTML.HTMLElementCollection


'Workbooks, Worksheets, Ranges, LastRow, Incrementers ----------------'
 Dim wb As Workbook
 Dim Table As Worksheet
 Dim i As Long

 Set wb = ThisWorkbook
 Set Table = wb.Worksheets("Sheet1")

 '-------------------------------------------'
 Dim xmlHttpRequest As New MSXML2.XMLHTTP60  '
 '-------------------------------------------'


 i = 2

'Web Request --------------------------------------------------------------------------'
 With xmlHttpRequest
 .Open "POST", "https://www.investing.com/instruments/HistoricalDataAjax", False
.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
.setRequestHeader "X-Requested-With", "XMLHttpRequest"
.send "curr_id=951681&smlID=1695217&header=CLNX+Historical+Data&st_date=01%2F01%2F2017&end_date=03%2F01%2F2019&interval_sec=Monthly&sort_col=date&sort_ord=DESC&action=historical_data"


 If .Status = 200 Then

        Set htmlDoc = CreateHTMLDoc
        Set htmlBody = htmlDoc.body

        htmlBody.innerHTML = xmlHttpRequest.responseText

        Set ieTable = htmlDoc.getElementById("curr_table")

        For Each Element In ieTable.getElementsByTagName("tr")
            Table.Cells(i, 1) = Element.Children(0).innerText
            Table.Cells(i, 2) = Element.Children(1).innerText
            Table.Cells(i, 3) = Element.Children(2).innerText
            Table.Cells(i, 4) = Element.Children(3).innerText
            Table.Cells(i, 5) = Element.Children(4).innerText
            Table.Cells(i, 6) = Element.Children(5).innerText
            Table.Cells(i, 7) = Element.Children(6).innerText

            i = i + 1
        DoEvents: Next Element
 End If
End With


Set xmlHttpRequest = Nothing
Set htmlDoc = Nothing
Set htmlBody = Nothing
Set ieTable = Nothing
Set Element = Nothing

End Sub

Public Function CreateHTMLDoc() As MSHTML.HTMLDocument
    Set CreateHTMLDoc = CreateObject("htmlfile")
End Function


7 commentaires

Cela effectue-t-il 2 ans dans des intervalles mensuels et triés?


J'ai édité le code pour vous adapter, juste la colonne de données que vous devez formater en tant que texte dans Excel, alors donnez-le d'essayer.


ça a l'air mieux! J'aurai une option avec elle, bien que cela ne soit pas sûr de disposer d'une fonction complète dont le seul but est de générer un fichier HTML lié tardé qui est transmis comme une liaison précoce.


Nice, bien que vous aideriez probablement à op si vous avez inclus une partie d'urlencode plutôt que de l'utilisation déjà codée afin de pouvoir le transmettre des paramètres alternatifs. En outre, votre écriture peut être effectuée avec une seule boucle si vous utilisez une boucle à la longueur -1 (réduire les lignes de code). +1 BTW Ceci est inefficace: set ietable = htmldoc.all.item ("curr_table"), pouvez-vous saisir par ID?


Oui, il peut être saisi par ID, juste testé. Mais de toute façon n'a aucun impact sur la vitesse, comme pour la boucle, je pense que c'est plus propre comme ceci et c'est une boucle unique. Je ne comprends pas la partie où vous dites "d'inclure une partie d'urlencodage plutôt que d'utiliser déjà codée afin de pouvoir passer des paramètres alternatifs" Pouvez-vous expliquer davantage je suis intéressé?


Le point sur ID est la meilleure pratique dans une certaine mesure est le refactoring de la boucle. Il est plus propre de ne pas répéter des lignes inutilement. Mais c'est ta réponse! Le bit d'urlencode est que ceci: "Cour_id = 951681 & SMLID = 1695217 & SMLID = 1695217 & SMLID = CLNX + HISTORIQUE + DATA & ST _DATE = 01% 2F01% 2f2017 & End_Date = 03% 2f01% 2f 2019 & intervalle_sec = MO Nthly & Sort_col = Date et Sort_ord = Desc & Action = Historical_Data est codé (les paramètres de dates), préensément pris à Dev Outils où le navigateur a pris soin des espaces, etc. Vous pouvez utiliser la fonction Encodurl pour faire la même chose.


Vous avez raison, je vais essayer d'essayer d'Urlencode. Merci