Web-Scraping, Dynamic Content

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Geralonx
User
Beiträge: 10
Registriert: Dienstag 18. August 2020, 09:23

Hey Leute,
ich habe ein wenig nach einem neuen Prjoekt gesucht und während dieser Suche habe ich immer davon gelesen, dass man mit Python mal Web-Scraping machen sollte. Nachdem ich ein wenig nachgedacht hatte kam mir die Idee das mit etwas zu verbinden, was ich schon länger vor hatte. Mir ist bewusst, dass es für dieses Problem/Idee bereits ähnliche und fertige Lösungen gibt, aber für mich geht es hauptsächlich darum was neues zu lernen.

Kurzbeschreibung:
Ich möchte per Web-Scarping Steam Angebote auslesen und per Discord Bot an einen Server senden. Zusätzlich dazu sollen im Laufe der Zeit für den Discord-Bot weitere Befehle/Funktionen implementiert werden, um beispielsweise Angebote nach Preisspanne, Kategorie oder was auch immer zu filtern. Meine Ziele sind halt, mehr übers Web-Scraping zu lernen und über die Möglichkeiten eines eigenen Discord-Bots.

Angefangen habe ich mit dem Web-Scraping auf https://store.steampowered.com/search/?specials=1. Das Auslesen der statischen Daten, die beim ersten Aufrufen der Webseite geladen werden, stellt kein Problem da. Ich komme an alle Informationen und speicher mit die für mich relevanten Informationen ab. Das funktioniert (bis auf eine Sache, die ist aber erstmal nebensächlich)

Das Problem:
Der Punkt bei diesem Thema ist, dass die Inhalte der Seite dynamisch beim Scrollen durch die Seite erweitert werden. Bisher kenne ich bezüglich Webentwicklung nur die absoluten Grundlagen und kann höchstens HTML/CSS lesen. Bei Java/Javascript hört der ganze Spaß aber sofort auf.

Ansätze:
1. Ich habe bereits gesucht und Ideen/Ansätze gefunden, die mich aber nicht wirklich weiter bringen. Eine der Sachen ist folgendes: https://stackoverflow.com/questions/176 ... ith-python. Es wird gesagt, dass mittels dem 'ghost'-Modul, welches inzwischen schon völlig veraltet ist, die Javascripte per Python ausgeführt werden können. Gibt es dazu aktuelle Alternativen und würde man diesen Ansatz weiter verfolgen?

2. Ein anderer Ansatz den ich immer wieder lese ist, dass man mit Selenium arbeiten soll. Das würde ich gerne vermeiden, weil der Discord-Bot ja, falls ich das Projekt so weit durchziehe, auf einen Service wie bspw. Heroku gehosted werden soll. ich weiß nicht wie das bei solchen Services mit virtuellen Browsern aussieht und ob sowas unterstützt wird.

3. Ich habe gesehen, wenn ich per Browser im Dev-Modes mir die Inhalte auslese und ich die Javascripte der Seite blockiere, dass die Seite dann automatisch eine alternative zu dem dynamischen Content bietet und zwar, dass die Inhalte auf einzelnen Seiten gelistet sind, die dann statisch im HTML verlinkt sind. Kann man bei dem Zugriff auf eine Webseite per Python diesen Zustand erzwingen? Dann könnte ich relativ einfach durch die Seiten gehen und den statischen Inhalt lesen.

Meine Frage:
Wie geht man an das Problem des dynamischen Contents ran? Könnt ihr mir Module nennen mit denen sowas möglich ist? Was wäre eure Empfehlung für dieses Problem? Muss ich jetzt für dieses eine mal, wo ich einfach was neues probieren möchte, wirklich die Grundlagen von js lernen?

Ich hoffe ihr könnt mir ein paar Tipps und Anregungen geben, wie ich dieses Problem lösen könnte.

Grüße und schönen Abend zusammen.
AMD Ryzen 7 3700X
Gigabyte Nvidia Gefroce RTX 2070 Super Windforce OC
Gigabyte X570 Aorus Elite AMD
HyperX Savage DDR4-2400 2*8192MB

Win10 64 Bit (10.0.19041)
VSCode 1.48
Python 3.8.4 64-Bit
Tensorflow 2.2.0 (GPU)
CUDA 10.1
CUPTI 10.0
cuDNN v8.0.2

Stand: 18.08.2020
ElektroBerry
User
Beiträge: 31
Registriert: Samstag 16. Mai 2020, 18:52

Ich würde Selenium verwenden, wenn keine andere Möglichkeit erfolgreich ist und die Webseite wirklich Javascript benötigt.
Weiter Möglichkeiten wären z.b. die Mobile Webseite crawlen oder das Javascript genauer untersuchen.

Aber jetzt in deinem Fall, funktioniert die Webseite auch ohne Skripte.

Code: Alles auswählen

url = "https://store.steampowered.com/search/?specials=1"
r = requests.get(url)
doc = BeautifulSoup(r.text, "lxml")
next_url = doc.find("a", class_="pagebtn", text=">")["href"]
Geralonx
User
Beiträge: 10
Registriert: Dienstag 18. August 2020, 09:23

Danke für die fixe/konkrete Antwort. Hilft mir super weiter und zeigt mir nochmal, dass ich keine Ahnung vom Web-Design habe. Dieses Button-Element wurde mir bei dem normalen besuchen der Seite nicht angezeigt, sondern nur die Liste die beim Scrollen erweitert wurde. Dass dieses Element trotzdem da ist, daran habe ich nicht gedacht und deswegen auch nicht gesucht.
AMD Ryzen 7 3700X
Gigabyte Nvidia Gefroce RTX 2070 Super Windforce OC
Gigabyte X570 Aorus Elite AMD
HyperX Savage DDR4-2400 2*8192MB

Win10 64 Bit (10.0.19041)
VSCode 1.48
Python 3.8.4 64-Bit
Tensorflow 2.2.0 (GPU)
CUDA 10.1
CUPTI 10.0
cuDNN v8.0.2

Stand: 18.08.2020
Antworten