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?
Informationen von URL extrahieren, die nicht im Quellcode zu finden sind
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.
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.
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.
- noisefloor
- User
- Beiträge: 4194
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
Gruß, noisefloor
Hat nezzcarth doch schon gesagt: über einen Headless Browser. Relativ populär ist Selenium, dafür gibt es auch eine Python-Anbindung.Ich wäre dankbar, wenn mir jemand sagen könnte, wie ich den JavaScript Inhalt in Python reinbekomme.
Gruß, noisefloor
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.
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.
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.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.

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:
Wie gesagt am PC funktioniert das einwandfrei, am Laptop kriege ich diese Fehlermeldung:
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.
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()
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)
Habe es auch schon mit find element by class probiert, geht genauso wenig.