Bloomberg est l'une des plateformes d'information financière et de marchés les plus influentes du web ouvert. Ses pages de rubriques et de sujets publient un flux constant de titres sur la technologie, les marchés, l'économie et la politique, chacun avec un lien, un horodatage de publication et la rubrique à laquelle il appartient. Les analystes suivent ce qui fait bouger un marché, les chercheurs cartographient les tendances de couverture dans le temps, et les équipes produit surveillent quelles histoires apparaissent à quels bureaux. Tout ce signal se trouve dans la mise en page publique d'une page de rubrique, avant même d'ouvrir un article.
Ce guide vous montre comment extraire des données de Bloomberg avec JavaScript et Node.js en utilisant Cheerio. Vous construisez un scraper simple et fonctionnel qui récupère une page de rubrique Bloomberg publique via la Crawling API, analyse le titre, le lien d'article, l'horodatage de publication et la rubrique pour chaque histoire sur la page, et exporte le résultat en JSON et CSV. L'ensemble du tutoriel se limite aux métadonnées de titres et de liens publics. Il ne touche pas au texte complet des articles, et la section sur la légalité vers la fin n'est pas du remplissage, car le contenu éditorial de Bloomberg est protégé par le droit d'auteur. Lisez-la avant de cibler un volume réel.
Ce que vous allez construire
Un script Node.js qui prend une URL de rubrique Bloomberg publique, récupère le HTML rendu via la Crawling API et extrait un enregistrement structuré pour chaque lien d'article sur la page de listing. Nous utilisons la rubrique technologie comme exemple et collectons ces champs publics de listing par article :
- Titre le titre de l'article affiché sur la fiche de listing.
- Lien l'URL vers l'article individuel sur bloomberg.com.
-
Publié l'horodatage de publication de l'élément
timede la fiche, en date ISO. - Rubrique la section ou le sujet sous lequel l'article est classé, par exemple "Technology".
Notez ce qui est délibérément absent : le corps de l'article, le résumé et les médias. Ce scraper collecte uniquement des liens et des métadonnées, jamais le texte protégé par le droit d'auteur qui se trouve derrière chaque titre.
Pourquoi une requête ordinaire échoue sur Bloomberg
Si vous demandez une URL de rubrique Bloomberg avec un client HTTP brut, vous obtenez rarement un listing utilisable en retour. Deux facteurs jouent contre vous. Premièrement, Bloomberg construit ses pages de rubriques dans le navigateur avec JavaScript, de sorte que le HTML initial est une coquille presque vide jusqu'à ce que les scripts de la page s'exécutent et que les fiches d'articles se peuplent. Deuxièmement, Bloomberg signale le trafic automatisé de manière agressive : les adresses IP de datacenter et les schémas de requêtes qui ne ressemblent pas à un vrai navigateur sont mis au défi, limités en débit ou bloqués avant même d'atteindre les titres affichés.
Un scraper Bloomberg fonctionnel a donc besoin de deux choses en une seule requête : un navigateur qui affiche réellement la page, et une adresse IP que la plateforme considère comme un vrai visiteur. Vous pouvez assembler cela vous-même avec un navigateur sans interface graphique et un pool de proxies résidentiels rotatifs, mais assembler et maintenir ces composants représente l'essentiel du travail. La Crawling API combine les deux en un seul appel : vous lui envoyez l'URL, elle affiche la page depuis une adresse IP fiable et retourne le HTML final à analyser avec Cheerio.
La Crawling API vous donne deux tokens : un normal et un JavaScript. Bloomberg a besoin que la page soit affichée dans un vrai navigateur, utilisez donc votre token JavaScript pour chaque requête dans ce guide. Le token normal retourne la coquille non affichée 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 beaucoup de temps.
JavaScript et Node.js de base. Vous devez être à l'aise pour écrire et exécuter un script Node, travailler avec le DOM en principe et installer des paquets avec npm. Si vous êtes nouveau sur Node, la documentation officielle et n'importe quel cours pour débutants vous amènera au niveau que ce tutoriel suppose. Pour un tutoriel plus complet, notre guide sur la construction d'un scraper web avec Node.js couvre les bases.
Node.js 16 ou une version ultérieure. Vérifiez votre version avec node --version. Si vous ne l'avez pas, installez-le depuis le site Node.js ou via un gestionnaire de versions comme nvm.
Un compte Crawlbase et un token. Inscrivez-vous, ouvrez votre tableau de bord et copiez votre token JavaScript depuis la page de documentation du compte. Le niveau gratuit vous donne jusqu'à 20 000 requêtes sans carte, et vous ne payez que les requêtes réussies. Traitez le token comme un mot de passe : il authentifie vos requêtes, donc gardez-le hors du 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.
node --version mkdir bloomberg-scraper && cd bloomberg-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 retourné avec une API de style jQuery pour que vous puissiez 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 rubrique rendue
Commencez par obtenir la page finale. Importez la classe CrawlingAPI, initialisez-la avec votre token JavaScript et demandez une URL de rubrique Bloomberg publique. L'ancien tutoriel utilisait la rubrique technologie, nous faisons de même ici. Vérifier le code de statut avant d'analyser rend les échecs visibles plutôt que silencieux.
const { CrawlingAPI } = require('crawlbase'); const api = new CrawlingAPI({ token: 'YOUR_CRAWLBASE_TOKEN' }); const bloombergPageURL = 'https://www.bloomberg.com/technology'; api .get(bloombergPageURL) .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 du vrai balisage de rubrique Bloomberg en haut du corps, pas une coquille simplifié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 afficher la page dans un vrai navigateur, de sorte que les fiches d'articles sont présentes dans le HTML retourné.
Cette première requête vient de retourner une page Bloomberg Technology entièrement rendue sans navigateur sans interface graphique ni proxy de votre côté. La Crawling API exécute la page dans un vrai navigateur, fait tourner les adresses IP résidentielles côté serveur et gère les défis que Bloomberg lance aux scrapers, vous obtenez donc le HTML final depuis un seul appel. Pointez-la vers une page de rubrique publique sur le niveau gratuit en premier, puis ajoutez votre parseur.
Étape 2 : Analyser chaque titre avec Cheerio
Avec le HTML rendu en main, chargez-le dans Cheerio et parcourez les liens d'articles. Sur une page de rubrique Bloomberg, chaque article est accessible via une ancre dont le href pointe vers un chemin /news/articles/, et le titre de la rubrique se trouve dans un élément d'eyebrow au-dessus du listing. L'ancien tutoriel lisait la rubrique depuis .Eyebrow_sectionTitle-Wew2fboZsjA- a et la date de publication depuis l'élément time de la page via son attribut datetime, nous réutilisons donc ces éléments et collectons un enregistrement par lien d'article. Lire chaque champ de manière défensive empêche qu'une valeur manquante fasse planter l'exécution.
const cheerio = require('cheerio'); function parseDataFromHTML(html) { const $ = cheerio.load(html); const seen = new Set(); const results = { section: '', articles: [], }; // Section / topic title from the eyebrow element results.section = $('.Eyebrow_sectionTitle-Wew2fboZsjA- a').first().text().trim() || 'Technology'; // One record per public article link on the listing $('a[href*="/news/articles/"]').each((_, element) => { const anchor = $(element); const headline = anchor.text().replace(/\n\s+/g, ' ').trim(); let link = anchor.attr('href'); if (!headline || !link) return; if (link.startsWith('/')) { link = new URL(link, 'https://www.bloomberg.com').href; } if (seen.has(link)) return; // skip duplicate links seen.add(link); // Published timestamp from a nearby time element, if present const timeAttr = anchor .closest('article') .find('time') .attr('datetime'); const published = timeAttr ? timeAttr.split('T')[0] : ''; results.articles.push({ headline, link, published: published || 'Date not available', section: results.section, }); }); return results; }
Quelques détails rendent cela fidèle à la page. Le titre de la rubrique vient de l'ancre .Eyebrow_sectionTitle-Wew2fboZsjA-, exactement comme l'ancien parseur le lisait. Chaque article est trouvé via une ancre pointant vers /news/articles/, et nous résolvons les chemins relatifs en URLs bloomberg.com absolues pour que le lien fonctionne en dehors de la page. Un Set supprime les liens dupliqués, car le même article apparaît souvent dans plus d'un module sur une page de rubrique. La date de publication est lue depuis l'attribut datetime d'un élément time proche et tronquée à sa date ISO avec split('T')[0], la même approche que l'original utilisait pour l'horodatage d'article.
Les noms de classes générés de Bloomberg (le suffixe Eyebrow_* ci-dessus) changent sans préavis, et les pages de rubriques réorganisent souvent leurs modules. Traitez les sélecteurs comme un modèle de départ, pas comme un contrat. Lorsque le titre ou la rubrique revient vide, réinspectez la page en direct dans les outils de développement de votre navigateur et mettez à jour le sélecteur. Une 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 script complet avec export JSON et CSV
Connectez maintenant la récupération et l'analyse dans un seul script exécutable, puis écrivez les enregistrements sur disque en JSON et CSV. L'ancien guide sauvegardait le HTML brut dans un fichier et l'analysait en second passage ; un seul script réduit les éléments mobiles et fait le même travail de bout en bout.
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); if (response.statusCode === 200) return response.body; console.error(`Request failed: ${response.statusCode}`); return null; } function toCsv(rows) { const headers = ['headline', 'link', 'published', 'section']; 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 url = 'https://www.bloomberg.com/technology'; const html = await crawl(url); if (!html) return; const data = parseDataFromHTML(html); fs.writeFileSync('bloomberg.json', JSON.stringify(data, null, 2)); fs.writeFileSync('bloomberg.csv', toCsv(data.articles)); console.log(`Saved ${data.articles.length} headlines to JSON and CSV`); } main();
Collez la fonction parseDataFromHTML 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 : bloomberg.json avec les enregistrements structurés complets et bloomberg.csv prêt à ouvrir dans un tableur. L'assistant toCsv met chaque champ entre guillemets et double les guillemets incorporés, ce qui est important ici car les titres contiennent fréquemment des virgules.
À quoi ressemble la sortie
Le fichier JSON contient la rubrique plus un objet par titre, chacun avec le texte du titre, le lien vers l'article, la date de publication et la rubrique d'où il provient. Les titres et liens affichés ci-dessous sont des exemples illustratifs, pas des données réelles.
{ "section": "Technology", "articles": [ { "headline": "Chipmaker Delays Second Plant as Subsidies Stay in Flux", "link": "https://www.bloomberg.com/news/articles/example-chip-delay", "published": "2024-01-18", "section": "Technology" }, { "headline": "Cloud Provider Posts Record Quarter on AI Demand", "link": "https://www.bloomberg.com/news/articles/example-cloud-quarter", "published": "2024-01-17", "section": "Technology" } ] }
Le CSV reflète les mêmes lignes de titres avec une ligne d'en-tête, il s'ouvre donc directement dans Excel, Google Sheets ou tout pipeline de données qui lit des fichiers délimités.
headline,link,published,section "Chipmaker Delays Second Plant as Subsidies Stay in Flux","https://www.bloomberg.com/news/articles/example-chip-delay","2024-01-18","Technology" "Cloud Provider Posts Record Quarter on AI Demand","https://www.bloomberg.com/news/articles/example-cloud-quarter","2024-01-17","Technology"
Passer à grande échelle sur plusieurs rubriques et pages
Une page de rubrique est une démo ; un vrai travail suit plusieurs bureaux dans le temps. Bloomberg expose un ensemble d'URLs de rubriques publiques (technologie, marchés, économie, politique, et plus encore), vous pouvez donc boucler dessus, récupérer chacune via la Crawling API, l'analyser avec la même fonction et fusionner les résultats. Comme chaque page de rubrique partage la même structure de listing, le parseur que vous avez déjà écrit fonctionne sur toutes sans modification.
async function scrapeSections(sections) { const all = []; for (const path of sections) { const url = `https://www.bloomberg.com/${path}`; const html = await crawl(url); if (!html) continue; const { articles } = parseDataFromHTML(html); all.push(...articles); console.log(`${path}: ${articles.length} headlines`); // Pace requests so you stay under the rate limit await new Promise((r) => setTimeout(r, 2000)); } return all; } // scrapeSections(['technology', 'markets', 'economics']);
Pour les exécutions importantes ou répétées, le même schéma récupération-puis-analyse se transpose directement au Crawler asynchrone, qui met en file d'attente de nombreuses URLs et vous renvoie les résultats au lieu de bloquer sur chaque requête. Pour plus d'informations sur les pages rendues et lourdes en JavaScript comme celles-ci, consultez notre guide sur le crawling des sites JavaScript, et pour le contexte plus large, nos notes sur le scraping financier à grande échelle.
Rester non bloqué
Même avec le rendu géré, Bloomberg surveille le trafic à l'allure d'un scraper. Quelques habitudes maintiennent la santé d'une exécution, et elles s'appliquent à toute cible commerciale difficile.
- Cadencez vos requêtes. Introduisez un délai entre les récupérations de rubriques plutôt que de marteler le site dans une boucle serrée. Espacer les requêtes est le facteur unique le plus important pour rester sous les limites de débit de Bloomberg.
- Misez sur la rotation. Un pool d'adresses IP résidentielles répartit les requêtes sur de nombreuses adresses d'utilisateurs réels afin qu'aucune ne déclenche une limite ou un défi. La Crawling API gère cela pour vous ; si vous construisez votre propre stack, c'est la partie à bien faire.
- Lisez les codes de statut. Une exécution qui commence à retourner des défis ou des réponses non-200 vous indique que le débit actuel ou le niveau d'adresses IP n'est plus suffisant. Traitez cela comme un signal pour ralentir, pas du bruit à ignorer.
Pour le guide plus complet, voir comment scraper des sites web sans être bloqué.
Est-il légal de scraper Bloomberg ?
La question de savoir si le scraping de Bloomberg est autorisé dépend des conditions d'utilisation de Bloomberg, de votre juridiction et de ce que vous faites des données. Les conditions de Bloomberg restreignent l'accès automatisé et la réutilisation de son contenu, de sorte que le scraping peut aller à l'encontre de ces conditions quelle que soit la prudence de vos outils. Aucun code ici ne change cela ; il rend seulement la partie technique fonctionnelle. Lisez les Conditions d'utilisation de Bloomberg et son robots.txt, respectez toutes les attentes de débit qu'ils énoncent, et traitez les deux comme la limite de ce que vous collectez. De manière critique, ne scrapez jamais quoi que ce soit derrière une connexion ou un mur payant : une large part de la couverture de Bloomberg est restreinte, et contourner cette restriction constitue à la fois une violation des conditions et, dans de nombreux endroits, une violation légale.
Ce guide est délibérément limité aux métadonnées publiques de titres et de liens : le texte du titre, l'URL de l'article, l'horodatage de publication et la rubrique sous laquelle une histoire est classée, tous visibles sur une page de rubrique sans connexion. C'est très différent de l'article lui-même. Les reportages, analyses et médias de Bloomberg sont des œuvres protégées par le droit d'auteur. Ne scrapez pas, ne stockez pas et ne redistribuez pas le texte complet des articles, les résumés ou les images, et n'assemblez pas une archive dérivée qui reproduit la production éditoriale de Bloomberg. Collecter un titre et un lien pour qu'un lecteur puisse cliquer vers l'original sur bloomberg.com est une utilisation normale orientée lien ; copier le corps derrière ce lien ne l'est pas. Si un champ que vous touchez implique des personnes identifiables, le droit à la vie privée comme le RGPD et le CCPA s'applique en plus du droit d'auteur, ce qui est une autre raison de rester sur les métadonnées factuelles de listing.
Si votre projet a besoin de plus que des titres publics, la bonne voie est une voie sanctionnée, pas un scraper plus sophistiqué. Bloomberg propose des produits de données officiels et sous licence, dont son Terminal et ses flux de données d'entreprise, qui livrent des données de marché et du contenu selon des termes commerciaux clairs, des règles d'attribution et des droits de réutilisation. Ce sont les bons outils lorsque vous avez besoin de contenu complet, d'une structure garantie, d'un volume important ou du droit de redistribuer. Lorsque vous n'êtes pas sûr qu'une utilisation est autorisée, obtenez une licence ou un accord de données plutôt que de supposer que le silence vaut consentement. Pour une vue d'ensemble plus large des options sanctionnées, voir notre aperçu des meilleurs fournisseurs de données financières.
Points clés
- Bloomberg affiche les listings côté client et bloque fortement. Une requête ordinaire retourne une coquille vide ou un défi, vous devez donc afficher la page depuis une adresse IP fiable, en utilisant le token JavaScript, avant de l'analyser.
- La Crawling API fait les deux en un seul appel. Elle affiche la page dans un vrai navigateur, fait tourner les adresses IP résidentielles et gère les défis, retournant le HTML final que vous analysez avec Cheerio.
-
Cheerio extrait les champs publics. Trouvez chaque ancre
/news/articles/, lisez le titre, le lien, l'horodatage de publication et la rubrique, dédupliquez par lien, et prévoyez que les noms de classes générés dérivent. - Passez à grande échelle et exportez. Boucllez sur les URLs de rubriques publiques de Bloomberg, cadencez vos requêtes et écrivez les enregistrements structurés en JSON et CSV ; utilisez le Crawler asynchrone quand le volume augmente.
- Titres et liens uniquement. Le texte des articles et les médias de Bloomberg sont protégés par le droit d'auteur, ne scrapez donc jamais ni ne redistribuez le corps, ne touchez jamais à quoi que ce soit derrière une connexion ou un mur payant, respectez les CGU et le robots.txt, et préférez les flux officiels ou sous licence de Bloomberg pour un usage en production.
Foire aux questions
Quelles données puis-je collecter de Bloomberg avec ce scraper ?
Ce guide collecte uniquement les métadonnées publiques de listing : le titre de l'article, le lien vers l'article, l'horodatage de publication et la rubrique sous laquelle l'article est classé, tous visibles sur une page de rubrique Bloomberg sans connexion. Il ne collecte pas le corps de l'article, les résumés ou les médias, car ce contenu est protégé par le droit d'auteur. La sortie est un ensemble de liens et de métadonnées que vous pouvez utiliser pour surveiller la couverture et cliquer vers l'article original.
Pourquoi une requête ordinaire retourne-t-elle des données incomplètes de Bloomberg ?
Parce que Bloomberg construit ses pages de rubriques côté client avec JavaScript et défie le trafic automatisé. Une requête HTTP brute depuis une adresse IP de datacenter retourne généralement une coquille vide ou une page de blocage plutôt que les fiches d'articles. Pour obtenir une page complète, vous devez l'afficher depuis une adresse IP fiable, ce que la Crawling API gère pour vous lorsque vous utilisez le token JavaScript.
Puis-je scraper les articles Bloomberg qui sont derrière un mur payant ?
Non. Ce guide est strict sur ce point : ne scrapez jamais quoi que ce soit derrière une connexion ou un mur payant. Le contenu restreint est limité par les conditions de Bloomberg et contourner la restriction peut entraîner une exposition légale. Restez sur les titres et liens publics que tout le monde peut voir sur une page de rubrique, et utilisez les produits officiels ou sous licence de Bloomberg si vous avez besoin du contenu complet et restreint.
Mes sélecteurs retournent des valeurs vides. Qu'est-ce qui a changé ?
C'est presque certainement le balisage de Bloomberg. Les noms de classes générés comme Eyebrow_sectionTitle-Wew2fboZsjA- changent sans préavis, et les pages de rubriques réorganisent souvent leurs modules, de sorte que 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 parseDataFromHTML, et vous êtes de retour en affaire. Une maintenance périodique des sélecteurs est normale pour tout scraper en production.
Puis-je construire un scraper Bloomberg dans un autre langage que JavaScript ?
Oui. Ce guide utilise JavaScript avec Cheerio, mais la même approche fonctionne dans n'importe quel langage. La Crawling API dispose de bibliothèques et de SDK pour plusieurs langages, vous récupérez donc le HTML rendu de la même façon et l'analysez avec le parseur HTML que votre stack préfère, comme BeautifulSoup en Python. Les sélecteurs et les champs restent les mêmes ; seule la syntaxe d'analyse change.
Bloomberg propose-t-il un flux de données officiel ?
Oui. Bloomberg propose des produits de données officiels et sous licence, dont son Terminal et ses flux de données d'entreprise, qui livrent des données de marché et du contenu selon des termes commerciaux clairs et des droits de réutilisation. Si vous avez besoin de contenu complet, d'un volume important, d'une structure garantie ou du droit de redistribuer, cette voie sanctionnée est la bonne. Ce scraper de métadonnées publiques est mieux adapté pour la recherche, la surveillance et la collecte de liens où un accord officiel n'est pas justifié.
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.
