Reddit ist eine Goldgrube an wertvollen Daten für Unternehmen, Forscher und Entwickler, die Erkenntnisse sammeln und KI-Modelle trainieren möchten. Doch im Jahr 2023 machte Reddit den Plänen vieler Menschen einen Strich durch die Rechnung, indem es erhebliche Gebühren für den API-Zugriff einführte. Glücklicherweise bietet Web Scraping eine effektive Alternative, die kostengünstiger und flexibler ist. In dieser ausführlichen Anleitung erklären wir Ihnen genau, wie Sie mit Python und Selenium Daten aus Reddit extrahieren.
Warum Reddit im Jahr 2024 kratzen?
Im April 2023 kündigte Reddit an, hohe Gebühren für den API-Zugriff zu erheben – 0,24 US-Dollar pro 1000 Aufrufe. Diese Änderung machte die API für die meisten Anwendungsfälle sofort unerschwinglich. Viele Apps wie Apollo, die auf die API angewiesen waren, mussten heruntergefahren werden.
Aber die riesigen Mengen nützlicher Daten auf Reddit sind nicht plötzlich verschwunden oder haben an Wert verloren. Für Business Intelligence, wissenschaftliche Forschung, das Training großer Sprachmodelle und mehr benötigen die Menschen immer noch Zugriff darauf. Web Scraping ist heute die praktikabelste und attraktivste Methode, um diese Daten in großem Maßstab zu erhalten.
Hier sind einige der wichtigsten Vorteile des Scrapings von Reddit im Vergleich zur Verwendung der offiziellen API:
Kosteneinsparungen – Durch Scraping können Sie Reddit-Daten sammeln, ohne die exorbitanten API-Gebühren zu zahlen. Die einzigen Kosten fallen für Ihre eigenen Rechenressourcen an.
Erhöhte Flexibilität – Mit Scraping können Sie genau auf die Daten zugreifen, die Sie benötigen, und sind nicht durch die Einschränkungen der API eingeschränkt. Passen Sie Ihren Schaber individuell an, um die gewünschten Felder zu ziehen.
Zugriff auf mehr Daten – APIs schränken häufig den Umfang der verfügbaren Daten ein. Beim Scraping können Sie auf alle öffentlichen Daten auf der Website zugreifen, einschließlich Informationen, die nicht über offizielle Kanäle bereitgestellt werden.
In der Post-API-Welt des Jahres 2024 ist Web Scraping also die kluge Wahl, um Daten von Reddit zu sammeln. Lassen Sie uns in die technischen Details eintauchen, wie man es mit Python macht!
Tools, die Sie zum Scrapen von Reddit benötigen
Um diesem Tutorial folgen zu können, stellen Sie sicher, dass Sie über Folgendes verfügen:
- Python 3.7+ installiert
- Eine Python-IDE (PyCharm, VS Code usw.)
- Chrome-Webbrowser
- ChromeDriver für Selenium
Wir werden die Python-Selenium-Bibliothek verwenden, um den Chrome-Browser zu automatisieren und Daten aus Reddit zu extrahieren. Selenium ist ideal, da es die dynamischen JavaScript-Inhalte rendern kann, die auf Reddit-Seiten üblich sind.
Sie möchten außerdem eine virtuelle Umgebung einrichten, um die Abhängigkeiten für Ihr Reddit-Scraping-Projekt zu verwalten. Führen Sie dazu Folgendes aus:
python -m venv env
source env/bin/activateAnschließend installieren Sie die notwendigen Python-Pakete:
pip install selenium webdriver-managerGroßartig, Sie sind bereit! Beginnen wir mit dem Aufbau des Reddit-Scraper.
Schritt-für-Schritt-Anleitung zum Reddit Scraping
Als Beispiel extrahieren wir Daten aus dem Subreddit r/technology. Sie können diesen Code jedoch problemlos anpassen, um Beiträge und Informationen aus jedem öffentlichen Subreddit abzurufen.
Schritt 1 – Selenium einrichten
Importieren Sie zunächst die erforderlichen Selenium-Module und konfigurieren Sie Chrome für die Ausführung im Headless-Modus. Dadurch wird die Browser-Benutzeroberfläche ausgeblendet, was Ressourcen spart.
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options
options = Options()
options.headless = True
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()),
options=options)Geben Sie die URL des Subreddits an, das Sie scrapen möchten. In diesem Fall greifen wir auf die Top-Beiträge der letzten Woche zum Thema r/technology zurück.
url = "https://www.reddit.com/r/technology/top/?t=week"
driver.get(url)Schritt 3 – Scrapen Sie die Subreddit-Metadaten
Oben auf der Subreddit-Seite finden sich nützliche Metadaten. Lassen Sie uns den Namen, die Beschreibung, das Erstellungsdatum und die Anzahl der Mitglieder durchsuchen.
subreddit = {}
subreddit[‘name‘] = driver.find_element(By.TAG_NAME, ‘h1‘).text
subreddit[‘description‘] = driver.find_element(By.XPATH,
"//div[@data-testid=‘DescriptionComment‘]").text
subreddit[‘created‘] = driver.find_element(By.XPATH,
"//span[contains(text(), ‘Created‘)]/following-sibling::span").text
subreddit[‘members‘] = driver.find_element(By.XPATH,
"//div[@id=‘MembershipButton‘]//span[@class=‘_vaFo96phV6L5Hltvwcox‘]").text Schritt 4 – Scrapen Sie die Post-Daten
Als nächstes sammeln wir Daten zu jedem einzelnen Beitrag im Subreddit. Wir erhalten den Titel, den Autor, die Anzahl der positiven Stimmen, die Anzahl der Kommentare und die Ziel-URL für die Top-Beiträge.
Überprüfen Sie den HTML-Code, um die Elemente zu finden, die diese Daten enthalten. Reddit macht es schwierig, indem es zufällig generierte CSS-Klassen verwendet. Aber wir können Elemente mithilfe semantischer Attribute wie zuverlässig auswählendata-testid.
posts = []
post_elems = driver.find_elements(By.CSS_SELECTOR,
‘[data-testid="post-container"]‘)
for post in post_elems:
post_data = {}
post_data[‘title‘] = post.find_element(By.TAG_NAME, ‘h3‘).text
post_data[‘author‘] = post.find_element(By.CSS_SELECTOR,
‘[data-testid="post_author_link"]‘).text
post_data[‘upvotes‘] = post.find_element(By.XPATH,
"//div[@data-click-id=‘upvote‘]/following-sibling::div").text
post_data[‘comments‘] = post.find_element(By.XPATH,
"//a[@data-click-id=‘comments‘]/span").text
post_data[‘url‘] = post.find_element(By.CSS_SELECTOR,
‘[data-testid="outbound-link"]‘).get_attribute(‘href‘)
posts.append(post_data)Fügen Sie diese Beitragsdaten zum Subreddit-Wörterbuch hinzu:
subreddit[‘posts‘] = postsSchritt 5 – Ausgabe der Scraped-Daten
Speichern Sie abschließend die gescrapten Subreddit-Daten in einer JSON-Datei, um sie einfach in anderen Anwendungen verwenden zu können. Drucken Sie den JSON-Code hübsch aus, um ihn für Menschen lesbarer zu machen.
import json
with open(‘subreddit_data.json‘, ‘w‘) as f:
json.dump(subreddit, f, indent=4)Alles zusammenfügen
Hier ist das vollständige Python-Skript zum Scrapen von Daten aus einem Reddit-Subreddit:
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
import json
options = Options()
options.headless = True
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()),
options=options)
url = "https://www.reddit.com/r/technology/top/?t=week"
driver.get(url)
subreddit = {}
subreddit[‘name‘] = driver.find_element(By.TAG_NAME, ‘h1‘).text
subreddit[‘description‘] = driver.find_element(By.XPATH, "//div[@data-testid=‘DescriptionComment‘]").text
subreddit[‘created‘] = driver.find_element(By.XPATH, "//span[contains(text(), ‘Created‘)]/following-sibling::span").text
subreddit[‘members‘] = driver.find_element(By.XPATH, "//div[@id=‘MembershipButton‘]//span[@class=‘_vaFo96phV6L5Hltvwcox‘]").text
posts = []
post_elems = driver.find_elements(By.CSS_SELECTOR, ‘[data-testid="post-container"]‘)
for post in post_elems:
post_data = {}
post_data[‘title‘] = post.find_element(By.TAG_NAME, ‘h3‘).text
post_data[‘author‘] = post.find_element(By.CSS_SELECTOR, ‘[data-testid="post_author_link"]‘).text
post_data[‘upvotes‘] = post.find_element(By.XPATH, "//div[@data-click-id=‘upvote‘]/following-sibling::div").text
post_data[‘comments‘] = post.find_element(By.XPATH, "//a[@data-click-id=‘comments‘]/span").text
post_data[‘url‘] = post.find_element(By.CSS_SELECTOR, ‘[data-testid="outbound-link"]‘).get_attribute(‘href‘)
posts.append(post_data)
subreddit[‘posts‘] = posts
with open(‘subreddit_data.json‘, ‘w‘) as f:
json.dump(subreddit, f, indent=4)
driver.quit()Führen Sie dieses Skript aus und Sie erhalten eine schön formatierte Dateisubreddit_data.jsonDatei mit allen gescrapten Reddit-Daten. Jetzt können Sie die Daten nach Ihren Wünschen analysieren!
Fortgeschrittene Techniken zum Scrapen von Reddit im großen Maßstab
Das obige Basisskript eignet sich gut zum Scrapen eines einzelnen Subreddits. Wenn Sie jedoch Reddit-Daten in größerem Umfang sammeln müssen, können einige Herausforderungen auftreten:
Ratenbegrenzung und IP-Verbote – Reddit drosselt oder blockiert Ihre IP, wenn Sie zu schnell zu viele Anfragen stellen. Dies kann dazu führen, dass das Schleifen zum Erliegen kommt.
CAPTCHAs und andere Anti-Bot-Maßnahmen – Reddit setzt verschiedene Abwehrmaßnahmen ein, um Bots und Scraper zu stoppen. Möglicherweise werden Ihnen CAPTCHAs angezeigt, die ein weiteres Scraping verhindern.
Langsame Schabegeschwindigkeiten – Selen ist zuverlässig, aber im Vergleich zu anderen Schabemethoden relativ langsam. Das Scrapen großer Subreddits kann zeitaufwändig sein.
Um Reddit-Daten in großem Maßstab zu extrahieren, müssen Sie diese Probleme angehen. Hier einige Tipps:
- Verwenden Sie rotierende Proxys, um Ratenbegrenzungen und -verbote zu vermeiden. Mit Proxys können Sie Anfragen von vielen verschiedenen IP-Adressen stellen. Durch die Automatisierung der Proxy-Rotation können Sie weiter scrapen, ohne auf Hindernisse zu stoßen.
Suchen Sie nach schnellen, sicheren und ethisch einwandfreien Proxys von seriösen Anbietern. Basierend auf Rezensionen und Benchmark-Tests, die ich durchgeführt habe, sind hier einige der wichtigsten Proxy-Dienste, die Sie in Betracht ziehen sollten:
- Helle Daten
- IPRoyal
- Proxy-Verkäufer
- SOAX
- Smartproxy
- Proxy-günstig
- HydraProxy
Behandeln Sie CAPTCHAs automatisch mit einem Dienst wie 2Captcha oder Anticaptcha. Diese kostengünstigen Dienste arbeiten über eine API, um CAPTCHAs für Sie zu lösen, damit Sie mit dem Scraping fortfahren können.
Optimieren Sie Ihre Schabergeschwindigkeit und Effizienz, indem Sie mehrere Schaber parallel betreiben. Sie können Ihren Reddit-Scraper auf einer Plattform wie Docker Swarm oder Kubernetes bereitstellen, um viele Instanzen gleichzeitig auszuführen und Daten schneller zu erfassen.
Alternativ können Sie ein speziell entwickeltes Scraping-Tool wie den Scraping Browser von Bright Data verwenden. Es verwaltet automatisch CAPTCHAs und Anti-Scraping-Maßnahmen für Sie und ermöglicht Ihnen gleichzeitig ein schnelleres Scrapen als Selenium.
Zusammenfassung
Web-Scraping ist heute die bevorzugte Methode zum Sammeln von Reddit-Daten, da die API immer teurer wird. Mit dem in diesem Handbuch behandelten Python-Skript und den Techniken sind Sie bestens gerüstet, um große Mengen wertvoller Daten zuverlässig und effizient aus Reddit zu extrahieren.
Denken Sie daran, beim Scraping immer respektvoll zu sein und die Reddit-Server nicht mit zu vielen Anfragen gleichzeitig zu überlasten. Verwenden Sie Proxys und passen Sie Ihre Scraping-Rate an, um ein guter Bürger zu sein.
Wenn Sie den kniffligen Prozess des Selbst-Scrapings von Reddit überspringen möchten, können Sie auch fertige Reddit-Datensätze aus verschiedenen Quellen online erwerben. Aber wenn Sie Ihren eigenen Scraper erstellen, erhalten Sie maximale Flexibilität und die aktuellsten Daten.
Jetzt haben Sie alles, was Sie brauchen, um die Fülle an Daten auf Reddit für Ihre Geschäfts-, Forschungs- oder Programmierprojekte zu nutzen. Worauf warten Sie noch? Beginnen Sie noch heute mit dem Scrapen von Reddit mit Python!















