Forbes est l'un des plus grands sites d'actualités économiques et financières du web ouvert, couvrant les secteurs, les entreprises, les marchés et les personnes qui les animent. Sa section publique et ses pages thématiques contiennent beaucoup de signaux structurés : les titres d'articles, leurs auteurs, leurs dates de publication et la rubrique dont relève chacun. Les analystes surveillent ces listes pour suivre ce dont parle un secteur, les équipes éditoriales les utilisent pour cartographier la couverture et les tendances, et les chercheurs indexent les titres pour suivre une histoire dans le temps. Toutes ces métadonnées se trouvent sur la page de liste publique dans une mise en page prévisible, avant même d'ouvrir un article.

Ce guide vous montre comment scraper des données Forbes avec JavaScript et Node.js en utilisant Cheerio. Vous construirez un petit scraper fonctionnel qui récupère une page thématique ou de section Forbes publique via la Crawling API, analyse le titre, la signature d'auteur, le lien d'article, la date de publication et la section pour chaque article, gère la pagination et exporte le résultat en JSON et CSV. Le tutoriel se limite aux métadonnées de liste publiques : titres et liens uniquement, jamais le texte complet de l'article ni les médias. La section sur la légalité à la fin n'est pas un simple formulaire, car le contenu Forbes est protégé par des droits d'auteur, alors lisez-la avant de l'utiliser à grande échelle.

Ce que vous allez construire

Un script Node.js qui prend une URL de section ou de rubrique Forbes publique, récupère le HTML rendu via la Crawling API, et extrait un enregistrement structuré pour chaque carte d'article sur la page de liste. Nous utilisons la section technologie comme exemple fil rouge et extrayons ces champs par article :

  • Titre le titre de l'article affiché sur la carte de liste.
  • Auteur la signature, le contributeur ou le rédacteur crédité sur la carte.
  • Lien l'URL publique vers l'article individuel.
  • Date de publication la date ou l'heure relative que la liste affiche pour l'article.
  • Section la rubrique ou le canal auquel appartient la liste, comme technologie ou affaires.

Notez ce qui est délibérément absent : le corps de l'article, les images et tout média. Ce scraper collecte des liens et des métadonnées pour vous permettre d'indexer et de suivre la couverture, pas le contenu protégé par des droits d'auteur lui-même.

Pourquoi une simple requête échoue sur Forbes

Si vous demandez une URL de section Forbes avec un client HTTP basique, vous récupérez rarement les cartes d'articles. Deux facteurs jouent contre vous. D'abord, Forbes charge une grande partie de son contenu de liste dans le navigateur avec JavaScript, donc le HTML initial est une coquille presque vide tant que les scripts de la page ne s'exécutent pas. Ensuite, Forbes signale le trafic automatisé : les IP de datacenter et les patterns de requêtes qui ne ressemblent pas à un vrai navigateur sont limités, challengés ou bloqués avant même d'atteindre les listes rendues.

Un scraper Forbes fonctionnel a donc besoin de deux choses en une seule requête : un navigateur qui rend réellement la page, et une IP que le site considère comme un vrai visiteur. Vous pouvez assembler cela vous-même avec un navigateur headless et un pool de proxies résidentiels rotatifs, mais les assembler et les maintenir en bonne santé représente l'essentiel du travail. La Crawling API regroupe les deux en un seul appel : envoyez-lui l'URL, elle rend la page derrière une IP de confiance, et elle vous renvoie le HTML finalisé à analyser avec Cheerio.

Utilisez le token JavaScript

La Crawling API vous propose deux tokens : un normal et un JavaScript. Forbes nécessite que la page soit rendue dans un vrai navigateur, donc utilisez votre token JavaScript pour chaque requête dans ce guide. Le token normal renvoie la coquille non rendue et vos sélecteurs reviendront vides.

Prérequis

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

JavaScript et Node.js de base. Vous devez être à l'aise pour écrire et exécuter un script Node et installer des paquets avec npm. Si vous débutez avec Node, notre guide pour construire un scraper web avec Node.js couvre les bases que ce tutoriel suppose.

Node.js 16 ou version ultérieure. Confirmez votre version avec node --version. Si vous ne l'avez pas, installez-le depuis le site Node.js ou via un gestionnaire de version comme nvm.

Un compte Crawlbase et un token. Inscrivez-vous, ouvrez votre tableau de bord, et copiez votre token JavaScript. Le niveau gratuit vous donne 1 000 requêtes sans carte, et vous ne payez que pour les requêtes réussies. Traitez le token comme un mot de passe : il authentifie vos requêtes, donc ne le mettez pas dans le contrôle de version.

Configurer le projet

Créez un dossier de projet, initialisez-le et installez les deux bibliothèques dont le scraper a besoin.

bash
node --version

mkdir forbes-scraper && cd forbes-scraper
npm init -y

npm install crawlbase cheerio

Deux dépendances font le travail : crawlbase est le client Node officiel pour la Crawling API, et cheerio analyse le HTML renvoyé avec une API de style jQuery vous permettant d'extraire des champs individuels par sélecteur CSS. Créez un fichier nommé scraper.js dans ce dossier et ajoutez le code des étapes ci-dessous.

Étape 1 : Récupérer la page de liste rendue

Commencez par obtenir la page finalisée. Importez la classe CrawlingAPI, initialisez-la avec votre token JavaScript, et demandez une URL de section Forbes publique. Forbes charge les cartes au défilement, donc passer ajax_wait et un court page_wait indique à l'API d'attendre le contenu dynamique avant de renvoyer. Vérifier le code de statut avant d'analyser permet de détecter les échecs rapidement plutôt que silencieusement.

javascript
const { CrawlingAPI } = require('crawlbase');

const api = new CrawlingAPI({ token: 'YOUR_CRAWLBASE_TOKEN' });

const forbesPageURL = 'https://www.forbes.com/technology/';

api
  .get(forbesPageURL, { ajax_wait: 'true', page_wait: '5000' })
  .then((response) => {
    if (response.statusCode === 200) {
      console.log(response.body.slice(0, 500));
    }
  })
  .catch((error) => console.error('API request error:', error));

Exécutez le script avec node scraper.js et vous devriez voir le vrai balisage de liste Forbes en haut du corps, pas une coquille allégée. Cela confirme que le rendu fonctionne avant d'écrire un seul sélecteur. La Crawling API utilise le token JavaScript que vous avez fourni pour rendre la page dans un vrai navigateur, et ajax_wait avec page_wait donnent le temps aux cartes à chargement différé de se remplir, de sorte que les liens d'articles sont présents dans le HTML que vous récupérez.

Crawlbase Crawling API

Cette première requête vient de renvoyer une page de section Forbes entièrement rendue sans navigateur headless ni proxy de votre côté. La Crawling API exécute la page dans un vrai navigateur, effectue une rotation des IP résidentielles côté serveur, et gère les limites de débit et les challenges que Forbes lance aux scrapers, vous offrant ainsi le HTML finalisé en un seul appel. Pointez-la sur une section publique avec le niveau gratuit d'abord, puis ajoutez votre parseur.

Étape 2 : Analyser chaque carte d'article avec Cheerio

Avec le HTML rendu en main, chargez-le dans Cheerio et parcourez les cartes d'articles. Forbes liste chaque article dans un élément de flux, et le lien du titre est le même type d'ancre a.color-link que le site utilise dans ses listes, donc vous sélectionnez chaque lien d'article, puis lisez le titre, la signature d'auteur, la date de publication et la section depuis l'intérieur ou autour de chaque carte. Lire chaque champ de manière défensive évite qu'une valeur manquante ne fasse planter l'exécution.

javascript
const cheerio = require('cheerio');

function parseForbesData(html, section) {
  const $ = cheerio.load(html);
  const articles = [];
  const seen = new Set();

  // One record per article card in the listing stream
  $('article.stream-item').each((_, element) => {
    const card = $(element);

    const titleLink = card.find('a.color-link').first();
    const headline = titleLink.text().trim();
    let link = titleLink.attr('href') || '';
    if (link && link.startsWith('/')) {
      link = new URL(link, 'https://www.forbes.com').href;
    }

    const author = card.find('.stream-item__author').text().trim();
    const date = card.find('.stream-item__date').text().trim();

    // Skip empty cards and de-duplicate repeated links
    if (!headline || !link || seen.has(link)) return;
    seen.add(link);

    articles.push({
      headline,
      author: author || 'N/A',
      date: date || 'N/A',
      section: section || 'N/A',
      link,
    });
  });

  return articles;
}

Quelques détails rendent ce code fidèle à la page. Chaque article réside dans un article.stream-item, et le lien du titre est l'ancre a.color-link à l'intérieur, la même classe de lien que les listes Forbes historiques utilisent. L'auteur vient de .stream-item__author et la date de publication de .stream-item__date. Le lien est lu depuis l'href de l'ancre et résolu en URL absolue pour fonctionner hors de la page, et un Set supprime les liens en double qu'un flux de liste répète souvent. La section est passée par l'appelant, puisque vous savez déjà quelle URL de canal vous avez demandée.

Les sélecteurs dérivent

Forbes publie régulièrement des modifications de balisage, donc les noms de classes ci-dessus sont un modèle de départ, pas un contrat. Quand un champ revient vide, réinspectez la page 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, pas le signe que quelque chose est cassé.

Étape 3 : Assembler le script complet avec export JSON et CSV

Maintenant, reliez la récupération et l'analyse en un seul script fonctionnel, puis écrivez les enregistrements sur disque en JSON et CSV.

javascript
const fs = require('fs');
const { CrawlingAPI } = require('crawlbase');
const cheerio = require('cheerio');

const api = new CrawlingAPI({ token: 'YOUR_CRAWLBASE_TOKEN' });

async function crawl(pageUrl) {
  const response = await api.get(pageUrl, { ajax_wait: 'true', page_wait: '5000' });
  if (response.statusCode === 200) return response.body;
  console.error(`Request failed: ${response.statusCode}`);
  return null;
}

function toCsv(rows) {
  const headers = ['headline', 'author', 'date', 'section', 'link'];
  const escape = (value) => `"${String(value).replace(/"/g, '""')}"`;
  const lines = [headers.join(',')];
  for (const row of rows) {
    lines.push(headers.map((h) => escape(row[h])).join(','));
  }
  return lines.join('\n');
}

async function main() {
  const section = 'technology';
  const url = `https://www.forbes.com/${section}/`;
  const html = await crawl(url);
  if (!html) return;

  const articles = parseForbesData(html, section);
  fs.writeFileSync('forbes.json', JSON.stringify(articles, null, 2));
  fs.writeFileSync('forbes.csv', toCsv(articles));
  console.log(`Saved ${articles.length} articles to JSON and CSV`);
}

main();

Collez la fonction parseForbesData de l'étape 2 dans le même fichier pour que main puisse l'appeler. Exécutez-le avec node scraper.js et vous obtenez deux fichiers : forbes.json avec les enregistrements structurés complets et forbes.csv prêt à ouvrir dans un tableur. L'helper toCsv encadre chaque champ de guillemets et double les guillemets intégrés, ce qui compte ici car les titres contiennent fréquemment des virgules.

À quoi ressemble la sortie

Le fichier JSON contient un objet par article, chacun avec le titre, la signature de l'auteur, la date de publication, la section et le lien. Les valeurs ci-dessous sont des exemples illustratifs, pas des données Forbes en direct.

json
[
  {
    "headline": "How AI Startups Are Reshaping Enterprise Software",
    "author": "Jane Doe",
    "date": "Jun 10, 2026",
    "section": "technology",
    "link": "https://www.forbes.com/sites/example/2026/06/10/ai-startups-enterprise/"
  },
  {
    "headline": "The Quiet Rise Of Mid-Market Cloud Providers",
    "author": "John Smith",
    "date": "Jun 9, 2026",
    "section": "technology",
    "link": "https://www.forbes.com/sites/example/2026/06/09/mid-market-cloud/"
  }
]

Le CSV reflète les mêmes lignes avec une ligne d'en-tête, vous pouvez donc l'ouvrir directement dans Excel, Google Sheets ou tout pipeline de données qui lit des fichiers délimités.

csv
headline,author,date,section,link
"How AI Startups Are Reshaping Enterprise Software","Jane Doe","Jun 10, 2026","technology","https://www.forbes.com/sites/example/2026/06/10/ai-startups-enterprise/"
"The Quiet Rise Of Mid-Market Cloud Providers","John Smith","Jun 9, 2026","technology","https://www.forbes.com/sites/example/2026/06/09/mid-market-cloud/"

Gérer la pagination

Une seule page de section est une démonstration ; un vrai travail extrait plus que le premier lot de titres. Les pages de section Forbes exposent des résultats supplémentaires via un paramètre de requête de page, vous pouvez donc boucler sur les numéros de page, récupérer chacun via la Crawling API, l'analyser avec la même fonction, et vous arrêter quand une page ne renvoie aucun nouvel article. Comme toutes les pages de liste partagent la même structure de carte, le parseur que vous avez déjà écrit fonctionne sur toutes sans modifications.

javascript
async function scrapeAllPages(section, maxPages) {
  const all = [];
  const seen = new Set();

  for (let page = 1; page <= maxPages; page++) {
    const url = `https://www.forbes.com/${section}/?page=${page}`;
    const html = await crawl(url);
    if (!html) break;

    const batch = parseForbesData(html, section)
      .filter((a) => !seen.has(a.link));
    if (batch.length === 0) break; // no new articles

    batch.forEach((a) => seen.add(a.link));
    all.push(...batch);
    console.log(`Page ${page}: ${batch.length} new articles`);

    // Pace requests so you stay under the rate limit
    await new Promise((r) => setTimeout(r, 2000));
  }

  return all;
}

Le paramètre exact de pagination peut changer, donc vérifiez quelques vrais liens "page suivante" dans votre navigateur et faites correspondre le pattern. Les bonnes habitudes s'appliquent à toute cible : bouclez jusqu'à épuisement des résultats, dédupliquez par lien pour ne pas stocker le même titre deux fois, et mettez un court délai entre les requêtes pour ne pas marteler le site. Pour en savoir plus sur les pages rendues et à forte intensité JavaScript comme celle-ci, consultez notre guide pour crawler les sites web JavaScript.

Rester non bloqué

Même avec le rendu géré, Forbes surveille le trafic ressemblant à des scrapers. Quelques habitudes maintiennent une exécution saine, et elles s'appliquent à toute cible commerciale difficile.

  • Cadencez vos requêtes. Introduisez un délai entre les récupérations de pages plutôt que de marteler la section dans une boucle serrée. Espacer les requêtes est le facteur le plus important pour rester sous les limites de débit de Forbes.
  • Misez sur la rotation. Un pool d'IP résidentielles répartit les requêtes sur de nombreuses adresses d'utilisateurs réels, de sorte qu'aucune ne déclenche une limite ou un challenge. La Crawling API s'en charge pour vous ; si vous construisez votre propre stack, c'est la partie à bien faire.
  • Lisez les codes de statut. Une exécution qui commence à renvoyer des challenges ou des réponses non-200 vous indique que le débit ou le niveau d'IP actuels ne sont plus suffisants. Traitez cela comme un signal pour ralentir, pas comme du bruit à ignorer.

Pour le guide complet, consultez comment scraper des sites web sans se faire bloquer. Si vous souhaitez des métadonnées similaires de titres d'autres sources d'actualités, le même pattern fetch-then-parse s'applique directement au scraping de Google News.

Est-il légal de scraper Forbes ?

La question de savoir si le scraping de Forbes est autorisé dépend des conditions d'utilisation de Forbes, de votre juridiction et de ce que vous faites avec les données. Les conditions de Forbes restreignent l'accès automatisé et la réutilisation de son contenu, donc le scraping peut aller à l'encontre de ces conditions quelle que soit la prudence de vos outils. Aucun code ici ne change cela ; il fait simplement fonctionner la partie technique. Lisez les Conditions d'utilisation de Forbes et son robots.txt, respectez les attentes de débit qu'ils énoncent, et traitez les deux comme la limite de ce que vous collectez. Ne scrapez jamais rien derrière une connexion ou un paywall : les articles payants et réservés aux abonnés sont hors limites, et contourner les contrôles d'accès pour les atteindre est une ligne à part et plus grave à franchir.

Ce guide est délibérément limité aux métadonnées de liste publiques : le titre, la signature de l'auteur, le lien d'article public, la date de publication et la section que tout le monde peut voir sur une page de section sans compte. Il ne collecte pas le corps de l'article, les photos, les graphiques ou les vidéos. Les articles et médias Forbes sont des œuvres protégées par des droits d'auteur, et copier ou republier le texte intégral ou les médias constitue une violation du droit d'auteur, pas du scraping équitable. Collecter des titres et des liens pour indexer, surveiller ou pointer vers l'original est très différent de reproduire le contenu lui-même. Conservez les données stockées comme des faits et des pointeurs, attribuez et liez vers la source, et ne présentez pas le travail éditorial de Forbes comme le vôtre ou derrière votre propre mur.

Si votre projet nécessite plus que des titres et des liens publics, la bonne voie est sanctionnée, pas un scraper plus astucieux. Forbes propose des flux officiels et des arrangements de licence et de syndication pour réutiliser son contenu avec des conditions claires, des règles d'attribution et des droits commerciaux. Ce sont les outils appropriés quand vous avez besoin de texte intégral, de grands volumes, d'une structure garantie ou du droit de republier. En cas de doute sur l'autorisation d'une utilisation, obtenez une licence ou un accord de données plutôt que de supposer que le silence vaut consentement.

Récapitulatif

Points clés

  • Forbes rend les listes côté client et protège son trafic. Une simple requête renvoie une coquille vide ou un challenge, vous devez donc rendre la page derrière une IP de confiance, en utilisant le token JavaScript, avant de l'analyser.
  • La Crawling API fait les deux en un seul appel. Elle rend la page dans un vrai navigateur, effectue une rotation des IP résidentielles, et attend les cartes à chargement différé, renvoyant le HTML finalisé que vous analysez avec Cheerio.
  • Cheerio extrait les métadonnées. Sélectionnez chaque article.stream-item, lisez le titre et le lien depuis l'ancre a.color-link, plus l'auteur, la date et la section, et attendez-vous à ce que les noms de classes dérivent.
  • Paginez et exportez. Bouclez sur les pages de sections Forbes jusqu'à ce qu'aucun nouvel article n'apparaisse, dédupliquez par lien, cadencez vos requêtes et écrivez les enregistrements structurés en JSON et CSV.
  • Restez sur les métadonnées publiques et respectez les droits d'auteur. Collectez uniquement les titres, liens, signatures et dates, jamais le corps de l'article ni les médias, respectez les CGU, robots.txt et le paywall, et préférez les flux officiels de Forbes ou une licence pour la réutilisation.

Foire aux questions

Puis-je extraire des données de Forbes ?

Vous pouvez collecter des métadonnées de liste publiques comme les titres, liens d'articles, signatures et dates de publication, tant que vous respectez les Conditions d'utilisation et le robots.txt de Forbes et ne copiez pas le texte complet des articles ni les médias. Limitez la collecte aux pages publiques, jamais derrière une connexion ou un paywall, et préférez les flux officiels de Forbes ou un accord de licence quand vous devez réutiliser le contenu. Ce guide reste dans ces limites en ne stockant que les titres et les liens, pas les corps d'articles.

Pourquoi une simple requête renvoie-t-elle des données incomplètes de Forbes ?

Parce que Forbes charge une grande partie de son contenu de liste côté client avec JavaScript et challenge le trafic automatisé. Une requête HTTP brute depuis une IP de datacenter renvoie généralement une coquille vide ou une page de blocage plutôt que les cartes d'articles. Pour obtenir une page complète, vous devez la rendre derrière une IP de confiance, ce que gère la Crawling API quand vous utilisez le token JavaScript avec ajax_wait et page_wait.

Pourquoi utiliser la Crawling API plutôt que Puppeteer ?

Un navigateur headless comme Puppeteer peut rendre Forbes, mais vous devez alors exécuter et maintenir la flotte de navigateurs, attacher un pool de proxies résidentiels rotatifs, et gérer les challenges vous-même, ce qui représente l'essentiel du travail et devient lent à grande échelle. La Crawling API regroupe le rendu, la rotation d'IP et la gestion des challenges en un seul appel, vous envoyez une URL et récupérez le HTML finalisé. Vous consacrez votre temps à l'analyse, pas à maintenir l'infrastructure.

Mes sélecteurs retournent des valeurs vides. Qu'est-ce qui a changé ?

Presque certainement le balisage de Forbes. Les noms de classes comme stream-item__author et les ancres de titres a.color-link changent avec le temps, donc les sélecteurs qui fonctionnaient le mois dernier peuvent casser. Réinspectez une page en direct dans les outils de développement de votre navigateur, mettez à jour les sélecteurs dans parseForbesData, et vous êtes de nouveau opérationnel. La maintenance périodique des sélecteurs est normale pour tout scraper en production.

Puis-je scraper le texte complet des articles Forbes ?

Non, et vous ne devriez pas. Les articles et médias Forbes sont protégés par des droits d'auteur, donc copier et republier le texte du corps, les images ou les vidéos constitue une violation du droit d'auteur plutôt que du scraping équitable. Ce guide ne collecte que le titre public, le lien, la signature, la date et la section pour que vous puissiez indexer et pointer vers l'original. Si vous avez besoin du contenu intégral, utilisez les flux officiels de Forbes ou un accord de licence et de syndication, qui accordent les droits de réutilisation qu'un scraper ne peut jamais offrir.

Vais-je être bloqué lors du scraping de Forbes ?

Vous pouvez l'être, si vous envoyez trop de requêtes trop vite depuis une seule adresse. La Crawling API réduit ce risque en effectuant une rotation des IP résidentielles et en gérant les challenges pour vous, mais vous devriez quand même cadencer vos requêtes, ajouter des délais entre les pages, et surveiller les codes de statut pour pouvoir reculer quand des challenges apparaissent. Ces habitudes comptent pour toute cible commerciale difficile.

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