1
votes

Comment Web Scrape le site dans Excel / Google Sheets?

Comment puis-je gratter cette page Web https: //www.bseindia.com/stock-share-price/asian-paints-ltd/asianpaint/500820/ et avez spécifiquement besoin du chiffre de ROE mentionné dans le tableau?

J'ai utilisé le code suivant dans Exceller. Je ne sais pas grand-chose sur Google Sheets Scraping

 Sub FetchData()
    With ActiveSheet.QueryTables.Add(Connection:= _
        "URL;https://www.bseindia.com/stock-share-price/asian-paints-ltd/asianpaint/500820/", Destination:=Range( _
        "$A$1"))
        .Name = "www"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .WebSelectionType = xlEntirePage
        .WebFormatting = xlWebFormattingNone
        .WebPreFormattedTextToColumns = True
        .WebConsecutiveDelimitersAsOne = True
        .WebSingleBlockTextImport = False
        .WebDisableDateRecognition = False
        .WebDisableRedirections = False
        .Refresh BackgroundQuery:=False
    End With
End Sub

Je n'ai pas pu récupérer les données correctement.

Des suggestions / de l'aide à ce sujet? Besoin du ROE, le reste n'est pas obligatoire.


2 commentaires

Il manque deux balises principales excel et vba .


La question est trop large car elle concerne apparemment des fonctionnalités qui fonctionnent très différemment sur deux applications de feuille de calcul.


3 Réponses :


0
votes

Voici la façon dont je trouve plus facile d'obtenir cette valeur particulière. Une fois que la boucle for détecte ROE , elle ira après la valeur requise et quittera la boucle car ils sont tous les deux dans le même nœud parent.

Microsoft Html Object Library
Microsoft Internet Controls

Références à ajouter:

Sub FetchData()
    Dim IE As New InternetExplorer, post As Object
    Dim Html As HTMLDocument, elem As Object

    With IE
        .Visible = False
        .navigate "https://www.bseindia.com/stock-share-price/asian-paints-ltd/asianpaint/500820/"
        While .Busy Or .readyState < 4: DoEvents: Wend
        Set Html = .document
    End With

    For Each post In Html.getElementsByTagName("td")
        If post.innerText = "ROE" Then
            Set elem = post.ParentNode.querySelector(".textvalue")
            Exit For
        End If
    Next post

    [A1] = elem.innerText
End Sub


7 commentaires

J'ai peur de savoir comment ajouter deux de ces références?


Consultez ce lien pour en savoir plus.


Merci beaucoup! Je vais approfondir cela. Encore merci


Fait! Encore une fois merci beaucoup. Simplifie beaucoup pour moi.


SIM ~ cela me donne une erreur d'exécution '91': variable d'objet ou avec variable de bloc non définie


J'ai essayé plusieurs fois mais je n'ai pas pu reproduire l'erreur. Cependant, tout dépend de votre vitesse Internet, car il faut parfois un peu plus de temps pour que l'élément se charge correctement. Dans de tels cas, un peu d'attente aide. Essayez d'utiliser cette ligne Application.Wait Now + TimeValue ("00:00:05") entre End With et For Each post dans ce qui précède scénario.


Il fonctionne maintenant. J'y ai également ajouté plusieurs liens d'entreprise.



0
votes

Malheureusement, cela ne sera pas possible car le site est contrôlé par JavaScript et Google Sheets ne peut pas comprendre / importer JS. vous pouvez tester cela simplement en désactivant JS pour un lien donné et vous verrez une page vierge:

0

tout ce que vous pouvez obtenir est ce que vous voyez: p>

=ARRAY_CONSTRAIN(IMPORTDATA("https://www.bseindia.com/stock-share-price/asian-paints-ltd/asianpaint/500820/"), 5000, 15)


1 commentaires

La saisie manuelle des données fonctionne, je suppose, à la fin de la journée, lorsque l'automatisation n'aide pas. Bien que j'ai remarqué qu'ils ont changé les fonctionnalités du site. Il m'arrive de gratter le Web d'autres choses sur le site assez facilement, mais cela semblait difficile à craquer. Ce que vous avez mentionné explique tout. Merci



0
votes

Utilisez l'API que la page utilise beaucoup plus rapidement. Vous pouvez utiliser powerquery pour gérer la réponse json, un analyseur json ou simplement utiliser split. Placez le code dans un module standard et créez un lien vers un bouton si vous souhaitez actualiser en appuyant sur un bouton.

Option Explicit
Public Sub GetInfo()
    Dim s As String, ids(), i As Long
    ids = Array(500820, 500312, 500325, 532540)
    With CreateObject("MSXML2.XMLHTTP")
        For i = LBound(ids) To UBound(ids)
            .Open "GET", "https://api.bseindia.com/BseIndiaAPI/api/ComHeader/w?quotetype=EQ&scripcode=" & ids(i) & "&seriesid=", False
            .send
            s = .responseText
            ActiveSheet.Cells(i + 1, 1) = Split(Split(s, """ROE"":""")(1), Chr$(34))(0)
        Next
    End With
End Sub


10 commentaires

Merci, cela fonctionne bien et que diriez-vous si je souhaite utiliser plusieurs données d'entreprise? Comment dois-je procéder?


Vous utiliseriez une boucle. Quelles sont les différentes entreprises? Vous devez concaténer l'ID approprié dans l'appel de l'API.


Pour être honnête, je ne suis pas très fan de VBA. Comme je l'ai mentionné plus tôt, des choses simples sont faisables par moi. Mais pas beaucoup de détails, je peux entrer dans cette chose


Par exemple 500312, 500325, 532540


bseindia.com/stock-share-price / tata-consultancy-services-ltd‌ /…


bseindia.com/stock -partage-prix /…


bseindia.com/stock-share-price/reliance -industries-ltd / relia‌ nce /…


Bien compris maintenant. Merci!


J'ai joué avec le code car celui-ci fonctionnait bien. Comme j'y ai ajouté d'autres variables qui ont été affichées dans cette boîte. Mais je suis coincé avec d'autres variables, à savoir le tableau des résultats et du modèle d'actionnariat. Cela a-t-il à voir avec le lien API ou autre chose? Je ne sais pas comment procéder à partir d'ici.


Veuillez poster une nouvelle question, ajoutez votre code actuel et envoyez-moi le lien ici.