1. Dynamischer Inhalt und JavaScript
Wenn du bereits die Grundlagen des Web-Scrapings mithilfe von Bibliotheken wie BeautifulSoup und requests beherrschst, ist es an der Zeit, tiefer in die spannenderen Aspekte dieses Themas einzutauchen. Heute sprechen wir darüber, wie du mit Inhalten arbeiten kannst, die dynamisch erst beim Scrollen der Seite geladen werden. Dein Browser ist vielleicht nicht der einzige Fan von endlosen Feeds, nun kannst du auch deine Skripte darauf trainieren! 🤖
Das Internet ist voller dynamisch geladener Seiten, bei denen der Inhalt erst nach Interaktionen mit JavaScript erscheint. JavaScript „macht die Magie“ auf der Clientseite. Das kann sowohl ein Segen als auch ein Fluch für Web-Scraper sein. Einerseits werden solche Seiten interaktiver und benutzerfreundlicher, andererseits wird das Scraping solcher Seiten schwieriger, da die Bibliothek requests kein JavaScript versteht.
2. Die Bibliothek requests_html
Glücklicherweise gibt es requests_html
— eine Bibliothek, die die Stärke von requests und die
Browser-Rendering-Möglichkeiten von Pyppeteer vereint.
Diese Bibliothek ermöglicht es dir, Seiten mit dynamischem
Inhalt zu laden und zu rendern, JavaScript auszuführen und
sogar Seiten zu scrollen.
Installation von requests_html
Um loszulegen, musst du die Bibliothek installieren. Wenn du das noch nicht getan hast, führe folgenden Befehl aus:
pip install requests-html
Arbeiten mit requests_html
Nach der Installation schauen wir uns an, wie man
requests_html
verwenden kann, um dynamischen
Inhalt zu laden und zu bearbeiten.
Beispiel: Laden und Rendern einer Seite
Fangen wir mit einem einfachen Fall an: Laden einer Seite, Ausführen von JavaScript und Extrahieren von Daten. Schauen wir uns ein Beispiel an, bei dem wir eine Seite laden und den Text eines Elements erhalten, das erst nach der JavaScript-Ausführung erscheint.
from requests_html import HTMLSession
# Erstellen der Session
session = HTMLSession()
# Seite laden
response = session.get('https://example.com/dynamic-page')
# JavaScript ausführen, um die Seite zu rendern
response.html.render()
# Text eines Elements extrahieren, das nach dem Rendern erscheint
content = response.html.find('#dynamic-content', first=True)
print(content.text)
In diesem Beispiel verwenden wir die Methode render()
,
um requests_html
zu ermöglichen, JavaScript auf der
Seite auszuführen und Inhalte zu rendern, die bei
Standard-Ladevorgängen verborgen bleiben könnten.
3. Automatisches Scrollen von Seiten
Manchmal wird der dynamische Inhalt nicht sofort geladen,
sondern erscheint erst beim Scrollen der Seite.
requests_html
kann hier helfen, indem es dir
ermöglicht, das Scrollen der Seite zu simulieren und noch
mehr Daten zu laden.
Beispiel für automatisches Scrollen
Angenommen, du hast eine Seite mit einem endlosen Newsfeed, und du möchtest so viele Elemente wie möglich extrahieren. So könnte das aussehen:
from requests_html import HTMLSession
session = HTMLSession()
response = session.get('https://example.com/infinite-scroll')
# Seite rendern und scrollen
response.html.render(scrolldown=5, sleep=1)
# Alle News-Elemente extrahieren
news_items = response.html.find('.news-item')
for news_item in news_items:
print(news_item.text)
Hier wird die Methode render()
mit den
Parametern scrolldown
und sleep
ergänzt, die angeben, wie oft die Seite nach unten
gescrollt wird und wie lange zwischen den Scrolls gewartet
wird.
4. Praktische Anwendung
Warum sollte man sich überhaupt mit solch einem Aufwand wie automatischem Scrollen beschäftigen? 🤔
- Marktforschung: Viele Unternehmen nutzen solche Seiten, um kontinuierlich Daten anzuzeigen, die für die Analyse von Trends und Verbraucherverhalten nützlich sein können.
-
Soziale Netzwerke überwachen: Viele
Social-Media-Plattformen nutzen endlose Feeds, was
requests_html
zu einem nützlichen Werkzeug für die Überwachung und Sammlung von Daten aus solchen Quellen macht. - Nachrichten und Updates: Das Extrahieren von Schlagzeilen und Artikeln von News-Websites mit endlosen Feeds ermöglicht den Erhalt aktueller Informationen zur Analyse.
5. Typische Fehler und deren Lösungen
Beim Arbeiten mit dynamischen Seiten und requests_html können oft Fehler auftreten. Schauen wir uns einige häufige an:
Rendering-Probleme
Manchmal kann die Methode render()
nicht
erfolgreich abgeschlossen werden, insbesondere wenn die
Seite zu groß oder zu komplex ist. In solchen Fällen hilft
es, die Renderzeit mit dem Parameter timeout
zu erhöhen, oder die Anzahl der Scrolls zu verringern.
response.html.render(timeout=30)
Störende JavaScript-Ausführung
Es kann Situationen geben, in denen JavaScript auf der
Seite das Skript blockiert oder Probleme verursacht.
Du kannst versuchen, den Parameter wait
zu verwenden, um auf das Erscheinen der benötigten
Elemente zu warten.
response.html.render(wait=2)
Bildschirmauflösung und Gerätetyp
Einige Seiten können Inhalte abhängig von der Bildschirmauflösung oder dem Gerätetyp bereitstellen. Prüfe, mit welchem User-Agent die Anfrage gestellt und der Inhalt gerendert wird.
response.session.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, wie Gecko) Chrome/58.0.3029.110 Safari/537.3'
6. Weitere Lektüre
requests_html
ist ein mächtiges Werkzeug,
aber um es vollständig zu nutzen und typische Fehler zu
vermeiden, lies die offizielle Dokumentation.
Sie hilft dir dabei, besser zu verstehen, wie du Scrolls
steuern und komplexe Seiten erfolgreich rendern kannst.
An diesem Punkt bist du mit allem ausgestattet, was du brauchst, um keine Angst mehr vor dynamischem Inhalt und endlosen Feeds zu haben. Sei vorsichtig und denke daran: dein Skript sollte ein weißer Hacker sein, der Menschen hilft, ihre Aufgaben zu automatisieren – und kein Bösewicht! 😇
GO TO FULL VERSION