Informationen von URL extrahieren, die nicht im Quellcode zu finden sind

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
philsc
User
Beiträge: 5
Registriert: Montag 30. November 2020, 18:20

Hallo,

ich bin noch relativ neu in Python, jedoch habe ich schon einiges rumprobiert.
Bisher habe ich vor allem Informationen von Webseiten mit Beautifulsoup extrahiert, was auch super klappt.
Allerdings möchte ich nun die Startaufstellungen von Fußballspielen extrahieren, die nicht im Quellcode zu finden sind.

Ein Beispiel: https://www.sofascore.com/chelsea-tottenham/IN
Dort sieht man die 22 Spieler, welche in der Startaufstellung stehen. Im Quellcode findet man diese Spieler allerdings nicht.
Geht man mit Rechtsklick über die Spieler und klickt auf "Untersuchen", dann findet man die Informationen, die ich suche.
Allerdings möchte ich direkt mithilfe der angegeben URL auf diese Informationen zugreifen.

Geht sowas?
nezzcarth
User
Beiträge: 1764
Registriert: Samstag 16. April 2011, 12:47

Informationen, die nicht im Quelltext zu finden sind, werden in der Regel zur Laufzeit dynamisch per JavaScript nachgeladen. Es gibt mehrere Möglichkeiten, wie du an die Infos herankommen könntest (zum Beispiel rendern mit einem Headless Browser oder direktes Ansteuern der API, wenn diese es zulässt). Das geht dann aber über das relativ einsteigerfreundliche Scraping statischer Inhalt hinaus.
philsc
User
Beiträge: 5
Registriert: Montag 30. November 2020, 18:20

Ja sowas bräuchte ich. Das mit dem Headless Browser finde ich nicht so gut.
Im Prinzip möchte ich das, was ich bei Rechtsklick-->Untersuchen an Informationen angezeigt bekomme, in einer Variabel mit Python speichern.
Per Hand geht das ja relativ einfach mit Rechtsklick-->Untersuchen-->Copy Element. Wenn ich das dann im Notepad einfüge, dann sind dort alle Informationen zu finden, die ich brauche. Von da aus würde ich selber weiterkommen denke ich.
Allerdings möchte ich das nicht bei jeder URL händisch machen, sondern halt mit einem Python Script automatisch erledigen.
Ich wäre dankbar, wenn mir jemand sagen könnte, wie ich den JavaScript Inhalt in Python reinbekomme.
Benutzeravatar
noisefloor
User
Beiträge: 4194
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Ich wäre dankbar, wenn mir jemand sagen könnte, wie ich den JavaScript Inhalt in Python reinbekomme.
Hat nezzcarth doch schon gesagt: über einen Headless Browser. Relativ populär ist Selenium, dafür gibt es auch eine Python-Anbindung.

Gruß, noisefloor
philsc
User
Beiträge: 5
Registriert: Montag 30. November 2020, 18:20

Selenium habe ich schon benutzt, aber das ich dachte man könnte es direkt nur mit der URL scrapen, so wie bei HTML mit Beautifulsoup. Also ohne dass der Browser geöffnet werden muss meine ich.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dann musst du rausfinden, welche requests das JS macht, und versuchen, DIE zu machen. Muss aber nicht klappen, ggf sind die Daten zb per Nonce gegen solches auslesen geschützt. Dann wird es mühsam das nachzubauen.
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Die ganzen Daten kommen bequem per json: https://api.sofascore.com/api/v1/event/8896864/lineups
Die event-ID findet sich auf der Hauptseite in einem script-Tag mit der ID __NEXT_DATA__, auch json kodiert.
philsc
User
Beiträge: 5
Registriert: Montag 30. November 2020, 18:20

Sirius3 hat geschrieben: Montag 30. November 2020, 21:24 Die ganzen Daten kommen bequem per json: https://api.sofascore.com/api/v1/event/8896864/lineups
Die event-ID findet sich auf der Hauptseite in einem script-Tag mit der ID __NEXT_DATA__, auch json kodiert.
Danke, das hilft mir sehr. Ich werde mal schauen, wie weit ich damit komme. :)
philsc
User
Beiträge: 5
Registriert: Montag 30. November 2020, 18:20

Okay das geht leider nicht so, wie ich es mir dachte. Wenn ich mit der Methode von Sirius3 scrape, dann habe ich nach wenigen Minuten einen IP-Bann bei Sofascore.
Mit Selenium habe ich es aber auch hinbekommen, jedoch funktioniert das nur auf meinem Desktop PC, nicht mit meinem Laptop. Hier der Code:

Code: Alles auswählen

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

PATH = (r".\chromedriver.exe")

driver = webdriver.Chrome(PATH)

driver.get("https://www.sofascore.com/chelsea-tottenham/IN")
time.sleep(10)

home = driver.find_element_by_xpath("//*[@id=\"__next\"]/main/div/div[2]/div[2]/div[2]/div/div[2]/div/div[2]/div/div/div[1]/div[1]").text
away = driver.find_element_by_xpath("//*[@id=\"__next\"]/main/div/div[2]/div[2]/div[2]/div/div[2]/div/div[2]/div/div/div[2]/div[1]").text

print(home)
print(away)

driver.close()
Wie gesagt am PC funktioniert das einwandfrei, am Laptop kriege ich diese Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "d:\Python\seleniumtest.py", line 12, in <module>
    home = driver.find_element_by_xpath("//*[@id=\"__next\"]/main/div/div[2]/div[2]/div[2]/div/div[2]/div/div[2]/div/div/div[1]/div[1]").text
  File "C:\Users\user\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 394, in find_element_by_xpath
    return self.find_element(by=By.XPATH, value=xpath)
  File "C:\Users\user\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 976, in find_element
    return self.execute(Command.FIND_ELEMENT, {
  File "C:\Users\user\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "C:\Users\user\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//*[@id="__next"]/main/div/div[2]/div[2]/div[2]/div/div[2]/div/div[2]/div/div/div[1]/div[1]"}
  (Session info: chrome=86.0.4240.111)
Woran könnte das liegen? Öffnen tut er die Seite noch, findet aber scheinbar nicht den entsprechenden xpath. (nur am Laptop)
Habe es auch schon mit find element by class probiert, geht genauso wenig.
Antworten