CodeGym /Kurse /Python SELF DE /Arbeiten mit dynamischen Elementen auf einer Webseite

Arbeiten mit dynamischen Elementen auf einer Webseite

Python SELF DE
Level 36 , Lektion 3
Verfügbar

1. Verständnis von dynamischen Elementen

Lass uns mit einem kleinen Exkurs in die Natur dynamischer Inhalte beginnen. Stell dir vor, du bist auf einer Website, und sobald du die Seite nach unten scrollst, erscheinen mehr Daten, wie ein fliegender Teppich, der sich ständig erweitert, damit du darauf fliegen kannst. Das nennt man "Lazy Loading" — eine clevere Technik, die Ressourcen spart, indem Inhalte erst bei Bedarf geladen werden. Sich in solchen Fällen auf statisches HTML zu verlassen, ist wie zu hoffen, dass deine Katze dir morgens Kaffee bringt.

Was sind dynamische Elemente?

Dynamische Elemente sind diejenigen Teile einer Webseite, die sich ändern, ohne dass die gesamte Seite aktualisiert werden muss. Sie können durch AJAX-Anfragen geladen oder mit JavaScript in die Seite eingefügt werden. Es ist wichtig, einige Strategien für den Umgang mit solchen Elementen zu beherrschen, damit deine Anwendung genauso dynamisch ist wie die Inhalte selbst.

2. Interaktionsstrategien

Lass uns zur praktischen Magie übergehen. Um dynamische Elemente zu bearbeiten, brauchen wir Werkzeuge, die verstehen: "Das Leben ist Bewegung, und ich bin bereit dafür." In unserem magischen Arsenal gibt es Selenium, da es die Interaktion mit dem Browser fast wie ein Mensch ermöglicht.

Arbeiten mit AJAX-Anfragen

AJAX ist eine Technologie, die es ermöglicht, einen Teil der Webseite zu aktualisieren, ohne die gesamte Seite zu laden. Das ist praktisch für Nutzer, erschwert jedoch ein wenig das Leben von Scraping-Entwicklern. Aber wir haben eine Geheimwaffe — WebDriverWait und expected_conditions von Selenium.

Python

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# Driver konfigurieren
driver = webdriver.Chrome()
driver.get("https://example-dynamic-site.com")

# Warten auf das Erscheinen des Elements
try:
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "dynamic_element_id"))
    )
    print(element.text)
finally:
    driver.quit()

Verwendung von Warte-Methoden

Beim Arbeiten mit dynamischen Elementen ist es wichtig, dem Browser Zeit zu geben, um den gewünschten Zustand zu erreichen. Warte-Methoden wie WebDriverWait in Kombination mit expected_conditions ermöglichen es uns, reibungslos auf das Laden aller benötigten Elemente zu warten. Das ist wie ein Besuch im Fitnessstudio – es braucht Zeit, aber das Ergebnis lohnt sich.

Beispiele:

  • presence_of_element_located — wartet, bis ein Element im DOM erscheint.
  • visibility_of_element_located — wartet, bis ein Element sichtbar wird.
  • element_to_be_clickable — wartet, bis ein Element anklickbar wird.

So kannst du beispielsweise auf die Klickbarkeit eines Buttons warten:

Python

button = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.XPATH, "//button[@id='submit']"))
)
button.click()

Seiten-Scrolling

Wenn dein Inhalt beim Scrollen geladen wird, benötigst du die Kunst des "Scrollings". Selenium ermöglicht es, JavaScript für das Scrollen zu verwenden, was beim Laden neuer Daten hilft.

Python

# Scrollen bis zum Ende der Seite
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

Versuch, das Scrollen in einer Schleife zu implementieren, um den gesamten Inhalt zu laden:

Python

SCROLL_PAUSE_TIME = 2
driver.get("https://example.com/dynamic-content")

last_height = driver.execute_script("return document.body.scrollHeight")

while True:
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

    # Warten, damit die Seite Inhalte lädt
    WebDriverWait(driver, SCROLL_PAUSE_TIME)

    new_height = driver.execute_script("return document.body.scrollHeight")
    if new_height == last_height:
        break
    last_height = new_height

3. Praktische Beispiele für die Interaktion

Jetzt, wo wir gelernt haben, zu warten und zu beobachten, ist es an der Zeit, diese Fähigkeiten in der Praxis anzuwenden und alle dynamischen Daten einzufangen.

Angenommen, wir haben eine Seite mit Produkten, die beim Scrollen nach unten geladen werden. Wir müssen den Namen und den Preis jedes Produkts extrahieren:

Python

products = []

while True:
    # Scrollen nach unten
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

    # Auf das Laden neuer Elemente warten
    WebDriverWait(driver, SCROLL_PAUSE_TIME)

    # Daten der Produkte extrahieren
    items = driver.find_elements(By.CLASS_NAME, "product-item")
    for item in items:
        name = item.find_element(By.CLASS_NAME, 'product-name').text
        price = item.find_element(By.CLASS_NAME, 'product-price').text
        products.append({'name': name, 'price': price})

    # Überprüfen, ob etwas Neues geladen wurde
    # (Naive Methode: Wenn die Liste items sich nicht vergrößert hat, beenden wir)
    if len(products) == last_known_count:
        break
    last_known_count = len(products)

Wenn dynamische Elemente sich nicht so schnell laden, wie wir es uns wünschen, brauchen wir Geduld und Geschick. WebDriverWait mit seinem Arsenal an Bedingungen, das Scrollen der Seite und JavaScript-Injektionen sind unser Schlüssel zur Eroberung der dynamischen Inhalte. Wie der weise Jedi sagte: "Geduld, mein junger Padawan." In unserem Fall bedeutet Geduld erfolgreiches Scraping aller Daten.

Beenden wir die Sitzung genauso wie nach einem erfolgreichen Arbeitstag – ordentlich.

Python

driver.quit()

Vergiss nicht: Am Ende ist es wichtig, sicherzustellen, dass dein Code korrekt, fehlerfrei und stabil läuft. Nur so kannst du mit Sicherheit sagen: "Mission erfüllt." Viel Erfolg bei deinem Abenteuer in der Welt der dynamischen Daten!

Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION