Crunchbase est l'un des plus grands annuaires de données sur les entreprises et les startups du web. Les profils publics d'entreprises portent le type d'intelligence structurée qui alimente la recherche de marché, l'analyse concurrentielle, la prospection commerciale et la recherche de financement : un nom d'entreprise, ce qu'elle fait, où elle est basée, ses effectifs, son site web, son classement et qui l'a fondée. Le problème est que Crunchbase rend ces profils côté client et conteste fortement le trafic automatisé, de sorte qu'une simple requête HTTP vous remet une coquille vide au lieu des données recherchées.

Ce guide vous montre comment scraper Crunchbase avec Python de manière fiable. Vous construisez un petit scraper exécutable qui récupère un profil d'entreprise rendu via la Crawling API, analyse les champs souhaités avec BeautifulSoup et affiche une sortie structurée propre. L'ensemble du tutoriel reste limité aux données de profil publiques, et la section légalité proche de la fin n'est pas un boilerplate, alors lisez-la avant de pointer ceci vers un volume réel.

Ce que vous allez construire

Un script Python qui prend une URL publique d'entreprise Crunchbase, récupère le HTML rendu via la Crawling API, et extrait un enregistrement structuré de l'entreprise. Nous ciblerons un profil d'organisation publique comme exemple fil conducteur et récupérerons ces champs :

  • Title le nom de l'entreprise, par exemple "OpenAI".
  • Description un court résumé de ce que fait l'entreprise.
  • Location où l'entreprise est basée, comme "San Francisco, California".
  • Employees la tranche d'effectifs, par exemple "1001-5000".
  • Company URL le lien vers le propre site de l'entreprise.
  • Rank la position de l'entreprise dans le classement Crunchbase.
  • Founded l'année de création de l'entreprise.
  • Founders les personnes qui ont fondé l'entreprise.

Pourquoi une simple récupération échoue sur Crunchbase

Si vous demandez une URL d'organisation Crunchbase avec un client HTTP brut, vous obtenez une réponse avec le statut 200 et presque aucune donnée de profil dans le corps. Deux choses jouent contre vous. Premièrement, Crunchbase rend son contenu de profil dans le navigateur avec JavaScript, donc le HTML initial est une coquille qui ne se remplit qu'après l'exécution des scripts de la page. Deuxièmement, Crunchbase signale rapidement le trafic automatisé : les adresses IP de centres de données et les schémas de requêtes qui ne ressemblent pas à un vrai navigateur sont contestés ou bloqués avant même d'atteindre le contenu rendu.

Un scraper Crunchbase fonctionnel a donc besoin de deux choses en une seule requête : un navigateur qui rend réellement la page, et une IP que la plateforme lit comme un visiteur réel. Vous pouvez assembler cela vous-même avec un navigateur headless plus un pool de proxies résidentiels rotatifs, mais assembler ces éléments et les maintenir en bonne santé représente la majeure partie du travail. La Crawling API regroupe les deux en un seul appel : vous lui envoyez l'URL avec un token JavaScript, elle rend la page derrière une IP de confiance, et elle renvoie le HTML terminé pour que vous l'analysiez.

Pourquoi le token JS

Crawlbase propose deux types de tokens. Le token normal récupère le HTML statique ; le token JavaScript (JS) rend d'abord la page dans un vrai navigateur. Crunchbase est rendu côté client, donc vous avez besoin du token JS ici. Utiliser le token normal renvoie la même coquille vide qu'une simple récupération, et il n'y a rien à analyser dedans.

Prérequis

Vous avez besoin de quelques éléments en place avant d'écrire du code. Aucun ne prend longtemps.

Python de base. Vous devez être à l'aise pour écrire et exécuter un script Python et installer des packages avec pip. Si vous êtes nouveau dans ce langage, la documentation officielle Python et n'importe quel cours débutant vous amèneront au niveau que ce tutoriel suppose.

Python 3.8 ou supérieur. Confirmez votre version avec python --version. Si vous ne l'avez pas, installez-le depuis python.org ou via une distribution comme Anaconda.

Un compte Crawlbase et un token JS. Inscrivez-vous, ouvrez votre tableau de bord et copiez votre token JavaScript (JS) depuis la page de documentation du compte. Traitez le token comme un mot de passe : il authentifie vos requêtes, alors ne le mettez pas dans le contrôle de version.

Configurer le projet

Créez un environnement virtuel pour isoler les dépendances du projet, puis installez les deux bibliothèques dont le scraper a besoin.

bash
python --version

python -m venv crunchbase_env
source crunchbase_env/bin/activate

pip install crawlbase beautifulsoup4

Sous Windows, activez l'environnement avec crunchbase_env\Scripts\activate au lieu de la ligne source. Deux dépendances font le travail : crawlbase est le client officiel pour la Crawling API, et beautifulsoup4 analyse le HTML renvoyé afin que vous puissiez extraire des champs individuels par sélecteur CSS.

Étape 1 : Récupérer le profil rendu

Commencez par obtenir la page terminée. Importez la classe CrawlingAPI, initialisez-la avec votre token JS et demandez l'URL de l'entreprise. Vérifier le code de statut avant d'analyser garde les échecs visibles plutôt que silencieux.

python
from crawlbase import CrawlingAPI

api = CrawlingAPI({"token": "YOUR_CRAWLBASE_JS_TOKEN"})

def crawl(page_url):
    options = {"ajax_wait": "true", "page_wait": 5000}
    response = api.get(page_url, options)
    if response["status_code"] == 200:
        return response["body"].decode("utf-8")
    print(f"Request failed: {response['status_code']}")
    return None

if __name__ == "__main__":
    page_url = "https://www.crunchbase.com/organization/openai"
    html = crawl(page_url)
    print(html[:500] if html else "No HTML returned")

Les deux options d'attente comptent pour une cible rendue côté client comme celle-ci. ajax_wait indique à l'API d'attendre la fin du chargement du contenu asynchrone, et page_wait attend un nombre fixe de millisecondes après le chargement pour que les éléments à rendu tardif apparaissent avant que la page soit capturée. Cinq secondes est un bon point de départ ; augmentez-les si les champs du profil reviennent vides. Exécutez le script avec python scraper.py et vous devriez voir un vrai balisage de profil, pas la coquille vide qu'une simple récupération renvoie. Cela confirme que le rendu fonctionne avant d'écrire un seul sélecteur.

Crawlbase Crawling API

Crunchbase nécessite une page rendue derrière une IP de confiance, en un seul appel. La Crawling API prend un token JS, exécute la page dans un vrai navigateur, fait tourner des IPs résidentielles côté serveur et vous remet du HTML terminé, vous évitant de gérer vous-même une flotte headless et un pool de proxies. Pointez-la vers un profil public d'entreprise sur le niveau gratuit d'abord.

Étape 2 : Analyser les champs de l'entreprise avec BeautifulSoup

Avec le HTML rendu en main, chargez-le dans BeautifulSoup et extrayez chaque champ par son sélecteur. Les profils Crunchbase disposent les détails essentiels dans une structure prévisible, vous pouvez donc mapper le titre, la description, l'emplacement, les effectifs, le site web, le classement, l'année de fondation et les fondateurs sur des sélecteurs individuels. Entourez l'extraction entière dans un try/except pour qu'un champ manquant ne fasse pas planter l'exécution.

python
from bs4 import BeautifulSoup

def text_of(soup, selector):
    el = soup.select_one(selector)
    return el.get_text(strip=True) if el else None

def scrape_company(html):
    soup = BeautifulSoup(html, "html.parser")
    rows = ".section-content-wrapper li.ng-star-inserted"

    company_link = soup.select_one(f"{rows}:nth-of-type(5) a[role='link']")

    return {
        "title": text_of(soup, "h1.profile-name"),
        "description": text_of(soup, "span.description"),
        "location": text_of(soup, f"{rows}:nth-of-type(1)"),
        "employees": text_of(soup, f"{rows}:nth-of-type(2)"),
        "company_url": company_link["href"] if company_link else None,
        "rank": text_of(soup, f"{rows}:nth-of-type(6) span"),
        "founded": text_of(soup, ".text_and_value li:nth-of-type(4) field-formatter"),
        "founders": text_of(soup, ".text_and_value li:nth-of-type(5) field-formatter"),
    }

L'assistant text_of fait deux choses utiles à la fois : il interroge un seul élément et renvoie None quand l'élément est absent, au lieu de lever une exception sur un appel .get_text() sur rien. Cela rend l'extraction robuste quand un champ est absent d'un profil donné, ce qui est courant car toutes les entreprises ne listent pas un classement ou un site web. L'URL de l'entreprise est lue depuis l'attribut href d'une ancre plutôt que son texte, elle est donc traitée séparément.

Dérive des sélecteurs

Les noms de classes de Crunchbase (les marqueurs Angular ng-star-inserted, les éléments field-formatter et les wrappers de section) changent sans préavis. Traitez les sélecteurs ci-dessus comme un modèle de départ, pas comme un contrat. Quand un champ revient à None, réinspectez le profil en direct dans les outils de développement de votre navigateur et mettez à jour le sélecteur. La maintenance périodique des sélecteurs est normale pour tout scraper en production, ce n'est pas le signe que quelque chose est cassé.

Étape 3 : Assembler le tout

Reliez maintenant la récupération et l'analyse en un seul script exécutable. Récupérez le HTML rendu, passez-le au parseur et affichez l'enregistrement structuré.

python
import json
from crawlbase import CrawlingAPI
from bs4 import BeautifulSoup

api = CrawlingAPI({"token": "YOUR_CRAWLBASE_JS_TOKEN"})

def crawl(page_url):
    options = {"ajax_wait": "true", "page_wait": 5000}
    response = api.get(page_url, options)
    if response["status_code"] == 200:
        return response["body"].decode("utf-8")
    print(f"Request failed: {response['status_code']}")
    return None

def text_of(soup, selector):
    el = soup.select_one(selector)
    return el.get_text(strip=True) if el else None

def scrape_company(html):
    soup = BeautifulSoup(html, "html.parser")
    rows = ".section-content-wrapper li.ng-star-inserted"
    company_link = soup.select_one(f"{rows}:nth-of-type(5) a[role='link']")

    return {
        "title": text_of(soup, "h1.profile-name"),
        "description": text_of(soup, "span.description"),
        "location": text_of(soup, f"{rows}:nth-of-type(1)"),
        "employees": text_of(soup, f"{rows}:nth-of-type(2)"),
        "company_url": company_link["href"] if company_link else None,
        "rank": text_of(soup, f"{rows}:nth-of-type(6) span"),
        "founded": text_of(soup, ".text_and_value li:nth-of-type(4) field-formatter"),
        "founders": text_of(soup, ".text_and_value li:nth-of-type(5) field-formatter"),
    }

def main():
    page_url = "https://www.crunchbase.com/organization/openai"
    html = crawl(page_url)
    if not html:
        return
    data = scrape_company(html)
    print(json.dumps(data, indent=2))

if __name__ == "__main__":
    main()

À quoi ressemble la sortie

Exécutez le script complet avec python scraper.py et vous obtenez un enregistrement structuré propre pour l'entreprise, prêt à être écrit en JSON, CSV ou en base de données.

json
{
  "title": "OpenAI",
  "description": "OpenAI is an AI research and deployment company.",
  "location": "San Francisco, California, United States",
  "employees": "1001-5000",
  "company_url": "https://openai.com",
  "rank": "5",
  "founded": "2015",
  "founders": "Elon Musk, Greg Brockman, Ilya Sutskever, Sam Altman"
}

Passer à de nombreuses entreprises

Un seul profil est une démonstration ; un vrai projet s'exécute sur une liste d'entreprises. La forme reste la même : gardez une liste d'URLs d'organisations, récupérez chacune via la Crawling API, analysez-la avec la même fonction et collectez les lignes. Puisque chaque profil partage la même structure, le parseur que vous avez déjà écrit fonctionne pour tous sans modification.

python
companies = [
    "https://www.crunchbase.com/organization/openai",
    "https://www.crunchbase.com/organization/anthropic",
]

results = []
for url in companies:
    html = crawl(url)
    if html:
        results.append(scrape_company(html))

with open("companies.json", "w") as f:
    json.dump(results, f, indent=2)

Pour trouver des URLs d'entreprises à grande échelle, vous pouvez scraper les pages de recherche et de découverte publiques de Crunchbase avec le même schéma de récupération puis d'analyse, en collectant les liens d'organisations puis en visitant chacun. Gardez simplement le volume raisonnable et respectez les limites de débit couvertes ci-dessous.

Rester non bloqué

Même avec le rendu géré, Crunchbase surveille le trafic en forme de scraper. Quelques habitudes maintiennent une exécution saine, et elles s'appliquent à toute cible commerciale difficile.

  • Rythmez vos requêtes. Surcharger les profils dans une boucle serrée est le moyen le plus rapide d'être limité. Espacez les requêtes et variez vos cibles plutôt que de crawler un chemin à pleine vitesse.
  • Misez sur la rotation. Un pool d'IPs résidentielles répartit les requêtes sur de nombreuses adresses d'utilisateurs réels afin qu'aucune n'atteigne une limite de débit. La Crawling API gère cela pour vous ; si vous construisez votre propre pile, c'est la partie à bien faire.
  • Lisez les codes de statut. Une exécution qui commence à renvoyer des défis ou des erreurs vous indique que le débit actuel ou le niveau d'IP n'est plus suffisant. Traitez cela comme un signal pour ralentir, pas comme du bruit à ignorer.

Pour le guide plus large, consultez comment scraper des sites sans être bloqué et l'analyse approfondie sur comment contourner les captchas lors du web scraping. Si vous préférez router votre propre trafic à travers un pool rotatif plutôt que d'utiliser l'API gérée, le Smart AI Proxy (également appelé AI Proxy) vous offre la même rotation d'IPs résidentielles comme point de terminaison proxy de substitution.

Est-il légal de scraper Crunchbase ?

La légalité du scraping de Crunchbase dépend des conditions d'utilisation de Crunchbase, de votre juridiction et de ce que vous faites avec les données. Les conditions de Crunchbase restreignent l'accès automatisé, le scraping peut donc aller à l'encontre de ces conditions quelle que soit la prudence de vos outils. Aucun code ici ne change cela ; il fait juste fonctionner la partie technique. Lisez les conditions d'utilisation de Crunchbase et son robots.txt, et traitez les deux comme la limite de ce que vous collectez.

Quelques lignes à respecter. Ne collectez que des données publiques : nom de l'entreprise, description, emplacement, tranche d'effectifs, site web, classement, année de fondation et fondateurs que n'importe qui peut voir sans compte. Respectez les attentes de débit déclarées de Crunchbase et maintenez votre volume de requêtes suffisamment bas pour ne pas surcharger ses serveurs. Évitez les données personnelles, y compris tout ce qui est lié à des individus identifiables au-delà de ce qui est publiquement listé sur un profil d'entreprise. Si vous prévoyez de réutiliser les données commercialement, obtenez une autorisation ou un accord officiel plutôt que de supposer que le silence est un consentement.

Pour un accès sous licence ou en volume, Crunchbase propose une API Crunchbase officielle, et c'est le bon outil quand vous avez besoin de grands volumes, d'une structure garantie ou de droits commerciaux. Ce guide est délibérément limité aux pages de profils publics d'entreprises car c'est la ligne qui rend le travail défendable. Il ne couvre pas ce qui se trouve derrière une connexion, les données Crunchbase Pro ou de niveau payant, les données privées ou financières verrouillées derrière une identification, les données de compte ou de profil utilisateur, ni aucune tentative de contourner l'authentification. Si votre projet a besoin de plus que des profils publics, l'API Crunchbase officielle ou un accord de données est la bonne voie, pas un scraper plus ingénieux.

Récapitulatif

Points clés

  • Crunchbase est rendu côté client. Une simple récupération renvoie une coquille vide, vous devez donc rendre la page avant de l'analyser.
  • Vous avez besoin du rendu et d'une IP de confiance ensemble. La Crawling API avec un token JS fait les deux en un seul appel ; ajax_wait et page_wait contrôlent la durée d'attente du contenu.
  • BeautifulSoup fait l'extraction. Mappez le titre, la description, l'emplacement, les effectifs, le site web, le classement, la date de fondation et les fondateurs sur les sélecteurs actuels, et attendez-vous à ce que ces sélecteurs dérivent.
  • Passez à l'échelle en bouclant les URLs. Le même parseur fonctionne sur chaque profil, donc un vrai projet est juste une liste de liens d'organisations avec un rythme raisonnable.
  • Restez sur les données publiques. Respectez les CGU et le robots.txt de Crunchbase, préférez l'API Crunchbase officielle pour les données sous licence ou en volume, et ne touchez jamais aux comptes, aux données Pro ou aux informations personnelles.

Foire aux questions

Pourquoi une simple récupération ne renvoie-t-elle aucune donnée de Crunchbase ?

Parce que Crunchbase rend son contenu de profil côté client avec JavaScript. Le HTML initial est une coquille qui ne se remplit qu'après l'exécution des scripts de la page dans un navigateur, donc une requête HTTP brute renvoie le statut 200 avec les champs de l'entreprise vides. Pour obtenir de vraies données, vous devez d'abord rendre la page, ce que le token JS de la Crawling API gère pour vous.

Ai-je besoin du token normal ou du token JS pour Crunchbase ?

Le token JS. Le token normal récupère le HTML statique, qui sur Crunchbase est la même coquille vide qu'une simple récupération renvoie. Le token JS rend la page dans un vrai navigateur avant de remettre le HTML, de sorte que les champs du profil sont présents quand BeautifulSoup les analyse.

Mes sélecteurs renvoient None. Qu'est-ce qui a changé ?

Presque certainement le balisage de Crunchbase. Ses marqueurs Angular ng-star-inserted, ses éléments field-formatter et ses wrappers de section changent sans préavis, de sorte que des sélecteurs qui fonctionnaient le mois dernier peuvent se casser. Réinspectez un profil en direct dans les outils de développement de votre navigateur et mettez à jour les sélecteurs. La maintenance périodique des sélecteurs est normale pour tout scraper en production.

Dois-je utiliser l'API Crunchbase officielle ou scraper le site ?

Si vous avez besoin de données sous licence, d'un volume important, d'une structure garantie ou de droits de réutilisation commerciale, utilisez l'API Crunchbase officielle. Elle est conçue pour cela et vous maintient du bon côté de leurs conditions. Scraper des profils publics avec l'approche de ce guide convient aux recherches plus petites sur des données publiques où aucun accès API n'est en place, à condition de respecter les CGU, le robots.txt et les limites de débit.

Puis-je scraper des données financières ou Pro de Crunchbase ?

Non, et ce guide ne le couvre pas. Les détails financiers et les données Crunchbase Pro se trouvent derrière une connexion ou un niveau payant, ils ne sont donc pas des données publiques. Scraper du contenu verrouillé par une connexion ou payant, ou contourner l'authentification pour l'atteindre, est hors de portée ici et va à l'encontre des conditions de Crunchbase. Pour ces données, la bonne voie est l'API Crunchbase officielle ou un accord de licence.

Comment éviter d'être bloqué lors du scraping de Crunchbase ?

Maintenez un faible taux de requêtes par IP, variez vos cibles plutôt que de boucler sur un chemin, et routez via des IPs résidentielles rotatives pour qu'aucune adresse unique n'atteigne une limite de débit. La Crawling API gère la rotation et un pool d'IPs de confiance pour vous ; si vous construisez votre propre pile, c'est la partie sur laquelle investir. Surveillez les codes de statut et ralentissez quand vous commencez à voir des défis.

Commencer à construire

Crawlez n'importe quel site à grande échelle, sans combattre l'infrastructure.

Crawlbase gère les proxies, les empreintes et les CAPTCHA afin que votre équipe livre des pipelines de données au lieu de maintenir la plomberie de crawl. 1 000 requêtes gratuites, sans carte requise.

En libre-service · Sans appel commercial requis · Volumes de crawl entreprise disponibles