Maison >développement back-end >Tutoriel Python >Comment gratter Crunchbase à l'aide de Python dans Easy Guide)
Les développeurs Python connaissent le sujet : vous avez besoin de données d'entreprise fiables, et Crunchbase les possède. Ce guide vous montre comment créer un scraper Crunchbase efficace en Python qui vous fournit les données dont vous avez besoin.
Crunchbase suit les détails importants : emplacements, orientation commerciale, fondateurs et historiques d'investissement. L'extraction manuelle d'un ensemble de données aussi volumineux n'est pas pratique - l'automatisation est essentielle pour transformer ces informations dans un format analysable.
À la fin de ce blog, nous explorerons trois manières différentes d'extraire des données de Crunchbase à l'aide de Crawlee pour Python. Nous mettrons pleinement en œuvre deux d’entre eux et discuterons des spécificités et des défis du troisième. Cela nous aidera à mieux comprendre à quel point il est important de bien choisir la bonne source de données.
Remarque : ce guide provient d'un développeur de notre communauté en pleine croissance. Avez-vous construit des projets intéressants avec Crawlee ? Rejoignez-nous sur Discord pour partager vos expériences et vos idées de blog – nous apprécions ces contributions de développeurs comme vous.
Étapes clés que nous aborderons :
Avant de commencer le scraping, nous devons mettre en place notre projet. Dans ce guide, nous n'utiliserons pas de modèles de robots (Playwright et Beautifulsoup), nous allons donc configurer le projet manuellement.
Installer la poésie
pipx install poetry
Créez et accédez au dossier du projet.
mkdir crunchbase-crawlee && cd crunchbase-crawlee
Initialisez le projet en utilisant Poésie, en laissant tous les champs vides.
poetry init
Lorsque vous y êtes invité :
Ajoutez et installez Crawlee avec les dépendances nécessaires à votre projet à l'aide de Poetry.
poetry add crawlee[parsel,curl-impersonate]
Terminez la configuration du projet en créant la structure de fichiers standard pour les projets Crawlee pour Python.
mkdir crunchbase-crawlee && touch crunchbase-crawlee/{__init__.py,__main__.py,main.py,routes.py}
Après avoir mis en place la structure de base du projet, nous pouvons explorer différentes méthodes d'obtention de données à partir de Crunchbase.
Bien que nous puissions extraire les données cibles directement à partir de la page de l'entreprise, nous devons choisir la meilleure façon de naviguer sur le site.
Un examen attentif de la structure de Crunchbase montre que nous disposons de trois options principales pour obtenir des données :
Examinons chacune de ces approches en détail.
Le plan du site est un moyen standard de navigation sur le site utilisé par les robots d'exploration comme Google, Ahrefs et d'autres moteurs de recherche. Tous les robots doivent suivre les règles décrites dans robots.txt.
Regardons la structure du plan du site de Crunchbase :
Comme vous pouvez le constater, les liens vers les pages de l'organisation se trouvent dans des fichiers Sitemap de deuxième niveau, qui sont compressés à l'aide de gzip.
La structure de l'un de ces fichiers ressemble à ceci :
Le champ lastmod est ici particulièrement important. Il permet de savoir quelles entreprises ont mis à jour leurs informations depuis la précédente collecte de données. Ceci est particulièrement utile pour les mises à jour régulières des données.
Pour travailler avec le site, nous utiliserons CurlImpersonateHttpClient, qui se fait passer pour un navigateur Safari. Bien que ce choix puisse sembler inattendu pour travailler avec un plan de site, il est rendu nécessaire par les fonctionnalités de protection de Crunchbase.
La raison est que Crunchbase utilise Cloudflare pour se protéger contre les accès automatisés. Ceci est clairement visible lors de l'analyse du trafic sur une page d'entreprise :
Une fonctionnalité intéressante est que challenges.cloudflare est exécuté après le chargement du document avec les données. Cela signifie que nous recevons les données en premier, et ensuite seulement JavaScript vérifie si nous sommes un robot. Si l'empreinte digitale de notre client HTTP est suffisamment similaire à celle d'un vrai navigateur, nous recevrons les données avec succès.
Cloudflare analyse également le trafic au niveau du plan du site. Si notre robot ne semble pas légitime, l'accès sera bloqué. C'est pourquoi nous nous faisons passer pour un vrai navigateur.
Pour éviter les blocages dus à une exploration trop agressive, nous configurerons ConcurrencySettings.
Lors de la mise à l'échelle de cette approche, vous aurez probablement besoin de proxys. Des informations détaillées sur la configuration du proxy peuvent être trouvées dans la documentation.
Nous enregistrerons nos résultats de scraping au format JSON. Voici à quoi ressemble la configuration de base du robot :
pipx install poetry
La navigation sur le plan du site se déroule en deux étapes. Dans un premier temps, nous devons obtenir une liste de tous les fichiers contenant des informations sur l'organisation :
pipx install poetry
Dans un deuxième temps, nous traitons les fichiers de plan de site de deuxième niveau stockés au format gzip. Cela nécessite une approche particulière car les données doivent d'abord être décompressées :
mkdir crunchbase-crawlee && cd crunchbase-crawlee
Chaque page d'entreprise contient une grande quantité d'informations. À des fins de démonstration, nous nous concentrerons sur les champs principaux : nom de l'entreprise, brève description, site Web et emplacement.
L'un des avantages de Crunchbase est que toutes les données sont stockées au format JSON au sein de la page :
Cela simplifie considérablement l'extraction des données : il suffit d'utiliser un seul sélecteur Xpath pour obtenir le JSON, puis d'appliquer jmespath pour extraire les champs nécessaires :
poetry init
Les données collectées sont enregistrées dans le stockage interne de Crawlee pour Python à l'aide de la méthode context.push_data. Une fois le robot terminé, nous exportons toutes les données collectées vers un fichier JSON :
poetry add crawlee[parsel,curl-impersonate]
Une fois tous les composants en place, nous devons créer un point d'entrée pour notre robot :
mkdir crunchbase-crawlee && touch crunchbase-crawlee/{__init__.py,__main__.py,main.py,routes.py}
Exécutez le robot en utilisant Poetry :
# 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. Enfin, caractéristiques de l'utilisation du robot de plan de site </h3> <p>L'approche du plan de site présente des avantages et des limites distincts. C'est idéal dans les cas suivants :</p> <ul> <li>Lorsque vous devez collecter des données sur toutes les entreprises de la plateforme</li> <li>Lorsqu'il n'y a pas de critères précis de sélection des entreprises</li> <li>Si vous disposez de suffisamment de temps et de ressources informatiques</li> </ul> <p>Cependant, il existe des limites importantes à prendre en compte :</p> <ul> <li>Presque aucune possibilité de filtrer les données lors de la collecte</li> <li>Nécessite une surveillance constante des blocs Cloudflare</li> <li>La mise à l'échelle de la solution nécessite des serveurs proxy, ce qui augmente les coûts du projet</li> </ul> <h2> Utilisation de la recherche pour scraper Crunchbase </h2> <p>Les limites de l'approche du plan de site pourraient indiquer que la recherche est la prochaine solution. Cependant, Crunchbase applique des mesures de sécurité plus strictes à sa fonctionnalité de recherche par rapport à ses pages publiques.</p> <p>La principale différence réside dans le fonctionnement de la protection Cloudflare. Bien que nous recevions des données avant la vérification de challenges.cloudflare lors de l'accès à une page d'entreprise, l'API de recherche nécessite des cookies valides qui ont réussi cette vérification.</p> <p>Vérifions cela en pratique. Ouvrez le lien suivant en mode navigation privée :<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)
Lors de l'analyse du trafic, nous verrons le modèle suivant :
La séquence des événements ici est :
L'automatisation de ce processus nécessiterait un navigateur sans tête capable de contourner Cloudflare Turnstile. La version actuelle de Crawlee pour Python (v0.5.0) ne fournit pas cette fonctionnalité, bien qu'elle soit prévue pour un développement futur.
Vous pouvez étendre les capacités de Crawlee pour Python en intégrant Camoufox en suivant cet exemple.
Crunchbase fournit une API gratuite avec des fonctionnalités de base. Les utilisateurs d'abonnements payants bénéficient d'un accès étendu aux données. Une documentation complète sur les points de terminaison disponibles est disponible dans la spécification officielle de l'API.
Pour commencer à travailler avec l'API, suivez ces étapes :
Bien que la documentation indique que l'activation de la clé peut prendre jusqu'à une heure, elle commence généralement à fonctionner immédiatement après la création.
Une fonctionnalité importante de l'API est la limite - pas plus de 200 requêtes par minute, mais dans la version gratuite, ce nombre est nettement inférieur. En tenant compte de cela, configurons ConcurrencySettings. Puisque nous travaillons avec l'API officielle, nous n'avons pas besoin de masquer notre client HTTP. Nous utiliserons le standard 'HttpxHttpClient' avec des en-têtes prédéfinis.
Tout d'abord, enregistrons la clé API dans une variable d'environnement :
pipx install poetry
Voici à quoi ressemble la configuration du robot pour travailler avec l'API :
mkdir crunchbase-crawlee && cd crunchbase-crawlee
Pour travailler avec l'API, nous aurons besoin de deux points de terminaison principaux :
Tout d'abord, implémentons le traitement des résultats de recherche :
poetry init
Après avoir obtenu la liste des entreprises, nous extrayons des informations détaillées sur chacune d'entre elles :
poetry add crawlee[parsel,curl-impersonate]
Si vous avez besoin de fonctionnalités de recherche plus flexibles, l'API fournit un point de terminaison de recherche spécial. Voici un exemple de recherche de toutes les entreprises à Prague :
mkdir crunchbase-crawlee && touch crunchbase-crawlee/{__init__.py,__main__.py,main.py,routes.py}
Pour traiter les résultats de recherche et la pagination, nous utilisons le gestionnaire suivant :
# 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')
La version gratuite de l'API présente des limitations importantes :
Envisagez un abonnement payant pour le travail au niveau de la production. L'API fournit le moyen le plus fiable d'accéder aux données Crunchbase, même avec ses contraintes de débit.
Nous avons exploré trois approches différentes pour obtenir des données de Crunchbase :
Chaque méthode a ses avantages, mais pour la plupart des projets, je recommande d'utiliser l'API officielle malgré ses limitations dans la version gratuite.
Le code source complet est disponible dans mon dépôt. Vous avez des questions ou souhaitez discuter des détails de mise en œuvre ? Rejoignez notre Discord - notre communauté de développeurs est là pour vous aider.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!