Webscraping - Requests "nachbauen" bzw. ermitteln, aus welcher Quelle/welchem Request Daten auf einer Webseite stammen?

MrTony

Lieutenant
Registriert
Feb. 2015
Beiträge
563
Hi zusammen,

ich hab vor ner ganzen Weile mit Python und Webscraping angefangen, weil ich im Syllabus meiner Hochschule ne Menge Daten hatte, die man nicht einfach runterladen konnte, die ich aber immer wieder gebraucht habe. Also hab ich angefangen die mit Python, Selenium/Webdriver und/oder BS4 zu extrahieren.

Seit dem fand ich das Thema sehr nützlich und hab immer wieder Daten mit Python ausgelesen und ausgewertet, oft mit Panda.

Ich wollte jetzt gern von Selenium/Webdriver umsteigen auf Scrapy, einfach weil Selenium doch gern an seine Grenzen stößt. Letztlich ist das ja nicht zum Webscraping gemacht, sondern primär um den Browser zu automatisieren und Webseiten zu testen.


Das größte Problem, was ich aktuell immer wieder habe, ist dass viele Inhalte ja dynamisch geladen werden.
Dazu gib es bei Scrapy auch ein ziemlich umfangreiches Doc:
https://docs.scrapy.org/en/latest/topics/dynamic-content.html

Letztlich ist die Best Practice Lösung aber die Datenquelle zu finden und den entsprechenden Request nachzubilden. Alternativ könnte man auch Spash als Javascript Renderer dazwischen schalten, aber ich hab gestern mal in die Docs von Slpash reingelesen und das ist für sich schon wieder ein Fass ohne Boden....

Ich würde also gern erst mal schauen, ob ich die Requests rausfinden und nachbauen kann. Ich hab dazu schon zahlreiche Tutorials gelesen und auf Youtube abgeschaut heute, aber wenn ich dass dann mal auf einer entsrechenden Webseite probieren will, finde ich ums Verrecken nicht den entsprechenden Request.

Ich war z.B. einfach mal auf ebay, hab nach Ford Mustang gesucht und geschaut was es so für Requests gibt.
Habe aber ewig nichts gefunden. Ich hab also aus Interesse mal JavaScript gesperrt und die Inhalte wurden dennoch geladen.
Ich würde also mal vermuten Ebay lädt also die Daten nicht über XHR/JSON nach, sondern liefert anscheinend fertig gebaute HTML Seiten aus?

Ich war dann mal auf de Seite hier:
https://www.thegrandwhiskyauction.com/past-auctions/q-yamazaki
(Mein Dad wird dieses Jahr 60 und ich such noch was schönes für ihn ;) )
Mit ausgeschaltetem Javascript werden keine Inhalte geladen - schon mal gut.
Habe dann JavaScript aktiviert, die Seite geladen (Geschwindigkeit gedrosselt) und im Netzwerktab vom Browser genau geschaut, ab wann die relevanten Daten (Also Preis etc.) sichtbar werden. Habe dann pausiert und alle möglichen Requests angeschaut

Screenshot from 2021-02-28 17-30-20.png

Da sind eine Menge Get Requests. Ich habe entsprechend den Response-Payload angesehen, aber da war nirgends etwas, was die gesuchten Daten enthalten hat.
Ich habe dann stupide mal auch die ganzen Dateien angesehen, die geladen wurden, evtl verstecken sich die Inhalte ja in einer JS Variablen, aber auch da war nix.

Ich hab das Spiel dann noch bei ein paar anderen Webseiten weiter gemacht, aber habe egtl fast nie wirklich den entsprechenden Request finden können.

Lediglich bei https://www.sothebys.com/en/search?query=macallan&tab=objects&p=2
habe ich im Netzwerk Tab unter XHR entsprechende Daten finden können, wie es in den Tutorials immer hieß.

Vielleicht kann mir jemand mal ein paar Tipps geben, wie man besser herausfinden kann, aus welchem Request bestimmte Daten, die im Browser angezeigt werden, letztlich stammen?

VG
Tony
 
Bei Ebay wird der Suchterm über die URL übergeben:
https://www.ebay.de/sch/i.html?_nkw=test
Es ist eine Form, wie du im HTML Quellcode von Ebay erkennen kannst.
Der Request ist der erste, nachdem du auf den Finden Button geklickt hast.
Das erklärt auch, warum du kein Javascript brauchst.
 
  • Gefällt mir
Reaktionen: MrTony
Je nachdem wie gut du dich mit JS Frontend-Frameworks auskennst, quasi als kleiner Crashkurs.

Normales Scrapping mit SSR (Server Side Rendering, also die PHPs & Co in der Welt) kennst du ja schon, und normale SPAs wo das HTML nur die Schale für Javascript & Ajax ist kennst du wohl auch (schimpft sich CSR, Client Side Rendering).

thegrandwhiskyauction nutzt Vue, fällt also eigentlich in die CSR Kategorie. Aber hier wird Vue zusammen mit SSR betrieben, quasi ein Hybrid. Dabei führt ein Node-Server das gesamte Javascript aus und sendet das fertige HTML an den Browser.
Das hat grade beim SEO Vorteile weil die meisten Crawler eben kein JS herunterladen und ausführen, was auch bedeutet der initiale Aufbau der Seite passiert bevor der Browser Megabytes an Javascript gelesen hat.

Normale Browser mit JS laden dann das JS und "rehydrieren" das HTML. Damit die API nicht vom Server und Frontend angesprochen wird gibt es all die Daten im Seitenquelltext (per STRG + U siehst du ja das die Daten per window.auction_data gesetzt werden). Browser liest das und bläht die Seite wie eine normale SPA auf.

thegrandwhiskyauction liegt wohl irgendwo dazwischen, Seite nutzt definitiv Vue aber Links auf der Seite laden trotzdem komplett neu. Heißt VueRouter wird nicht benutzt. Eventuell eine Schrittweise Migration was jQuery und den Template-Syntax (eg. im Quellcode [%% 0|multi_currency_symbol %%]) erklären würde.


Zu eBay, würde mich nicht wundern wenn das ein grösseres unterfangen ist.
Die sind nicht grade unbekannt dafür einiges zu tun um Bots auszusperren (auch wenns nicht immer erfolgreich ist). Kann durchaus sein das dein Scrapper komplett anderes HTML als dein Browser bekommt weil nach Useragent, Cookies, Browser-Features und was weiß ich getestet wird.
Mittlerweile portscannt Ebay jeden Besucher, wegen Betrugsversuchen und Bots versteht sich ;)
 
  • Gefällt mir
Reaktionen: MrTony
MrTony schrieb:
Wärst du so nett und würdest ein bisschen ausführen, wie du da fündig geworden bist?
ich habe in der Antwort des Hauptrequestes nach einer Artikelnummer der aufgelisteten Items gesucht.

Im Firefox einfach in den F12-Tools den Netzwerk-Tab öffnen. Da den ersten Request anklicken. Und dann den Antwortiunhalt (nicht als Vorschau sondern als Quelltext) anschauen und darin suchen.
 
  • Gefällt mir
Reaktionen: MrTony
Zurück
Oben