Seite 1 von 1

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

Verfasst: Montag 30. November 2020, 18:27
von philsc
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?

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

Verfasst: Montag 30. November 2020, 18:57
von nezzcarth
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.

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

Verfasst: Montag 30. November 2020, 20:41
von philsc
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.

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

Verfasst: Montag 30. November 2020, 20:48
von noisefloor
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

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

Verfasst: Montag 30. November 2020, 20:51
von philsc
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.

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

Verfasst: Montag 30. November 2020, 21:01
von __deets__
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.

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

Verfasst: Montag 30. November 2020, 21:24
von Sirius3
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.

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

Verfasst: Montag 30. November 2020, 21:46
von philsc
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. :)

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

Verfasst: Dienstag 1. Dezember 2020, 10:24
von philsc
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.