Zum Inhalt springen
Zurück zum Blog

JavaScript mit Scrapy: Daten zuerst, Darstellung nur bei Bedarf

Mihai MaximZuletzt aktualisiert am 11 min read
JavaScript mit Scrapy: Daten zuerst, Darstellung nur bei Bedarf
TL;DR: Die Verwendung von JavaScript mit Scrapy erfordert nicht immer einen Browser. Überprüfen Sie zunächst die Rohantwort, die Netzwerkanfragen und den Status der eingebetteten Seite; fügen Sie „scrapy-playwright“ nur dann hinzu, wenn die Zieldaten tatsächlich von der Ausführung im Browser abhängen, und steuern Sie dann Wartezeiten, Interaktionen, Bereinigung und Parallelität gezielt.

Die Verwendung von JavaScript mit Scrapy bedeutet, die Ausführung im Browser für Seiten hinzuzufügen, bei denen die benötigten Daten erst nach der Ausführung von clientseitigem Code erscheinen. Das praktische Ziel besteht nicht darin, jede Seite zu rendern, sondern den kostengünstigsten und zuverlässigsten Weg zu den Daten zu identifizieren: rohes HTML, eine JSON-Anfrage, ein eingebettetes JavaScript-Objekt oder – nur wenn nötig – ein vom Browser erstelltes DOM.

Diese Unterscheidung ist wichtig, da der Downloader von Scrapy die Antwort des Servers empfängt, während Chrome oder Firefox anschließend möglicherweise zusätzliche Anfragen stellen und das Dokument verändern. Eine React-, Vue- oder Angular-Seite kann daher in den DevTools vollständig erscheinen, obwohl response.text sie kaum mehr als eine Anwendungshülle enthält.

Dieser Leitfaden beginnt mit einer „Browser-Last“-Diagnose und entwickelt anschließend einen fokussierten Scrapy-Playwright-Workflow für die Anfragen, die tatsächlich ausgeführt werden müssen. Außerdem erfahren Sie, wie Sie bedingungsbasierte Wartezeiten einsetzen, Klicks und den Sitzungsstatus handhaben, Rendering-Optionen vergleichen und dynamische Spider im Produktivbetrieb stabil halten. Das Ergebnis ist ein Workflow, der Scrapys effiziente HTTP-Pipeline wo immer möglich beibehält, ohne so zu tun, als könne jede moderne Website allein anhand statischer Markups gescrapt werden.

Finden Sie die Datenquelle vor dem Rendern

Bevor Sie versuchen, JavaScript mit Scrapy auszuführen, prüfen Sie, was der Server bereits zurückgegeben hat. Die offizielle Scrapy-Anleitung zu dynamischen Inhalten empfiehlt, zunächst die zugrunde liegende Quelle zu lokalisieren. Verwenden Sie folgende Reihenfolge: Rohantwort, Netzwerkanfrage, eingebetteter Status, dann ein Headless-Browser.

Vergleichen Sie die Antwort von Scrapy mit dem gerenderten DOM

Speichern oder suchen response.text nach einem eindeutigen Wert, den Sie im Browser sehen können, wie beispielsweise eine Produkt-ID anstelle eines formatierten Preises. Vergleichen Sie diesen dann mit dem „Elements“-Panel der DevTools. Wenn der Wert nur im gerenderten DOM vorhanden ist, wurde er wahrscheinlich durch JavaScript eingefügt, was jedoch noch nicht beweist, dass ein Rendering erforderlich ist. Die Anwendung hat möglicherweise denselben Wert von einem zugänglichen Endpunkt abgerufen.

Ein umfassenderes Playbook zum Web-Scraping mit Scrapy ist hier eine nützliche interne Referenz, insbesondere für die Überprüfung von Antworten, Selektoren und die Fehlerbehebung bei Anfragen.

Die XHR- oder Fetch-Anfrage wiederholen

Öffne DevTools, wähle „Netzwerk“ aus, lade die Seite neu und filtere nach „Fetch/XHR“. Untersuche die in Frage kommenden Antworten, bis du die benötigten Felder findest. Notiere dir die URL, die HTTP-Methode, den Abfrage-String oder den Request-Body, relevante Header sowie alle mit der Sitzung verbundenen Cookies oder Tokens.

Reproduzieren Sie die kleinste gültige Anfrage in Scrapy, anstatt jeden Browser-Header zu kopieren:

def parse(self, response):
    yield scrapy.Request(
        "https://example.com/api/products?page=1",
        headers={"Accept": "application/json"},
        callback=self.parse_products,
    )

def parse_products(self, response):
    payload = response.json()
    for row in payload["results"]:
        yield {"id": row["id"], "name": row["name"]}

Auf diese Weise vermeiden Sie DOM-Timing, Browser-Speicherbelegung und Änderungen an visuellen Selektoren. Wenn der Endpunkt Paginierung, Cursor-Werte oder POST-Daten verwendet, übernehmen Sie diese Parameter direkt. Bei Authentifizierung sollten Sie den erforderlichen Cookie- oder Token-Fluss beibehalten, anstatt kurzlebige Anmeldedaten fest zu codieren.

Parsen von JSON und in Skripten eingebetteten Daten

Manchmal enthält der ursprüngliche HTML-Code bereits den Anwendungsstatus innerhalb eines <script> Element. Extrahieren Sie dieses Skript mit einem CSS- oder XPath-Selektor. Verwenden Sie json.loads() , wenn der Inhalt gültiges JSON ist; verwende chompjs , wenn es sich um JavaScript-Objekt-Syntax mit nicht in Anführungszeichen gesetzten Schlüsseln, nachgestellten Kommas oder ähnlichen Abweichungen handelt.

import chompjs

script = response.css("script[data-page-state]::text").get()
state = chompjs.parse_js_object(script) if script else {}
items = state.get("products", [])

Ziehe einen strukturierten Parser einem weit gefassten regulären Ausdruck vor. Regex kann eine klar abgegrenzte Zuweisung isolieren, wird jedoch bei verschachtelten Objekten und escaped Strings anfällig. Die Kombination von direkten JSON-Anfragen mit dem Parsen von Script-Tags löst oft das Problem dynamischer Inhalte in Scrapy, ohne einen Browser starten zu müssen.

Füge JavaScript-Rendering mit scrapy-playwright hinzu

Wenn die Daten von browserabhängigem Verhalten abhängen, wie z. B. Anwendungscode, Web-APIs oder interaktionsgesteuerter Zustand, fügen Sie Rendering selektiv hinzu. Dieses Beispiel für JavaScript mit Scrapy verwendet „scrapy-playwright“ als Hauptintegrationspfad, während gewöhnliche Anfragen weiterhin über den Standard-Downloader von Scrapy abgewickelt werden.

Installieren und Konfigurieren der Integration

Ein häufig dokumentiertes Einrichtungsmuster sieht vor, das Plugin und eine Playwright-Browser-Binärdatei in derselben Projektumgebung zu installieren:

python -m pip install scrapy-playwright
python -m playwright install chromium

Fügen Sie den asyncio-Reaktor und die Playwright-Download-Handler zu settings.py:

TWISTED_REACTOR = "twisted.internet.asyncioreactor.AsyncioSelectorReactor"

DOWNLOAD_HANDLERS = {
    "http": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler",
    "https": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler",
}

PLAYWRIGHT_BROWSER_TYPE = "chromium"

Legen Sie in produktionsfähigen Projekten kompatible Versionen der Abhängigkeiten fest und verwenden Sie dieselbe Lock-Datei sowohl in der Entwicklung als auch in der Produktion. Die bereitgestellten Belege decken nicht die gesamte aktuelle Konfigurationsfläche des Plugins ab. Überprüfen Sie daher die aktuelle Projektdokumentation, bevor Sie diese Vorlage als release-bereit betrachten.

Rendern Sie eine Anfrage und analysieren Sie sie mit Scrapy-Selektoren

Markieren Sie nur die Anfrage, für die ein Browser benötigt wird. Eine sinnvolle Selektor-Wartezeit stellt sicher, dass der Callback HTML erhält, nachdem die Zielkomponente angezeigt wird:

import scrapy
from scrapy_playwright.page import PageMethod

class ProductsSpider(scrapy.Spider):
    name = "products"

    def start_requests(self):
        yield scrapy.Request(
            "https://example.com/products",
            meta={
                "playwright": True,
                "playwright_page_methods": [
                    PageMethod(
                        "wait_for_selector",
                        "[data-product-card]",
                    )
                ],
            },
        )

    def parse(self, response):
        for card in response.css("[data-product-card]"):
            yield {
                "name": card.css("[data-name]::text").get(),
                "price": card.css("[data-price]::text").get(),
            }

Der Callback erhält weiterhin eine Scrapy-Antwort, sodass bestehende CSS- und XPath-Extraktionsmuster weiterhin nützlich sind. Behalten Sie statische Kategorieseiten, API-Aufrufe und Assets bei normalen Anfragen bei. Ein spezielles Scrapy-Playwright-Tutorial für JavaScript-intensive Websites ist die naheliegende nächste interne Referenz, wenn Sie mehrere Kontexte, Seitenereignisse oder eine tiefergehende Projektkonfiguration benötigen.

Warten auf dynamische Inhalte und Interaktion mit diesen

Ein abgeschlossenes Navigationsereignis bedeutet nicht, dass die Anwendungsdaten bereitstehen. Das JavaScript-Rendering von Scrapy wird erst dann zuverlässig, wenn der Spider auf einen Zustand wartet, der mit den Feldern zusammenhängt, die er extrahieren möchte.

Bevorzugen Sie zustandsbasierte Wartezeiten gegenüber festen Verzögerungen

Warten Sie auf einen stabilen Selektor, eine bekannte API-Antwort, einen URL-Wechsel oder ein Anwendungsflag. Ein Selektor wie [data-results-loaded="true"] drückt die Absicht besser aus als ein dreisekündiges Warten. Feste Verzögerungen können bei einem langsamen Durchlauf zu kurz sein und bei einem schnellen Durchlauf Zeit verschwenden.

Verwenden Sie begrenzte Timeouts und protokollieren Sie, welche Bedingung fehlgeschlagen ist. Wenn kein stabiles Signal vorliegt, kann eine kurze feste Wartezeit als Ausweichlösung dienen, aber legen Sie eine Obergrenze für die gesamte Browseranfrage fest. Dadurch wird eine Scrapy-Wartezeit aufgrund eines JavaScript-Fehlers beobachtbar, anstatt Seiten auf unbestimmte Zeit offen zu lassen.

Klicken, scrollen, paginieren und den Sitzungsstatus beibehalten

Seitenmethoden können eine kontrollierte Interaktion durchführen, bevor die Antwort zurückkehrt:

bplaywright_page_methods": [
    PageMethod("click", "button.load-more"),
    PageMethod("wait_for_selector", "[data-page='2']"),
]

Bei unendlichem Scrollen wiederhole eine Scroll-Aktion nur so lange, wie die Elementanzahl zunimmt, und höre nach einer definierten Anzahl unveränderter Durchläufe auf. Bei der Paginierung ziehe die Datenanfrage der Website vor, falls vorhanden; andernfalls klicke auf das „Weiter“-Steuerelement und warte, bis sich ein Seitenmarker oder die ID der ersten Zeile ändert.

Behalten Sie zugehörige authentifizierte Anfragen im gleichnamigen Browserkontext bei, damit Cookies und lokaler Speicher erhalten bleiben. Mit playwright_include_page=TrueSchließen Sie die aktive Seite in einem finally Block. Schließen Sie einen dedizierten Kontext nach seiner letzten Sitzungsanfrage, nicht während andere Anfragen noch davon abhängig sind:

async def parse_last_session_page(self, response):
    page = response.meta["playwright_page"]
    context = page.context
    try:
        return {"title": await page.title()}
    finally:
        await page.close()
        await context.close()

Da sich die APIs für Einbindung und Bereinigung ändern können, überprüfen Sie vor der Bereitstellung die aktuellen Metadaten der Anfrage und die Lebenszyklusregeln. Durch „Leaked Pages“ wird schließlich das Seitenlimit des Browsers ausgeschöpft, was dazu führt, dass ein ansonsten korrekter JavaScript-Spider mit Scrapy scheinbar hängen bleibt.

Vergleichen Sie die Scrapy-JavaScript-Optionen

Die beste Integration hängt davon ab, ob Sie einen echten Browser benötigen, wie viel Interaktion der Ablauf erfordert und wer die Rendering-Infrastruktur betreibt. Entscheiden Sie sich nicht allein danach, wie kurz die erste Demo wirkt.

Playwright, Selenium, Splash und gehostete Rendering-APIs

Option

Am besten geeignet

Wichtigste Vor- und Nachteile

scrapy-playwright

Selektives Browser-Rendering innerhalb eines Scrapy-Projekts, einschließlich moderner Interaktionen

CPU- und Speicherbelastung durch den Browser, asynchrone Lebenszyklusverwaltung sowie versionsabhängige Integrationsdetails

Selenium-basierte Integration

Teams mit etablierter WebDriver-Automatisierung oder Testcode

Treiber- und Browserverwaltung, mehr „Glue-Code“ rund um Scrapy sowie Kompatibilität, die für das gewählte Paket überprüft werden muss

Splash-basierte Integration

Ein HTTP-Rendering-Dienst oder bestehende Lua-basierte Workflows

Ein separat zu betreibender Dienst sowie JavaScript-Verhalten, das von einem aktuellen Vollbrowser abweichen kann

Gehostete Rendering-API

Auslagerung der Browser-, Proxy- und Wiederholungsinfrastruktur

Anbieterspezifische Einschränkungen, Timeout-Semantik, Parallelität, Preisgestaltung und geringere lokale Kontrolle

Ein gezielter Vergleich zwischen Scrapy und Selenium kann hilfreich sein, wenn Sie bereits WebDriver-Code pflegen. Ein Scrapy-Splash-Tutorial ist nützlicher, wenn Ihre Architektur einen eigenständigen Rendering-Dienst bevorzugt. Verwenden Sie für JavaScript mit Scrapy die Option, die die minimal erforderliche Interaktion erfüllt, während einfache Anfragen weiterhin browserfrei bleiben.

Das Rendern ist keine Garantie gegen Bots. Ein vollständiger Browser kann weiterhin eine 403-Antwort, ein CAPTCHA, eine Ratenbegrenzung oder eine Kontoüberprüfung erhalten; bewerten Sie daher Zugriffskontrollen getrennt von der DOM-Ausführung.

Führen Sie gerenderte Spiders zuverlässig in der Produktion aus

Ein Headless-Browser mit Scrapy ist langsamer und ressourcenintensiver als eine normale HTTP-Anfrage. Die Zuverlässigkeit im Produktivbetrieb wird durch die Begrenzung der Browser-Arbeit, die Eindämmung von Fehlern und die Messung der Ressourcen gewährleistet.

Kontrollieren Sie Kosten, Parallelität und Browser-Ressourcen

Rendern Sie nur URLs, bei denen dies nachweislich erforderlich ist. Zwischenspeichern Sie repräsentative Seiten während der Parser-Entwicklung, blockieren Sie unnötige Medien mit Bedacht und legen Sie konservative Grenzwerte für Browserkontexte und Seiten fest. Erhöhen Sie die Parallelität schrittweise, während Sie Speicher, CPU, Timeouts und geöffnete Seiten im Auge behalten.

Verwenden Sie separate Timeout-Budgets für Navigation und Wartezeiten nach dem Laden. Wiederholen Sie vorübergehende Netzwerk- oder Browserprozess-Fehler, begrenzen Sie jedoch die Anzahl der Versuche und vermeiden Sie Wiederholungsversuche bei deterministischen Fehlern, wie z. B. einem dauerhaft entfernten Selektor. Schließen Sie Seiten bei Erfolg und Ausnahmen und recyceln Sie fehlerhafte Browser-Worker. Diese Maßnahmen verhindern, dass JavaScript mit Scrapy ein einzelnes langsames Ziel in einen crawlerweiten Rückstau verwandelt.

Ein Leitfaden zum Web-Scraping ohne Blockierung ist eine nützliche interne Ergänzung zu Headern, Anfrageraten, Proxys und Zugriffsdiagnosen, die unabhängig von der Korrektheit der Darstellung sind.

Fehlerbehebung bei fehlenden, langsamen oder blockierten Inhalten

Symptom

Als Nächstes prüfen

Feld ist im Browser vorhanden, aber nicht response.text

Suchen Sie die Fetch-/XHR-Anfrage oder das eingebettete Skript, bevor Sie das Rendering hinzufügen

In der gerenderten Antwort fehlen weiterhin Daten

Warten Sie auf einen feldspezifischen Selektor oder eine Netzwerkbedingung und überprüfen Sie den Selektor anschließend anhand des endgültigen DOM

Die erste Seite funktioniert, spätere Seiten sind leer

Cookies, Tokens, den Kontextstatus und Paginierungsparameter beibehalten

Der Spider wird mit der Zeit langsamer

Zählen Sie offene Seiten und Kontexte, überprüfen Sie die Bereinigung und verringern Sie die Anzahl der gleichzeitig gerenderten Seiten

Wiederholte Timeouts

Navigation von Anwendungswartzeiten trennen, Diagnosedaten erfassen und die Anzahl der Wiederholungsversuche begrenzen

403 oder CAPTCHA

Behandeln Sie dies als Problem der Zugriffskontrolle, nicht als Beweis dafür, dass JavaScript fehlgeschlagen ist

Wenn ein Selektor nicht funktioniert, speichern Sie den gerenderten HTML-Code und vergleichen Sie ihn mit der Browsersitzung, die für manuelle Tests verwendet wurde. Wenn Antworten blockiert werden, überprüfen Sie Statuscodes und Challenge-Seiten, bevor Sie die Wartezeitlogik ändern. Diese Schleife von Symptom zu Maßnahme sorgt dafür, dass die Fehlersuche auf Fakten basiert, anstatt bei jeder Anfrage längere Wartezeiten einzubauen.

Wichtige Erkenntnisse

  • Suchen Sie nach rohem HTML, JSON-Endpunkten und eingebettetem Anwendungsstatus, bevor Sie einen Browser hinzufügen.
  • Aktivieren Sie „scrapy-playwright“ nur bei Anfragen, die eine Ausführung erfordern, und verwenden Sie anschließend weiterhin Scrapy-Selektoren für die gerenderte Antwort.
  • Warten Sie auf einen beobachtbaren Seitenstatus, begrenzen Sie Timeouts und schließen Sie jede eingebundene Seite oder jeden dedizierten Kontext.
  • Behandeln Sie Rendering, Skalierung und Anti-Bot-Zugriff als separate technische Probleme mit unterschiedlichen Diagnosemethoden.

FAQ

Kann ein Scrapy-Spider Standardanfragen mit JavaScript-gerenderten Anfragen mischen?

Ja. Behalten Sie normale scrapy.Request Objekte im Standard-Downloader und fügen Sie die Rendering-Metadaten nur zu URLs hinzu, die einen Browser benötigen. Beide Anfragetypen können in dieselbe Item-Pipeline eingespeist werden. Dieses selektive Modell bewahrt den Durchsatz von Scrapy für statische Seiten, während eine kleinere Teilmenge die Ausführung im Browser nutzen kann.

Wie kann ich benutzerdefiniertes JavaScript ausführen oder mit „scrapy-playwright“ auf ein Element klicken?

Verwenden Sie einen „page-method“-Eintrag für Operationen, die vor dem Callback ausgeführt werden können, wie z. B. einen Klick oder einen evaluate Aufruf. Für bedingte Logik oder von benutzerdefiniertem JavaScript zurückgegebene Werte fügen Sie das Live-Seitenobjekt in die Antwort-Metadaten ein und verwenden Sie einen asynchronen Callback. Schließen Sie diese Seite immer in finally, auch wenn bei der Extraktion eine Ausnahme ausgelöst wird.

Wie erstelle ich einen Screenshot oder überprüfe das gerenderte HTML während des Debuggens?

Fügen Sie das Playwright-Seitenobjekt in die Antwort ein und rufen Sie dann page.screenshot(path="debug.png", full_page=True) innerhalb eines asynchronen Callbacks auf. Speichern Sie await page.content() neben dem Screenshot, wenn das Verhalten des Selektors unklar ist. Verwenden Sie eindeutige Dateinamen, die eine Anfrage-ID enthalten, und vermeiden Sie es, diese Diagnosefunktionen im großen Maßstab aktiviert zu lassen, da Screenshots zusätzlichen I/O- und Speicheraufwand verursachen.

Verhindert ein Headless-Browser 403-Antworten, CAPTCHAs oder Sperren?

Nein. Ein Headless-Browser führt zwar JavaScript aus, doch Websites können weiterhin die IP-Reputation, die Anfragerate, Cookies, das Kontoverhalten, Browser-Fingerabdrücke und Navigationsmuster auswerten. Diagnostizieren Sie den zurückgegebenen Status und den Inhalt der Sicherheitsabfrage separat. Das Rendern kann die Seite funktionsfähig machen, ohne dass der Datenverkehr dadurch vertrauenswürdig oder autorisiert wird.

Kann „scrapy-playwright“ in Docker oder einer CI-Umgebung ausgeführt werden?

Ja. Der Container muss die ausgewählte Browser-Binärdatei und deren Betriebssystem-Abhängigkeiten enthalten, und die Playwright-Version sollte mit dem von Ihnen installierten Python-Paket übereinstimmen. Fixieren Sie die Abhängigkeiten, testen Sie das Image ohne Display-Server, stellen Sie ausreichend gemeinsam genutzten Speicher bereit und führen Sie einen kleinen gerenderten Smoke-Test durch, bevor Sie den vollständigen Spider starten.

Fazit: JavaScript mit Scrapy in der Praxis

Der zuverlässige Weg, mit dynamischen Seiten umzugehen, besteht darin, von der einfachsten zur komplexesten Methode überzugehen. Vergleichen Sie die rohe Scrapy-Antwort mit dem gerenderten DOM, lokalisieren Sie die Anfrage oder den eingebetteten Zustand, der die fehlenden Felder liefert, und parsen Sie strukturierte Daten direkt, wann immer dies möglich ist. Erst dann sollten Sie die Ausführung im Browser hinzufügen.

Wenn ein Rendering erforderlich ist, sollte es selektiv erfolgen. Warten Sie auf einen an die Daten gebundenen Zustand, nicht auf eine willkürliche Verzögerung; bewahren Sie den Sitzungskontext nur dort auf, wo der Arbeitsablauf dies erfordert; und schließen Sie Seiten und Kontexte vorhersehbar. In der Produktion sind Browser-Parallelität, Timeout-Grenzen, Wiederholungsversuche und Ressourcenmetriken genauso wichtig wie Selektoren. Ein Browser, der auf einem Laptop korrekt rendert, kann dennoch zum Engpass des Crawlers werden oder bei großem Umfang auf Zugriffskontrollen stoßen.

Wenn nicht die Interaktionslogik, sondern Blockierungen auf der Anforderungsschicht zum Engpass werden, bietet die WebScrapingAPI eine Scraper-API, die rohes HTML zurückgibt und dabei Proxy-Rotation und CAPTCHAs im Hintergrund verwaltet. So können Sie die Parsing- und Item-Pipeline von Scrapy beibehalten und gleichzeitig die instabile Abrufschicht auslagern. Beginnen Sie mit dem einfachsten Weg, den Sie überprüfen können, instrumentieren Sie ihn und fügen Sie erst dann Browser-Komplexität hinzu, wenn die Ergebnisse zeigen, dass Sie diese benötigen.

Über den Autor

Mihai Maxim, Full-Stack-Entwickler @ WebScrapingAPI

Mihai Maxim

Full-Stack-Entwickler

Mihai Maxim ist Full-Stack-Entwickler bei WebScrapingAPI, wo er in verschiedenen Bereichen des Produkts mitwirkt und an der Entwicklung zuverlässiger Tools und Funktionen für die Plattform mitarbeitet.

Web-Scraping mit AWS Lambda: Leitfaden für Python und Java 2026
Anleitungen

Web-Scraping mit AWS Lambda: Leitfaden für Python und Java 2026

Kurz gesagt: Web-Scraping mit AWS Lambda funktioniert am besten, wenn jeder Aufruf kurz, begrenzt und unabhängig wiederholbar ist. Beginnen Sie mit direktem HTTP, AWS SAM und S3 und fügen Sie erst dann SQS, Container, Browser-Rendering, Proxys oder eine verwaltete Abrufebene hinzu, wenn sich im Rahmen der Arbeitslast herausstellt, dass diese erforderlich sind.

Suciu Dan26 min read
Artikel lesen
So verwenden Sie GoSpider: Crawlen, URLs bereinigen und Daten extrahieren
Anleitungen

So verwenden Sie GoSpider: Crawlen, URLs bereinigen und Daten extrahieren

TL;DR: GoSpider ist ein Befehlszeilen-Crawler zum Auffinden von URLs, kein vollständiger Scraper für strukturierte Daten. Diese Anleitung zur Verwendung von GoSpider zeigt einen begrenzten Crawl, die saubere Verarbeitung der Ausgabe, die Übergabe von Colly an CSV sowie einen Diagnosepfad für 403-Antworten oder Seiten, die eine JavaScript-Darstellung erfordern.

Suciu Dan20 min read
Artikel lesen
Wie man Redfin scrappt: Python-Leitfaden für Immobiliendaten
Anleitungen

Wie man Redfin scrappt: Python-Leitfaden für Immobiliendaten

TL;DR: Redfin stellt versteckte API-Endpunkte zur Verfügung, die strukturiertes JSON für Immobilienangebote zurückgeben, wodurch das fragile HTML-Parsing vollständig übersprungen werden kann. Diese Anleitung führt Sie durch den Aufbau eines Python-Scrapers, der Miet- und Verkaufsdaten extrahiert, nach Standort sucht, neue Angebote über XML-Sitemaps überwacht und saubere Ergebnisse in CSV oder JSON exportiert.

Suciu Dan11 min read
Artikel lesen

Los geht’s

Sind Sie bereit, Ihre Datenerfassung zu erweitern?

Schließen Sie sich den über 2.000 Unternehmen an, die WebScrapingAPI nutzen, um Webdaten im Unternehmensmaßstab ohne zusätzlichen Infrastrukturaufwand zu extrahieren.