Webscraping

Status
Niet open voor verdere reacties.

Rabberzzz

Gebruiker
Lid geworden
10 apr 2018
Berichten
59
Dag allen,

Als VBA noob ben ik aan het knippen en plakken gegaan van allerlei webscraping voorbeelden die ik maar kon vinden om uiteindelijk voor elkaar te krijgen wat ik wilde.
Het lastige aan dit project was dat het een laad meer resultaten button bevat.

Hoewel mijn bij elkaar gefrutselde VBA code werkt, ben ik benieuwd of het slimmer kan, misschien wat sneller en wat meer future proof is. Echter kom ik erachter dat mijn kennis en ervaring niet toereikend genoeg zijn om de oplossing te vinden.
Mocht iemand mij kunnen helpen schroom aub dan niet.

De code die ik gebruik:

Code:
Sub LaadAllePaginaenScrape()
    Dim i As Long
    Dim URL As String
    Dim ie As Object
    Dim objElement As Object
    Dim objCollection As Object
    'Dim ieObj As InternetExplorer
    Dim htmlEle As IHTMLElement
    Dim e As Integer
    
    e = 1
    

    Set ie = CreateObject("InternetExplorer.Application")

    ie.Visible = True

    URL = "https://sportvloeren.sport.nl/sportvloerenlijst"

    ie.navigate URL

    Application.StatusBar = URL & " is loading. Please wait..."

    Do While ie.readyState = 4: DoEvents: Loop
    Do Until ie.readyState = 4: DoEvents: Loop

    Application.StatusBar = URL & " Loaded"
    
    Application.Wait (Now + TimeValue("0:00:03"))

    botao = ie.document.getElementsByClassName("btn btn-primary center-block ng-binding")
    botao.Click (1)
    
    Application.Wait (Now + TimeValue("0:00:03"))

    botao = ie.document.getElementsByClassName("btn btn-primary center-block ng-binding")
    botao.Click (1)

    Application.Wait (Now + TimeValue("0:00:03"))

    botao = ie.document.getElementsByClassName("btn btn-primary center-block ng-binding")
    botao.Click (1)

    Application.Wait (Now + TimeValue("0:00:03"))

    botao = ie.document.getElementsByClassName("btn btn-primary center-block ng-binding")
    botao.Click (1)

    Application.Wait (Now + TimeValue("0:00:03"))

    botao = ie.document.getElementsByClassName("btn btn-primary center-block ng-binding")
    botao.Click (1)

    Application.Wait (Now + TimeValue("0:00:03"))

    botao = ie.document.getElementsByClassName("btn btn-primary center-block ng-binding")
    botao.Click (1)


    Application.Wait (Now + TimeValue("0:00:03"))

    botao = ie.document.getElementsByClassName("btn btn-primary center-block ng-binding")
    botao.Click (1)

    Application.Wait (Now + TimeValue("0:00:03"))

    botao = ie.document.getElementsByClassName("btn btn-primary center-block ng-binding")
    botao.Click (1)

    Application.Wait (Now + TimeValue("0:00:03"))

    botao = ie.document.getElementsByClassName("btn btn-primary center-block ng-binding")
    botao.Click (1)

    Application.Wait (Now + TimeValue("0:00:03"))

    botao = ie.document.getElementsByClassName("btn btn-primary center-block ng-binding")
    botao.Click (1)

    Application.Wait (Now + TimeValue("0:00:03"))

    botao = ie.document.getElementsByClassName("btn btn-primary center-block ng-binding")
    botao.Click (1)

    Application.Wait (Now + TimeValue("0:00:03"))

    botao = ie.document.getElementsByClassName("btn btn-primary center-block ng-binding")
    botao.Click (1)

    Application.Wait (Now + TimeValue("0:00:03"))

    botao = ie.document.getElementsByClassName("btn btn-primary center-block ng-binding")
    botao.Click (1)

    Application.Wait (Now + TimeValue("0:00:03"))

    botao = ie.document.getElementsByClassName("btn btn-primary center-block ng-binding")
    botao.Click (1)

    Application.Wait (Now + TimeValue("0:00:03"))

    botao = ie.document.getElementsByClassName("btn btn-primary center-block ng-binding")
    botao.Click (1)

    Application.Wait (Now + TimeValue("0:00:03"))

    botao = ie.document.getElementsByClassName("btn btn-primary center-block ng-binding")
    botao.Click (1)

    Application.Wait (Now + TimeValue("0:00:03"))

    botao = ie.document.getElementsByClassName("btn btn-primary center-block ng-binding")
    botao.Click (1)

    Application.Wait (Now + TimeValue("0:00:03"))

    botao = ie.document.getElementsByClassName("btn btn-primary center-block ng-binding")
    botao.Click (1)

    Application.Wait (Now + TimeValue("0:00:03"))

    botao = ie.document.getElementsByClassName("btn btn-primary center-block ng-binding")
    botao.Click (1)


    Application.Wait (Now + TimeValue("0:00:03"))

    botao = ie.document.getElementsByClassName("btn btn-primary center-block ng-binding")
    botao.Click (1)

    Application.Wait (Now + TimeValue("0:00:03"))

    botao = ie.document.getElementsByClassName("btn btn-primary center-block ng-binding")
    botao.Click (1)

    Application.Wait (Now + TimeValue("0:00:03"))

    botao = ie.document.getElementsByClassName("btn btn-primary center-block ng-binding")
    botao.Click (1)

    Application.Wait (Now + TimeValue("0:00:03"))

    botao = ie.document.getElementsByClassName("btn btn-primary center-block ng-binding")
    botao.Click (1)

    Application.Wait (Now + TimeValue("0:00:03"))

    botao = ie.document.getElementsByClassName("btn btn-primary center-block ng-binding")
    botao.Click (1)

    Application.Wait (Now + TimeValue("0:00:03"))

    botao = ie.document.getElementsByClassName("btn btn-primary center-block ng-binding")
    botao.Click (1)

    Application.Wait (Now + TimeValue("0:00:03"))

    botao = ie.document.getElementsByClassName("btn btn-primary center-block ng-binding")
    botao.Click (1)

    Application.Wait (Now + TimeValue("0:00:03"))

    botao = ie.document.getElementsByClassName("btn btn-primary center-block ng-binding")
    botao.Click (1)

    Application.Wait (Now + TimeValue("0:00:03"))

    botao = ie.document.getElementsByClassName("btn btn-primary center-block ng-binding")
    botao.Click (1)

    Application.Wait (Now + TimeValue("0:00:03"))

    botao = ie.document.getElementsByClassName("btn btn-primary center-block ng-binding")
    botao.Click (1)

    Application.Wait (Now + TimeValue("0:00:03"))

    botao = ie.document.getElementsByClassName("btn btn-primary center-block ng-binding")
    botao.Click (1)

    Application.Wait (Now + TimeValue("0:00:03"))

    botao = ie.document.getElementsByClassName("btn btn-primary center-block ng-binding")
    botao.Click (1)

    Application.Wait (Now + TimeValue("0:00:03"))

    botao = ie.document.getElementsByClassName("btn btn-primary center-block ng-binding")
    botao.Click (1)


    Application.Wait (Now + TimeValue("0:00:03"))

    botao = ie.document.getElementsByClassName("btn btn-primary center-block ng-binding")
    botao.Click (1)

    Application.Wait (Now + TimeValue("0:00:03"))

    botao = ie.document.getElementsByClassName("btn btn-primary center-block ng-binding")
    botao.Click (1)

    Application.Wait (Now + TimeValue("0:00:03"))

    botao = ie.document.getElementsByClassName("btn btn-primary center-block ng-binding")
    botao.Click (1)

    Application.Wait (Now + TimeValue("0:00:03"))

    botao = ie.document.getElementsByClassName("btn btn-primary center-block ng-binding")
    botao.Click (1)

    Application.Wait (Now + TimeValue("0:00:03"))

    botao = ie.document.getElementsByClassName("btn btn-primary center-block ng-binding")
    botao.Click (1)

    Application.Wait (Now + TimeValue("0:00:03"))

    botao = ie.document.getElementsByClassName("btn btn-primary center-block ng-binding")
    botao.Click (1)

    Application.Wait (Now + TimeValue("0:00:03"))

    botao = ie.document.getElementsByClassName("btn btn-primary center-block ng-binding")
    botao.Click (1)

    Application.Wait (Now + TimeValue("0:00:03"))

    botao = ie.document.getElementsByClassName("btn btn-primary center-block ng-binding")
    botao.Click (1)


    Application.Wait (Now + TimeValue("0:00:03"))

    botao = ie.document.getElementsByClassName("btn btn-primary center-block ng-binding")
    botao.Click (1)

    Application.Wait (Now + TimeValue("0:00:03"))

    botao = ie.document.getElementsByClassName("btn btn-primary center-block ng-binding")
    botao.Click (1)

    Application.Wait (Now + TimeValue("0:00:03"))

    botao = ie.document.getElementsByClassName("btn btn-primary center-block ng-binding")
    botao.Click (1)

    Application.Wait (Now + TimeValue("0:00:03"))

    botao = ie.document.getElementsByClassName("btn btn-primary center-block ng-binding")
    botao.Click (1)

    Application.Wait (Now + TimeValue("0:00:03"))

    botao = ie.document.getElementsByClassName("btn btn-primary center-block ng-binding")
    botao.Click (1)

    Application.Wait (Now + TimeValue("0:00:03"))

    botao = ie.document.getElementsByClassName("btn btn-primary center-block ng-binding")
    botao.Click (1)

    Application.Wait (Now + TimeValue("0:00:03"))

    botao = ie.document.getElementsByClassName("btn btn-primary center-block ng-binding")
    botao.Click (1)

    Application.Wait (Now + TimeValue("0:00:03"))
    
    For Each htmlEle In ie.document.getElementsByClassName("table")(0).getElementsByTagName("tr")
        With ActiveSheet
            .Range("A" & e).Value = htmlEle.Children(0).textContent
            .Range("B" & e).Value = htmlEle.Children(3).textContent
            .Range("C" & e).Value = htmlEle.Children(4).textContent
        End With
       
        e = e + 1
    Next htmlEle
    
End Sub

Mij leek het zelf handiger door een soort van loop te hebben tot het disabled tegen komt in de button code, zie hieronder het vetgedrukte.

HTML Code voor elke keer dat je op de button kunt klikken.
Code:
<button class="btn btn-primary center-block ng-binding" ng-disabled="!lastCallHadData" ng-click="addPage()" data-ajaxform-clicked="">
                    <span ng-show="loading" class="glyphicon glyphicon-refresh spinning ng-hide"></span> Laad meer resultaten

HTML Code wanneer de hele lijst geladen is en er niet meer op de button geklikt kan worden.
Code:
<button class="btn btn-primary center-block ng-binding" ng-disabled="!lastCallHadData" ng-click="addPage()" data-ajaxform-clicked="" [B]disabled="disabled[/B]">
                    <span ng-show="loading" class="glyphicon glyphicon-refresh spinning ng-hide"></span> Meer resultaten niet gevonden
                </button>

Een loop tot aan disabled lijkt mij future proof genoeg, als er items aan de lijst worden toegevoegd waardoor er meerdere keren op laad meer resultaten button geklikt moet worden dan doet de VBA code dat automatisch voordat het bij mij in een excel sheet zet.

Ik heb andere berichten op dit forum gelezen over webscraping middels VBA, dat wanneer de structuur van een pagina verandert ik wel eens een niet werkend code zou hebben. Eerlijk ben ik dat niet zo bang voor aangezien de betreffende pagina al jaren wordt gebruikt op deze manier en zover ik weet dit ook voorlopig niet gaat gebeuren. Als dit wel zo is hoop ik op kleine wijzigingen.
 
Maar er is ook iets van auteursrechten, en mogelijk databankrecht. Hoe weten wij of het legaal is wat jij wilt bereiken?

Mijn advies: Neem contact met de partij of ze een API aan kunnen bieden die het in csv, json of xml formaat aanbiedt.
 
Goh, ja dat is een goeie. Het lijkt mij niet, maar zeker weten doe ik dat ook niet. Is er een bepaalde checklijst, of durft iemand te kijken op de desbetreffende website die in de code staat om te achterhalen of het valt onder auteursrechten en/of databankrecht?
Het is een publieke website vandaar dat ik denk dat het volgens mij wel mag, maar zeker weten doe ik dat niet want ik ben daar niet in thuis. Ik zou niet eens precies weten wat ik hun moet vragen. Ik zou jou advies kopieren en plakken alszijnde vraag haha.

Jammer dat dit een dood spoor lijkt, of kan iemand een totaal andere voorbeeld loop presenteren die het mogelijk maakt om laten blijven klikken tot het disabled bereikt heeft?
 
Dit is de achterliggend URL.
Code:
https://sportvloeren.sport.nl/umbraco/[COLOR=#FF0000]api[/COLOR]/sportvloerenlijstapi/getsportvloeren?page=[COLOR=#FF0000]1[/COLOR]
de pagina haalt zijn data ook bij een API.
Je krijgt dan een JSON als resultaat.
Je kan bij page steeds een ander nummer intypen.
Code:
https://sportvloeren.sport.nl/umbraco/api/sportvloerenlijstapi/getsportvloeren?page=46
Is de laatste op dit moment.
 
Laatst bewerkt:
Maar let wel op dat een ongedocumenteerde API geen vrijbrief is om zomaar data te mogen gebruiken. Dus vraag toestemming!
Je zal vast geen zin hebben in een factuurtje van misschien wel €400 of een brief van een advocaat.

Ik zeg het maar even ;-)
 
Het is natuurlijk niet de bedoeling om dit dagelijks te doen, maar b.v. eens per maand.
Het lijkt me ook niet dat er dagelijks sportvloeren bijkomen ;)
 
Dagelijks, wekelijks, jaarlijks, per uur ....
Het blijft auteursrecht waar je een licentie voor moet aanvragen, ongeacht hoe vaak je het gebruikt.
 
Laatst bewerkt:
Laten we afspreken dat je eerst uitzoekt hoe het precies zit. Tot die tijd gaat deze dicht. Zodra je duidelijkheid heb kan je verzoek doen tot heropening.

Met dank aan alphamax Lees en oordeel zelf, zie https://blog.iusmentis.com/2013/02/0...se-engineeren/

Bericht van TS: Excuus voor de verwarring van mijn gesloten topic(zie titel voor het onderwerp van de topic).
Inmiddels heb ik een mailtje gestuurd met het verzoek tot toegang van de API.
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan