Heim >Backend-Entwicklung >Python-Tutorial >Anleitung zum Scrapen von Crunchbase mit Python im Easy Guide)

Anleitung zum Scrapen von Crunchbase mit Python im Easy Guide)

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2025-01-16 12:57:59306Durchsuche

Python-Entwickler kennen das Problem: Sie benötigen zuverlässige Unternehmensdaten, und Crunchbase hat sie. Diese Anleitung zeigt Ihnen, wie Sie einen effektiven Crunchbase-Scraper in Python erstellen, der Ihnen die Daten liefert, die Sie benötigen.

Crunchbase verfolgt wichtige Details: Standorte, Geschäftsschwerpunkt, Gründer und Investitionshistorie. Eine manuelle Extraktion aus einem so großen Datensatz ist nicht praktikabel – Automatisierung ist für die Umwandlung dieser Informationen in ein analysierbares Format unerlässlich.

Am Ende dieses Blogs werden wir drei verschiedene Möglichkeiten erkunden, Daten aus Crunchbase mit Crawlee für Python zu extrahieren. Zwei davon werden wir vollständig umsetzen und die Besonderheiten und Herausforderungen der dritten besprechen. Dies wird uns helfen, besser zu verstehen, wie wichtig es ist, die richtige Datenquelle richtig auszuwählen.

Hinweis: Dieser Leitfaden stammt von einem Entwickler aus unserer wachsenden Community. Haben Sie mit Crawlee interessante Projekte realisiert? Treten Sie uns auf Discord bei, um Ihre Erfahrungen und Blog-Ideen zu teilen – wir schätzen die Beiträge von Entwicklern wie Ihnen.

Wichtige Schritte, die wir behandeln werden:

  1. Projekteinrichtung
  2. Auswahl der Datenquelle
  3. Implementierung eines Sitemap-basierten Crawlers
  4. Analyse des suchbasierten Ansatzes und seiner Grenzen
  5. Implementierung des offiziellen API-Crawlers
  6. Fazit und Repository-Zugriff

Voraussetzungen

  • Python 3.9 oder höher
  • Vertrautheit mit Web-Scraping-Konzepten
  • Crawlee für Python v0.5.0
  • Poesie v2.0 oder höher

Projektaufbau

Bevor wir mit dem Schaben beginnen, müssen wir unser Projekt einrichten. In dieser Anleitung verwenden wir keine Crawler-Vorlagen (Playwright und Beautifulsoup), daher richten wir das Projekt manuell ein.

  1. Poetry installieren

    pipx install poetry
    
  2. Erstellen Sie den Projektordner und navigieren Sie zu ihm.

    mkdir crunchbase-crawlee && cd crunchbase-crawlee
    
  3. Initialisieren Sie das Projekt mit Poetry und lassen Sie alle Felder leer.

    poetry init
    

    Bei Aufforderung:

    • Geben Sie für „Kompatible Python-Versionen“ Folgendes ein: >={Ihre Python-Version},<4.0 (Wenn Sie beispielsweise Python 3.10 verwenden, geben Sie Folgendes ein: >=3.10,<4.0)
    • Lassen Sie alle anderen Felder leer, indem Sie die Eingabetaste drücken
    • Bestätigen Sie die Generierung, indem Sie „Ja“ eingeben
  4. Fügen Sie Crawlee mit den erforderlichen Abhängigkeiten zu Ihrem Projekt hinzu und installieren Sie es mithilfe von Poetry.

    poetry add crawlee[parsel,curl-impersonate]
    
  5. Schließen Sie die Projekteinrichtung ab, indem Sie die Standarddateistruktur für Crawlee für Python-Projekte erstellen.

    mkdir crunchbase-crawlee && touch crunchbase-crawlee/{__init__.py,__main__.py,main.py,routes.py}
    

Nachdem wir die grundlegende Projektstruktur eingerichtet haben, können wir verschiedene Methoden zum Abrufen von Daten von Crunchbase erkunden.

Auswahl der Datenquelle

Während wir Zieldaten direkt von der Unternehmensseite extrahieren können, müssen wir die beste Art der Navigation auf der Website auswählen.

Eine sorgfältige Untersuchung der Struktur von Crunchbase zeigt, dass wir drei Hauptoptionen haben, um Daten zu erhalten:

  1. Sitemap – für die vollständige Site-Durchquerung.
  2. Suche – zur gezielten Datenerfassung.
  3. Offizielle API – empfohlene Methode.

Lassen Sie uns jeden dieser Ansätze im Detail untersuchen.

Scraping von Crunchbase mit Sitemap und Crawlee für Python

Sitemap ist eine Standardmethode der Site-Navigation, die von Crawlern wie Google, Ahrefs und anderen Suchmaschinen verwendet wird. Alle Crawler müssen die in robots.txt beschriebenen Regeln befolgen.

Sehen wir uns die Struktur der Sitemap von Crunchbase an:

Sitemap first lvl

Wie Sie sehen können, befinden sich Links zu Organisationsseiten in Sitemap-Dateien der zweiten Ebene, die mit gzip komprimiert werden.

Die Struktur einer dieser Dateien sieht folgendermaßen aus:

Sitemap second lvl

Das Lastmod-Feld ist hier besonders wichtig. Es ermöglicht die Nachverfolgung, welche Unternehmen ihre Informationen seit der letzten Datenerfassung aktualisiert haben. Dies ist besonders nützlich für regelmäßige Datenaktualisierungen.

1. Konfigurieren des Crawlers für das Scraping

Um mit der Site zu arbeiten, verwenden wir CurlImpersonateHttpClient, der einen Safari-Browser imitiert. Während diese Wahl für die Arbeit mit einer Sitemap unerwartet erscheinen mag, ist sie aufgrund der Schutzfunktionen von Crunchbase erforderlich.

Der Grund dafür ist, dass Crunchbase Cloudflare zum Schutz vor automatisierten Zugriffen nutzt. Dies wird deutlich sichtbar, wenn man den Traffic auf einer Unternehmensseite analysiert:

Cloudflare Link

Eine interessante Funktion ist, dass Challenges.cloudflare nach dem Laden des Dokuments mit Daten ausgeführt wird. Das bedeutet, dass wir zuerst die Daten erhalten und erst dann prüft JavaScript, ob wir ein Bot sind. Wenn der Fingerabdruck unseres HTTP-Clients einem echten Browser hinreichend ähnlich ist, können wir die Daten erfolgreich empfangen.

Cloudflare analysiert den Datenverkehr auch auf Sitemap-Ebene. Wenn unser Crawler nicht legitim aussieht, wird der Zugriff blockiert. Deshalb imitieren wir einen echten Browser.

Um Blockaden aufgrund übermäßig aggressiven Crawlens zu verhindern, konfigurieren wir ConcurrencySettings.

Wenn Sie diesen Ansatz skalieren, benötigen Sie wahrscheinlich Proxys. Detaillierte Informationen zur Proxy-Einrichtung finden Sie in der Dokumentation.

Wir speichern unsere Scraping-Ergebnisse im JSON-Format. So sieht die grundlegende Crawler-Konfiguration aus:

pipx install poetry

2. Implementierung der Sitemap-Navigation

Die Sitemap-Navigation erfolgt in zwei Schritten. Im ersten Schritt benötigen wir eine Liste aller Dateien, die Organisationsinformationen enthalten:

pipx install poetry

Im zweiten Schritt verarbeiten wir Sitemap-Dateien der zweiten Ebene, die im gzip-Format gespeichert sind. Dies erfordert einen besonderen Ansatz, da die Daten zuerst dekomprimiert werden müssen:

mkdir crunchbase-crawlee && cd crunchbase-crawlee

3. Daten extrahieren und speichern

Jede Unternehmensseite enthält eine große Menge an Informationen. Zu Demonstrationszwecken konzentrieren wir uns auf die Hauptfelder: Firmenname, Kurzbeschreibung, Website und Standort.

Einer der Vorteile von Crunchbase besteht darin, dass alle Daten im JSON-Format innerhalb der Seite gespeichert werden:

Company Data

Dies vereinfacht die Datenextraktion erheblich – wir müssen nur einen Xpath-Selektor verwenden, um den JSON zu erhalten, und dann jmespath anwenden, um die benötigten Felder zu extrahieren:

poetry init

Die gesammelten Daten werden mithilfe der context.push_data-Methode im internen Speicher von Crawlee for Python gespeichert. Wenn der Crawler fertig ist, exportieren wir alle gesammelten Daten in eine JSON-Datei:

poetry add crawlee[parsel,curl-impersonate]

4. Ausführen des Projekts

Sobald alle Komponenten vorhanden sind, müssen wir einen Einstiegspunkt für unseren Crawler erstellen:

mkdir crunchbase-crawlee && touch crunchbase-crawlee/{__init__.py,__main__.py,main.py,routes.py}

Führen Sie den Crawler mit Poetry aus:

# main.py

from crawlee import ConcurrencySettings, HttpHeaders
from crawlee.crawlers import ParselCrawler
from crawlee.http_clients import CurlImpersonateHttpClient

from .routes import router


async def main() -> None:
    """The crawler entry point."""
    concurrency_settings = ConcurrencySettings(max_concurrency=1, max_tasks_per_minute=50)

    http_client = CurlImpersonateHttpClient(
        impersonate='safari17_0',
        headers=HttpHeaders(
            {
                'accept-language': 'en',
                'accept-encoding': 'gzip, deflate, br, zstd',
            }
        ),
    )
    crawler = ParselCrawler(
        request_handler=router,
        max_request_retries=1,
        concurrency_settings=concurrency_settings,
        http_client=http_client,
        max_requests_per_crawl=30,
    )

    await crawler.run(['https://www.crunchbase.com/www-sitemaps/sitemap-index.xml'])

    await crawler.export_data_json('crunchbase_data.json')




<h3>
  
  
  5. Abschließend die Merkmale der Verwendung des Sitemap-Crawlers
</h3>

<p>Der Sitemap-Ansatz hat seine deutlichen Vorteile und Einschränkungen. Es ist ideal in den folgenden Fällen:</p>

<ul>
<li>Wenn Sie Daten über alle Unternehmen auf der Plattform sammeln müssen</li>
<li>Wenn es keine spezifischen Kriterien für die Unternehmensauswahl gibt</li>
<li>Wenn Sie über ausreichend Zeit und Rechenressourcen verfügen</li>
</ul>

<p>Es sind jedoch erhebliche Einschränkungen zu berücksichtigen:</p>

<ul>
<li>Fast keine Möglichkeit, Daten während der Erfassung zu filtern</li>
<li>Erfordert eine ständige Überwachung der Cloudflare-Blöcke</li>
<li>Für die Skalierung der Lösung sind Proxyserver erforderlich, was die Projektkosten erhöht</li>
</ul>

<h2>
  
  
  Verwenden Sie die Suche nach Scraping Crunchbase
</h2>

<p>Die Einschränkungen des Sitemap-Ansatzes könnten darauf hindeuten, dass die Suche die nächste Lösung ist. Allerdings wendet Crunchbase bei seiner Suchfunktion im Vergleich zu seinen öffentlichen Seiten strengere Sicherheitsmaßnahmen an.</p>

<p>Der Hauptunterschied liegt in der Funktionsweise des Cloudflare-Schutzes. Während wir beim Zugriff auf eine Unternehmensseite Daten vor der Challenges.cloudflare-Prüfung erhalten, erfordert die Such-API gültige Cookies, die diese Prüfung bestanden haben.</p>

<p>Lassen Sie uns dies in der Praxis überprüfen. Öffnen Sie den folgenden Link im Inkognito-Modus:<br>
</p>

<pre class="brush:php;toolbar:false"># routes.py

from crawlee.crawlers import ParselCrawlingContext
from crawlee.router import Router
from crawlee import Request

router = Router[ParselCrawlingContext]()


@router.default_handler
async def default_handler(context: ParselCrawlingContext) -> None:
    """Default request handler."""
    context.log.info(f'default_handler processing {context.request} ...')

    requests = [
        Request.from_url(url, label='sitemap')
        for url in context.selector.xpath('//loc[contains(., "sitemap-organizations")]/text()').getall()
    ]

    # Since this is a tutorial, I don't want to upload more than one sitemap link
    await context.add_requests(requests, limit=1)

Bei der Analyse des Datenverkehrs sehen wir das folgende Muster:

Search Protect

Die Reihenfolge der Ereignisse hier ist:

  1. Zuerst wird die Seite mit dem Code 403 gesperrt
  2. Dann wird die Challenges.cloudflare-Prüfung durchgeführt
  3. Erst nach erfolgreich bestandener Prüfung erhalten wir Daten mit dem Code 200

Um diesen Prozess zu automatisieren, wäre ein Headless-Browser erforderlich, der Cloudflare Turnstile umgehen kann. Die aktuelle Version von Crawlee für Python (v0.5.0) bietet diese Funktionalität nicht, obwohl eine zukünftige Entwicklung geplant ist.

Sie können die Funktionen von Crawlee für Python erweitern, indem Sie Camoufox nach diesem Beispiel integrieren.

Arbeiten mit der offiziellen Crunchbase API

Crunchbase bietet eine kostenlose API mit grundlegenden Funktionen. Benutzer mit kostenpflichtigen Abonnements erhalten erweiterten Datenzugriff. Eine vollständige Dokumentation für verfügbare Endpunkte finden Sie in der offiziellen API-Spezifikation.

1. API-Zugriff einrichten

Um mit der API zu arbeiten, befolgen Sie diese Schritte:

  1. Erstellen Sie ein Crunchbase-Konto
  2. Gehen Sie zum Abschnitt „Integrationen“
  3. Erstellen Sie einen Crunchbase Basic API-Schlüssel

Obwohl in der Dokumentation angegeben ist, dass die Schlüsselaktivierung bis zu einer Stunde dauern kann, beginnt sie normalerweise sofort nach der Erstellung zu funktionieren.

2. Konfigurieren des Crawlers für die API-Arbeit

Eine wichtige API-Funktion ist das Limit – nicht mehr als 200 Anfragen pro Minute, aber in der kostenlosen Version ist diese Zahl deutlich niedriger. Unter Berücksichtigung dessen konfigurieren wir ConcurrencySettings. Da wir mit der offiziellen API arbeiten, müssen wir unseren HTTP-Client nicht maskieren. Wir verwenden den Standard „HttpxHttpClient“ mit voreingestellten Headern.

Speichern wir zunächst den API-Schlüssel in einer Umgebungsvariablen:

pipx install poetry

So sieht die Crawler-Konfiguration für die Arbeit mit der API aus:

mkdir crunchbase-crawlee && cd crunchbase-crawlee

3. Verarbeitung von Suchergebnissen

Für die Arbeit mit der API benötigen wir zwei Hauptendpunkte:

  1. get_autocompletes – zum Suchen
  2. get_entities_organizations__entity_id – zum Abrufen von Daten

Zuerst implementieren wir die Suchergebnisverarbeitung:

poetry init

4. Extrahieren von Unternehmensdaten

Nachdem wir die Liste der Unternehmen erhalten haben, extrahieren wir detaillierte Informationen zu jedem Unternehmen:

poetry add crawlee[parsel,curl-impersonate]

5. Erweiterte standortbasierte Suche

Wenn Sie flexiblere Suchfunktionen benötigen, bietet die API einen speziellen Suchendpunkt. Hier ist ein Beispiel für die Suche nach allen Unternehmen in Prag:

mkdir crunchbase-crawlee && touch crunchbase-crawlee/{__init__.py,__main__.py,main.py,routes.py}

Zur Verarbeitung von Suchergebnissen und Paginierung verwenden wir den folgenden Handler:

# main.py

from crawlee import ConcurrencySettings, HttpHeaders
from crawlee.crawlers import ParselCrawler
from crawlee.http_clients import CurlImpersonateHttpClient

from .routes import router


async def main() -> None:
    """The crawler entry point."""
    concurrency_settings = ConcurrencySettings(max_concurrency=1, max_tasks_per_minute=50)

    http_client = CurlImpersonateHttpClient(
        impersonate='safari17_0',
        headers=HttpHeaders(
            {
                'accept-language': 'en',
                'accept-encoding': 'gzip, deflate, br, zstd',
            }
        ),
    )
    crawler = ParselCrawler(
        request_handler=router,
        max_request_retries=1,
        concurrency_settings=concurrency_settings,
        http_client=http_client,
        max_requests_per_crawl=30,
    )

    await crawler.run(['https://www.crunchbase.com/www-sitemaps/sitemap-index.xml'])

    await crawler.export_data_json('crunchbase_data.json')

6. Schließlich die Einschränkungen der kostenlosen API

Die kostenlose Version der API weist erhebliche Einschränkungen auf:

  • Begrenzte Anzahl verfügbarer Endpunkte
  • Autocompletes-Funktion funktioniert nur bei Firmensuchen
  • Nicht alle Datenfelder sind zugänglich
  • Eingeschränkte Suchfilterfunktionen

Erwägen Sie ein kostenpflichtiges Abonnement für Arbeiten auf Produktionsebene. Die API bietet trotz ihrer Ratenbeschränkungen die zuverlässigste Möglichkeit, auf Crunchbase-Daten zuzugreifen.

Was ist Ihr bester Weg nach vorne?

Wir haben drei verschiedene Ansätze zum Abrufen von Daten von Crunchbase untersucht:

  1. Sitemap – für groß angelegte Datenerfassung
  2. Suche – aufgrund des Cloudflare-Schutzes schwer zu automatisieren
  3. Offizielle API – die zuverlässigste Lösung für kommerzielle Projekte

Jede Methode hat ihre Vorteile, aber für die meisten Projekte empfehle ich die Verwendung der offiziellen API trotz ihrer Einschränkungen in der kostenlosen Version.

Der vollständige Quellcode ist in meinem Repository verfügbar. Haben Sie Fragen oder möchten Sie Einzelheiten zur Implementierung besprechen? Treten Sie unserem Discord bei – unsere Entwickler-Community ist für Sie da.

Das obige ist der detaillierte Inhalt vonAnleitung zum Scrapen von Crunchbase mit Python im Easy Guide). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn