Im WebBrowser Document scrollen bis alles geladen wurde

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von maila25.

    Im WebBrowser Document scrollen bis alles geladen wurde

    Hallo,

    es kennen sicher die meisten, man ruft die Suche in Google auf und jedesmal wenn man an das Ende der Seite scrollt wird etwas neues dazu geladen.
    Ich versuche nun im WebBrowser Control eine Google Suche aufzurufen und es soll automatisch so lange ans Ende gescrollt werden bis wirklich alles geladen ist.

    Ich habe es mit diesem Beitrag schon erfolglos versucht.
    vb-paradise.de/index.php/Threa…er%2Bcompleted#post358085

    Bisher versuche ich es mit dem DocumentCompleted event aber irgendwie funktioniert das nicht so richtig.
    Es wird ein paar mal gescrollt und dann passiert nichts mehr, manuell kann ich dann noch scrollen und es wird auch noch etwas neues geladen.
    Habe auch schon einen Sleep eingebaut aber das hat auch nicht geholfen.

    Hier mein Code.

    VB.NET-Quellcode

    1. Private Sub wbrWebSite_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs) Handles wbrWebSite.DocumentCompleted
    2. If (wbrWebSite.ReadyState = WebBrowserReadyState.Complete) Then
    3. wbrWebSite.Document.Window.ScrollTo(0, wbrWebSite.Document.Body.ScrollRectangle.Height)
    4. Threading.Thread.Sleep(5000)
    5. Else
    6. wbrWebSite.Document.Window.ScrollTo(0, 0)
    7. wbrWebSite.Dispose()
    8. End If
    9. End Sub


    Hat jemand eine Idee oder habe ich vielleicht einen ganz falschen Ansatz?

    Vielen Dank im voraus und ein schönes WE :)
    Moin,

    also du suchst mit deinem Webbrowser bei Google z.b. nach "Bücher" und willst dann solange alle Ergebnisse laden bis ca. alle 700mio Einträge da sind?
    Ich denke da wird selbst Google dir schon nen Strich durch die Rechnung machen. Geschweige denn die dauer die es braucht.

    Btw: Wenn ich in Google was suche und ans Ende scrolle kommen nicht automatisch neue Ergebnisse.
    Sondern ich muss auf die nächste Seite klicken.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    Ja da macht Google einem scheinbar einen Strich durch die rechnung, denn es werden wohl nicht mehr alle Ergebnisse rauszugeben. Bei mir ist immer etwa bei Seite 20 schluss.
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin
    Moin,

    sorry für die späte Rückmeldung.

    Ich hätte zu Beginn evtl. erwähnen sollen das es sich um eine Bildersuche bei Google handelt wo man im Suchergebnis scrollen muss damit weitere Ergebnisse geladen werden.
    Das mit dem Scrollen habe ich wie folgt gelöst, vielleicht nicht ganz elegant aber es Funktioniert.
    Ich rufe die Seite auf, scrolle fast bis ans Ende und den Rest erledigt ein Timer.

    VB.NET-Quellcode

    1. Private h As Integer
    2. wbrWebSite.Navigate("URL")
    3. h = wbrWebSite.Document.Body.ScrollRectangle.Height
    4. wbrWebSite.Document.Window.ScrollTo(0, wbrWebSite.Document.Body.ScrollRectangle.Height - 200)
    5. Timer1.Enabled = True
    6. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    7. wbrWebSite.Document.Window.ScrollTo(0, wbrWebSite.Document.Body.ScrollRectangle.Height - 200)
    8. If h < wbrWebSite.Document.Body.ScrollRectangle.Height Then
    9. wbrWebSite.Document.Window.ScrollTo(0, wbrWebSite.Document.Body.ScrollRectangle.Height - 200)
    10. h = wbrWebSite.Document.Body.ScrollRectangle.Height
    11. Else
    12. Timer1.Enabled = False
    13. wbrWebSite.Document.Window.ScrollTo(0, 0)
    14. End If
    15. End Sub


    Nichtsdestotrotz habe ich mich mit der API beschäftigt, sowohl Google als auch Bing.

    Google:
    https://developers.google.com/custom-search/v1/overview

    Man benötigt einen API Key und die ID einer Custom Search Engine, beides kann man selbst erstellen.
    Die Google Suche erlaubt maximal 100 Suchanfragen pro Tag und liefert maximal 100 Ergebnisse pro Suchanfrage.
    Alles darüber hinaus ist kostenpflichtig aber ich denke damit sollte man auskommen.
    Die Ergebnisse kommen als JSON und man benötigt das Nuget Package von Newtonsoft.

    Hier die Funktion:

    VB.NET-Quellcode

    1. Public Shared Function Get_Google_Results(ByVal search As String) As List(Of String)
    2. Dim results As New List(Of String)
    3. Dim cx As String = "[Meine Custom Search Engine ID]"
    4. Dim apiKey As String = "[Mein API Key]"
    5. 'Beachten: &start= definiert von welcher Seite (1 bis 10) die Suchergebnisse abgerufen werden, Seite 1 = &start=1, Seite 2 = &start=11, Seite 3 = &start=21, usw.
    6. '&num= definiert wie viele Ergenisse von jeder Seite zurückgegeben werden (1 bis 10)
    7. Dim request As WebRequest = WebRequest.Create("https://www.googleapis.com/customsearch/v1?q=" & search & "&start=" & page & "&num=10" & "&cx=" & cx & "&searchType=image&key=" & apiKey)
    8. Dim response As HttpWebResponse = request.GetResponse()
    9. Dim dataStream As Stream = response.GetResponseStream
    10. Dim reader As New StreamReader(dataStream)
    11. Dim responseString As String = reader.ReadToEnd
    12. Dim ser As JObject = JObject.Parse(responseString)
    13. Dim data As List(Of JToken) = ser.Children().ToList
    14. For Each item As JProperty In data
    15. item.CreateReader()
    16. Select Case item.Name
    17. Case "items"
    18. For Each msg As JObject In item.Values
    19. Dim link As String = msg("link")
    20. results.Add(link)
    21. Next
    22. End Select
    23. Next
    24. Next
    25. Return results
    26. End Function



    Bing:
    https://azure.microsoft.com/en-us/services/cognitive-services/bing-web-search-api/

    Man benötigt einen Account bei Azure und kann sich dort einen API Key holen.
    Hier hat man pro Monat 3000 Suchanfragen mit je 150 Ergebnissen, auch hier ist alles darüber hinaus kostenpflichtig.
    Auch hier kommt das Ergebnis als JSON zurück.

    Man kann auch hier noch verschiedene Parameter mitgeben:
    docs.microsoft.com/de-de/rest/…eference#query-parameters

    Hier die Funktion:

    VB.NET-Quellcode

    1. Const strKey As String = "[Main API Key]"
    2. Const strURL As String = "https://api.cognitive.microsoft.com/bing/v7.0/images/search"
    3. Public Shared Function SearchBing(ByVal strQuery As String) As List(Of String)
    4. Dim results As New List(Of String)
    5. Dim uriQuery = strURL & "?q=" + Uri.EscapeDataString(strQuery)
    6. Dim wbReq As WebRequest = HttpWebRequest.Create(uriQuery)
    7. wbReq.Headers("Ocp-Apim-Subscription-Key") = strKey
    8. Dim hResp As HttpWebResponse = CType(wbReq.GetResponseAsync().Result, HttpWebResponse)
    9. Dim strJSON As String = New StreamReader(hResp.GetResponseStream()).ReadToEnd()
    10. Dim ser As JObject = JObject.Parse(strJSON)
    11. Dim data As List(Of JToken) = ser.Children().ToList
    12. For Each item As JProperty In data
    13. item.CreateReader()
    14. Select Case item.Name
    15. Case "value"
    16. For Each msg As JObject In item.Values
    17. Dim link As String = msg("contentUrl")
    18. results.Add(link)
    19. Next
    20. End Select
    21. Next
    22. Return results
    23. End Function


    Danke und ich hoffe das andere auch etwas damit Anfangen können.
    LG