Daten Abruf Internetseite
#11
Hi Case,

ich kann in der Doku nicht finden, wie z.B. das Blättern oder eine andere Auswahl treffen, auf einer Websiete angestossen werden kann. Das ist aber notwendig, da dies Power Query, zumindest bisher, noch nicht kann.

Im folgenden Link wird eine Möglichkeit erläutert.

https://stackoverflow.com/questions/6245...ed-results

Am Ende schreibt Kristine Lian, dass sie es damit hinbekommen hat, aber ihren Lösungscode zeigt sie leider nicht.
Antworten Top
#12
Moin ws-53, 19 

da ich das nicht benötige, bzw. es mich auch nicht interessiert, habe ich mich damit noch nicht intensiv beschäftigt. Habe auch nur gelesen, dass es gehen soll - allerdings, je nach Seite, mit erheblichem Aufwand. 21
Antworten Top
#13
Vielen Dank für die Rückmeldungen, ich habe die Antworten nicht überlesen, sondern nur falsch verstanden.
Das es PQ nicht geht habe ich gelesen aber es war hier ein Kommentar "j‌avascript:__doPostBack('gridNajave$_ctl14$_ctl1','')">2   das es damit gehen sollte
Da habe ich mir gedacht es gibt hier jemanden der das schon mal gelöst hat.

Ich werde einfach weiter recherieren, sollte ich eine Lösung finden - werde ich Sie hier im Forum posten.
Danke
Bettina
Antworten Top
#14
Hi Case,

ich habe mal etwas weiter gegoogelt. Denach ist es wohl doch so, dass mittels Selenium Steuerelemente einer Webseite gefüllt und dies danach aktualisert werden kann. Aber wie du schon schriebst, ist es, zumindest wenn man noch ungeübt in der Materie ist, mit viel Aufwand verbunden. für einen Google Mitarbeiter der für Webscrapping bezahlt wird, bräcushte dafür vermutlich nur wenige Minuten.

Als ich, der von HTML keine Ahnung hat, die Beitragsübersicht des ms-office-forum mit Power Query ausgelesen habe, da war ich auch ewig beschäftigt, bis das Ergebnis zufriedenstellend war.
Antworten Top
#15
Hallo zusammen,

ich störe die PQ Community ungern ... aaaaber  Wink Im Folgenden leider keine schöne Lösung, aber immerhin eine Lösung. Sie hat mich auch mehrere Stunden gekostet. Dauernd "predige" ich, den IE nicht mehr zu verwenden und doch verwende ich ihn hier wieder einmal. Warum? Weil er sich so einfach ansprechen lässt. Verdammt ... der Algorithmus müsste auch mit Selenium funktionieren, aber das Framework habe ich bisher nicht wirklich in der Tiefe erforscht. Die Seite funktioniert mit dem IE noch immer hervorragend. Jedenfalls unter Win10. Wie es unter Win11 ist weiß ich nicht. Weil, nutze ich bisher nicht.

Es geht nicht mit PQ, weil die Folgeseiten nach Seite 1 sich nur über POST abrufen lassen. Die Infos, was man will, lassen sich also nur über den HTTP Header mitgeben und die haben es echt in sich. Die erste Seite läuft über GET, weil sie sich sonst nicht einfach über die URL im Browser aufrufen ließe. Muss man beides nicht verstehen, weil ... ist für meine Lösung komplett irrelevant. Es sind 50 abzurufende Seiten, deshalb zählen wir von 1 bis 50 Wink  Mal im ernst, es wird "einfach nur" immer der nächste Link in der Pagination angeklickt und die auftauchende Tabelle kann ausgelesen werden. Die Pagination ist die Seiten-Nummerierung, die sich meist unter den aktuellen Suchtreffern befindet.

Auf der vorliegenden Seite sind das JS-Aufrufe. Das sieht kompliziert aus, aber ein Browser löst die Aufgabe automatisch. Sonst würde die Seite ja nicht funktionieren. Deshalb ist Browser Automatisierung auf jeden Fall das Mittel der Wahl. Wie gesagt, ich habe das so richtig Old School gelöst, mit dem IE *schäm*, aber es geht mit ziemlicher Sicherheit auch mit Selenium. Wenn nicht, müssen die Entwickler des Frameworks sich schämen Wink

Ich lasse das Makro nach jedem Seitenabruf ganz stumpf 2 Sekunden warten. Damit liegt die Laufzeit für 50 Tabellen um und bei 1 min und 40 Sekunden. Ist stumpf und ließe sich optimieren. Aber ehrich gesagt ... habe ich gerade echt keinen Bock mehr drauf und sofern das Makro bei der "Auftraggeberin" läuft, ist die Laufzeit mit Sicherheit weit unter "manuell".

500 Zeilen Tabelle mit:
Code:
Sub getwebpregledi()

  Const url As String = "https://webpregledi.luka-kp.si/prikazladje.aspx"
 
  Dim ie As Object
  Dim doc As Object
  Dim nodeTable As Object
  Dim nodeTr As Object
  Dim nodeTd As Object
  Dim nodesPagination As Object
  Dim currRow As Long
  Dim currCol As Long
  Dim pageRow As Long
  Dim pageCol As Long
  Dim pagination As Long
  Dim page As Long
  currRow = 2
  currCol = 1
 
  Set ie = CreateObject("InternetExplorer.Application")
  ie.Visible = True
  ie.navigate url
  Do Until ie.readyState = 4: DoEvents: Loop
  Set doc = ie.document
 
  For page = 1 To 50
    Application.Wait (Now + TimeSerial(0, 0, 2))
    Set nodeTable = doc.getElementByID("gridNajave")
    Set nodeTr = nodeTable.getElementsByTagName("tr")
   
    For pageRow = 1 To 10
      Set nodeTd = nodeTr(pageRow).getElementsByTagName("td")
      For pageCol = 0 To 9
        If currCol = 2 Then
          Cells(currRow, currCol).NumberFormat = "@"
          Cells(currRow, currCol) = Trim(nodeTd(pageCol).innerText)
          currCol = currCol + 1
        Else
          Cells(currRow, currCol) = Trim(nodeTd(pageCol).innerText)
          currCol = currCol + 1
        End If
      Next pageCol
      currRow = currRow + 1
      currCol = 1
    Next pageRow
   
    Set nodesPagination = nodeTr(11).getElementsByTagName("td")(0).ChildNodes
    For pagination = 0 To nodesPagination.Length
      If pagination Mod 2 = 0 Then
        If InStr(1, nodesPagination(pagination).outerHTML, "span") > 0 Then
          If page < 50 Then
            nodesPagination(pagination + 2).Click
          End If
          Exit For
        End If
      End If
    Next pagination
  Next page
 
  ie.Quit
End Sub


Viele Grüße,

Zwenn
[-] Folgende(r) 3 Nutzer sagen Danke an Zwenn für diesen Beitrag:
  • ws-53, , Ralf A
Antworten Top
#16
Moin Zwenn, 19 

meine "Möhre" ist schon etwas älter, aber den IE habe ich nicht mehr drauf (kein IE ist wohl Standard unter Win 11). Kann man nachinstallieren, da ich ihn aber nicht brauche werde ich das nicht tun. Den IE wird es in naher Zukunft wohl nicht mehr geben.

Habe dann mein altes Notebook aktiviert. Und dein Code läuft mit dem IE sauber durch. Danke, dass du dich hier eingeklingt hast. Hoffentlich liest Bettina das noch und hat noch Zugriff auf den IE.

PQ hat beim einlesen aus dem Web noch ein größeres Defizit. Da ich das nur selten brauche, habe ich mich damit auch nur am Rande beschäftigt.

Also nochmal Danke fürs erstellen und posten deines Makros.
Antworten Top
#17
Ich habe zwar auch Win11, aber bei mir ist der IE wohl noch vorhanden, da der Code bei mir ohne Probleme läuft.

Ich verstehe allerdings nicht, warum vor dem Aufruf der Seite 2 Sekunden gewartet wird. Wäre es nicht besser, nach dem Aufruf zu warten?
Antworten Top
#18
Moin ws-53, 19 

ich denke, dass der IE dann noch da ist, wenn man von Win10 auf Win11 updatet. Bei mir habe ich auf einem blanken Rechner Win11 aufgespielt - da war dann kein IE dabei. 21
Antworten Top
#19
Ich habe auch Win11. Allerdings habe ich folgende Verweise gesetzt:
Microsoft HTML Client Library (Objektbibliothek) und Microsoft Internet Controls. Damit lief @Zwenn 's Code bei mir problemlos durch. 

Unter diesem Link findet man eine halbwegs passable Erklärung.


Angehängte Dateien
.xlsm   Webdaten abrufen.xlsm (Größe: 60,93 KB / Downloads: 7)
Der sicherste Ansatz für einen Irrtum ist der Glaube, alles im Griff zu haben.
Nur, weil ich den Recorder bedienen kann, macht mich das noch lange nicht zum Musiker.

Ciao, Ralf

Antworten Top
#20
Hallo Ihr Drei Smile

Danke für Eure Postings zu meiner Lösung.

@Case
Zunächst danke für die Rückmeldung zu Win11. Ich hatte gelesen, das MS den IE nicht mehr ausliefern wird. Ich wusste aber nicht ab wann und in welchen Windows Versionen es so sein wird. Den IE nicht nachzuinstallieren ist auf jeden Fall die richtige Entscheidung. In der Regel kann man gar keine Seite mehr manuell darin öffnen. Jede manuelle Anfrage wird auf Edge umgeleitet. Über VBA geht es weiterhin. Ich nehme an, das ist den vielen Makros geschuldet, die immer noch den IE ansprechen. Auch wenn immer weniger Seiten in diesem veralteten Browser laufen, weil das enthaltene JavaScript nicht mehr unterstützt wird. Aber wie gesagt, die vorliegende Seite ist sehr einfach aufgebaut, auch wenn das "Blättern" über JS läuft.

@ws-53
Bei Dir läuft der IE noch unter Win11. Ist es so, dass Du von Win10 upgegradet hast und er deshalb erhalten blieb? Denn Case hatte ja geschrieben, bei einer Neuinstallation "from scratch" ist der IE in Win11 nicht mehr installiert. Wäre interessant diesen Umstand hier klären zu können.

Die 2 Sekunden standen erst am Ende und da gehören sie vom Verständnis her auch hin. Da gebe ich Dir recht. Bei meinen Testläufen fehlte aber immer genau eine Seite, es wurden also nur 49 ausgelesen. Ich dachte erst das sei ein Timingproblem und fing deshalb an, die Wartezeit woanders auszuprobieren. Am Ende war es aber eine falsch gesetzte Variable, weshalb eine Bedingung nicht so klappte, wie gewünscht. Schließlich ging es dann, als ich die richtige Variable gesetzt hatte und ich habe es so gelassen.

Rein sachlich ist es aber egal, ob direkt hinter dem Schleifenkopf 2 Sekunden gewartet wird oder am Ende des Schleifenkörpers. Also vor dem Sprung zurück zum Kopf. Wir sind es nur gewohnt es so zu lesen, wie Du es verstanden hast. Deshalb ... Mea culpa. Was wir so verlieren sind 2 Sekunden beim ersten Durchlauf. Was wir gewinnen sind 2 Sekunden beim Abschluss. Ist also wirklich egal.

Die 2 Sekunden an sich habe ich eingebaut, weil ein neuer Seitenabruf vom Webserver stattfindet. Der Server antwortet für diese Seite zwar sehr schnell, aber wenn man nicht wartet, kann es passieren, das noch keine neue Seite geladen wurde und man die gleichen Daten wiederholt ausliest, weil noch die alte Seite da steht. Die festen 2 Sekunden oder generell eine fixe Zeit ist nicht optimal. Das hatte ich ja geschrieben. Wenn man es richtig machen will, dann überwacht man ein HTML Element, dass vorhanden sein muss, um sicher zu gehen, dass die Seite so vorliegt, dass alles so ist, wie gewünscht. Im Vorliegenden Fall wäre das der Link auf die nächste Seite. Sobald kein Link mehr hinter der Seitenzahl liegt, ist sichergestellt, die neue Seite ist komplett geladen.

@Ralf A
Auch Dir vielen Dank für das Ausprobieren. Die Verweise innerhalb Excels sollten allerdings auch unter Win11 unnötig sein für meinen Code. Ich verwende in der Regel late binding. Dann funktioniert IntelliSense zwar nicht, aber bei Webscraping weiß ich meistens sehr genau was ich mache. Deshalb ist es für mich hier einfacher mit Variablen vom Datentyp Object zu arbeiten, als direkt mit HTMLDocumet, HTMLElement und wie sie auch immer heißen mögen.

Dein Link führt leider zu einem Fehler beim Versuch die Seite aufzurufen. Da steht am Anfang ein http://' zu viel drin. Wenn man den Teil löscht, dann geht es.

Wie ich sehe, hast Du meinen Code/ die Tabelle nochmal gepimpt^^ Sehr schön, dass freut mich Smile Vielen Dank auch für den Bezug auf die Quelle. Das sieht man leider eher selten. Ich schrebe die Quellen auch gerne in die Kommentare, nehme mich aber nicht davon aus, das auch mal zu vergessen.

Tja Jungs, Bettina scheint nicht noch einmal in den Thread geschaut zu haben. Schade für sie. So bleibt es aber immerhin eine Art von Austausch und Fachsimpeln unter uns.

Viele Grüße,

Zwenn
[-] Folgende(r) 2 Nutzer sagen Danke an Zwenn für diesen Beitrag:
  • ws-53,
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste