Yahoo Finance est l'une des sources publiques de données de marché les plus utilisées. Chaque page de cotation affiche les mêmes chiffres phares qu'un trader surveille toute la journée : le prix actuel pour un symbole boursier, la variation absolue depuis la clôture précédente, et la variation en pourcentage. Pour quiconque suit une liste de surveillance ou consigne les prix de fin de journée, copier cela à la main pour plus d'un ou deux symboles devient vite fastidieux.

Ce guide est un complément court au tutoriel plus complet sur le scraping de Yahoo Finance. Vous y construisez un petit script Python exécutable qui prend un symbole boursier et renvoie son prix actuel, la variation et la variation en pourcentage, limité aux données de marché publiques visibles par tous sans compte. Pour le guide multi-champs complet, lisez le post associé ; celui-ci est le script rapide de récupération de prix.

Ce que vous allez construire

Une seule fonction Python que vous appelez avec un symbole boursier. Elle récupère la page de cotation Yahoo Finance rendue via l'API Crawling, analyse trois champs et les renvoie sous forme de petit dictionnaire. L'exemple utilisé est Apple (AAPL) :

  • Price le prix coté actuel pour le symbole.
  • Change la variation absolue de prix depuis la clôture précédente.
  • Change percent cette même variation exprimée en pourcentage.

Pourquoi une requête simple échoue sur Yahoo Finance

Pointez un client HTTP brut sur une URL de cotation Yahoo Finance et vous obtenez généralement le statut 200 et une page qui ne contient pas les chiffres en temps réel que vous vouliez. Deux facteurs vous desservent. Premièrement, la page de cotation rend son bloc de prix dans le navigateur via JavaScript, et le chiffre se met à jour en temps réel, donc le HTML initial est une coque qui ne se remplit qu'après l'exécution des scripts de la page. Analysez cette première réponse et le champ de prix revient vide. Deuxièmement, les sites financiers surveillent le trafic automatisé : les IPs de datacenters et les schémas de requêtes qui ne ressemblent pas à un vrai navigateur sont limités en débit ou mis au défi avant d'atteindre le contenu rendu.

Un récupérateur de prix fonctionnel nécessite donc deux choses en une seule requête : un navigateur qui rend le bloc de cotation, et une IP que le site lit comme un visiteur réel. Vous pouvez construire cela avec un navigateur sans interface graphique plus des proxies résidentiels rotatifs, mais maintenir ce stack en bon état représente l'essentiel de l'effort. L'API Crawling intègre les deux en un seul appel : envoyez-lui l'URL avec un token JavaScript, elle rend la page derrière une IP de confiance et renvoie le HTML finalisé à analyser.

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. Yahoo Finance remplit son bloc de prix côté client, vous avez donc besoin du token JS ici. Le token normal renvoie la même coque qu'une récupération simple, avec les chiffres en temps réel manquants.

Prérequis

Trois éléments doivent être en place avant d'écrire du code.

Python de base. Vous devez être à l'aise pour exécuter un script et installer des paquets avec pip. Si vous débutez avec l'analyse syntaxique, le guide BeautifulSoup se marie bien avec ce tutoriel.

Python 3.8 ou version ultérieure. Confirmez votre version avec python --version. Si vous ne l'avez pas, installez-le depuis python.org et assurez-vous que Python est dans votre PATH.

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. Crawlbase inclut jusqu'à 20 000 requêtes gratuites pour commencer, largement suffisant pour ce script. Traitez le token comme un mot de passe et gardez-le hors du contrôle de version.

Configurer le projet

Créez un environnement virtuel pour que les dépendances du projet restent isolées, puis installez les deux bibliothèques dont le script a besoin.

bash
python --version

python -m venv yahoo_env
source yahoo_env/bin/activate

pip install crawlbase beautifulsoup4

Sous Windows, activez l'environnement avec yahoo_env\Scripts\activate à la place de la ligne source. Deux dépendances font le travail : crawlbase est le client officiel pour l'API Crawling, et beautifulsoup4 analyse le HTML renvoyé pour extraire les champs par attribut. Le module json est inclus dans la bibliothèque standard.

Étape 1 : Récupérer une page de cotation rendue

Commencez par obtenir une page finalisée. Importez la classe CrawlingAPI, initialisez-la avec votre token JS et requêtez une URL de cotation. La page de cotation est construite à partir d'un symbole, donc le modèle est https://finance.yahoo.com/quote/<SYMBOL>. Passez ajax_wait et page_wait pour que le bloc de prix soit chargé avant la capture de la page, et vérifiez le cb_status (legacy pc_status) de Crawlbase avant d'analyser pour que les échecs restent visibles.

python
from crawlbase import CrawlingAPI

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

OPTIONS = {
    "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/122.0",
    "ajax_wait": "true",
    "page_wait": 4000,
}

def crawl(symbol):
    quote_url = f"https://finance.yahoo.com/quote/{symbol}"
    response = api.get(quote_url, OPTIONS)
    if response["headers"]["cb_status"] == "200":
        return response["body"].decode("utf-8")
    print(f"Request failed: {response['headers']['cb_status']}")
    return None

if __name__ == "__main__":
    html = crawl("AAPL")
    print(html[:500] if html else "No HTML returned")

Les options d'attente sont importantes pour une cible rendue côté client. ajax_wait attend que le contenu asynchrone se charge, et page_wait maintient un délai fixe en millisecondes après le chargement pour que le bloc de prix soit rempli avant la capture. Quatre secondes est un bon point de départ ; augmentez si le prix revient vide. Exécutez le script avec python yahoo_price.py et vous devriez voir de vraies balises Yahoo Finance, pas la coque qu'une requête simple renverrait, ce qui confirme que le rendu fonctionne avant d'écrire le moindre sélecteur.

Crawlbase Yahoo Finance Scraper

La page de cotation nécessite un bloc de prix rendu derrière une IP de confiance, en un seul appel, ce que configurent exactement les options ajax_wait et page_wait ci-dessus. L'API Crawling prend un token JS, exécute la page dans un vrai navigateur, effectue une rotation parmi des IPs résidentielles côté serveur et vous remet le HTML finalisé, vous évitant de gérer vous-même une flotte sans interface graphique et un pool de proxies. Pointez-la d'abord sur une page de cotation publique avec le niveau gratuit.

Étape 2 : Analyser le prix, la variation et la variation en pourcentage

Yahoo Finance étiquette ses chiffres de cotation principaux avec des attributs data-field stables sur le bloc de prix, ce qui les rend fiables à cibler : le prix se trouve sur regularMarketPrice, la variation absolue sur regularMarketChange, et le pourcentage sur regularMarketChangePercent. Chargez le HTML rendu dans BeautifulSoup et lisez chacun. Chaque lookup est protégé pour qu'un champ manquant renvoie None plutôt que de faire planter le script.

python
from bs4 import BeautifulSoup

def field(soup, name):
    el = soup.select_one(f'[data-field="{name}"]')
    return el.get_text(strip=True) if el else None

def parse_quote(html, symbol):
    soup = BeautifulSoup(html, "html.parser")
    return {
        "symbol": symbol,
        "price": field(soup, "regularMarketPrice"),
        "change": field(soup, "regularMarketChange"),
        "change_percent": field(soup, "regularMarketChangePercent"),
    }

L'assistant field interroge un élément par son attribut data-field et renvoie le texte nettoyé, ou None si l'élément est absent, de sorte qu'un symbole dont la page omet une valeur ne brise pas l'exécution. parse_quote regroupe les trois chiffres et le symbole dans un dictionnaire. Lire les champs par attributs étiquetés est plus robuste que de se fier aux noms de classes CSS générés par Yahoo.

Les sélecteurs dérivent

La mise en page et les noms de classes de Yahoo Finance changent au fil du temps, et les attributs data-field peuvent aussi bouger. Traitez les sélecteurs ici comme un modèle de départ, pas comme un contrat. Si un champ revient None, ouvrez la page de cotation en direct dans les outils de développement de votre navigateur, trouvez l'élément contenant le chiffre et mettez à jour le sélecteur.

Étape 3 : Assembler le script complet

Reliez maintenant les deux parties en un script exécutable. Il récupère la page de cotation rendue, analyse les trois champs, les affiche et écrit l'enregistrement dans un fichier JSON pour pouvoir le transmettre facilement en aval.

python
import json
from crawlbase import CrawlingAPI
from bs4 import BeautifulSoup

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

OPTIONS = {
    "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/122.0",
    "ajax_wait": "true",
    "page_wait": 4000,
}

def crawl(symbol):
    quote_url = f"https://finance.yahoo.com/quote/{symbol}"
    response = api.get(quote_url, OPTIONS)
    if response["headers"]["cb_status"] == "200":
        return response["body"].decode("utf-8")
    print(f"Request failed: {response['headers']['cb_status']}")
    return None

def field(soup, name):
    el = soup.select_one(f'[data-field="{name}"]')
    return el.get_text(strip=True) if el else None

def parse_quote(html, symbol):
    soup = BeautifulSoup(html, "html.parser")
    return {
        "symbol": symbol,
        "price": field(soup, "regularMarketPrice"),
        "change": field(soup, "regularMarketChange"),
        "change_percent": field(soup, "regularMarketChangePercent"),
    }

def get_stock_price(symbol):
    html = crawl(symbol)
    if not html:
        return None
    return parse_quote(html, symbol)

def main():
    quote = get_stock_price("AAPL")
    if not quote:
        print("Could not fetch quote")
        return
    print(json.dumps(quote, indent=2))
    with open("quote.json", "w") as f:
        json.dump(quote, f, indent=2)

if __name__ == "__main__":
    main()

La fonction get_stock_price est celle que vous appelez : passez-lui un symbole boursier et elle renvoie le dictionnaire, ou None si la récupération échoue. main l'exécute pour AAPL, affiche le résultat et le sauvegarde dans quote.json.

À quoi ressemble la sortie

Exécutez le script et vous obtenez un enregistrement structuré propre, prêt pour une liste de surveillance, un notebook ou une base de données. Les chiffres ci-dessous sont illustratifs ; votre exécution renvoie les valeurs en direct.

json
{
  "symbol": "AAPL",
  "price": "212.44",
  "change": "+1.86",
  "change_percent": "(+0.88%)"
}

Les prochaines étapes sont modestes à partir d'ici : bouclez sur une liste de surveillance, écrivez les enregistrements en CSV ou planifiez le script pour consigner une ligne par symbole à la clôture chaque jour. Pour la présentation multi-champs plus complète, y compris les données historiques, consultez le guide scraper Yahoo Finance, et pour l'approche rendu-plus-IP-de-confiance sur d'autres cibles fortement basées sur JavaScript, voyez scraper des pages JavaScript avec Python.

Rester débloqué

Même avec le rendu géré, un site financier surveille le trafic ressemblant à du scraping. Trois habitudes maintiennent une exécution sur une liste de surveillance plus longue en bonne santé : cadencez vos requêtes avec une courte pause entre les symboles pour qu'une boucle serrée ne vous fasse pas limiter ; misez sur la rotation, un pool d'IPs résidentielles répartit les requêtes sur de nombreuses adresses pour qu'aucune seule ne déclenche une limite de débit (l'API Crawling s'en charge pour vous) ; et lisez les codes de statut, en traitant une exécution qui commence à renvoyer des valeurs cb_status non-200 comme un signal pour reculer. Pour le guide pratique complet, consultez comment scraper des sites sans être bloqué.

Est-il légal de scraper Yahoo Finance ?

La légalité du scraping de Yahoo Finance dépend des conditions d'utilisation de Yahoo, de votre juridiction et de ce que vous faites des données. Les conditions de Yahoo restreignent l'accès automatisé et la collecte en masse, un scraper peut donc les enfreindre quel que soit le soin de vos outils. Lisez les Conditions d'utilisation de Yahoo et le fichier robots.txt du site, respectez toutes les limites de débit, et traitez les deux comme la limite de ce que vous collectez. Cantonnez-vous aux données de marché publiques : les cotations, les prix, la variation du jour et la variation en pourcentage sont des chiffres factuels visibles par tous sans compte, ce qui est le périmètre pour lequel ce script est construit. Ne récupérez rien derrière une connexion ou un paywall, ne collectez pas de données de compte personnelles et ne republiez pas de contenu éditorial protégé par droits d'auteur. Lorsqu'un projet implique des données personnelles, des règles de confidentialité comme le RGPD et le CCPA s'appliquent ; une récupération de prix de cotation simple comme celle-ci ne le fait pas.

Pour un usage en production, préférez un flux de données de marché officiel plutôt que de scraper un site grand public. Une grande partie de ce que Yahoo Finance affiche est sous licence de fournisseurs de données de marché et de bourses avec leurs propres conditions de redistribution, donc extraire un chiffre de la page ne vous accorde pas le droit de le redistribuer. Si vous construisez un produit ou avez besoin de cotations à l'échelle, octroyez une licence pour une API de données de marché officielle : c'est la bonne voie pour un usage commercial ou en masse, et elle vous donne des données que vous êtes réellement autorisé à redistribuer.

Récapitulatif

Points clés

  • La page de cotation est rendue côté client. Une requête simple renvoie une coque avec le prix en direct manquant, vous devez donc rendre la page avant de l'analyser.
  • Vous avez besoin du rendu et d'une IP de confiance ensemble. L'API Crawling avec un token JS fait les deux en un seul appel ; ajax_wait et page_wait contrôlent combien de temps elle attend pour le bloc de prix.
  • Ciblez les attributs stables. Lisez regularMarketPrice, regularMarketChange et regularMarketChangePercent par leurs attributs data-field plutôt que les noms de classes générés par Yahoo.
  • Gardez-le petit et bouclable. Une seule fonction get_stock_price(symbol) renvoie un dictionnaire ; boulez sur une liste de surveillance et cadencez les requêtes pour suivre plusieurs symboles.
  • Restez sur les données de marché publiques. Respectez les CGU et le robots.txt de Yahoo, évitez les connexions et les données personnelles, et utilisez une API de données de marché officielle pour la production ou la redistribution.

Foire aux questions

Pourquoi une requête simple renvoie-t-elle une page sans le prix en direct ?

Parce que Yahoo Finance rend son bloc de cotation côté client avec JavaScript, et le prix se met à jour en temps réel. Le HTML initial est une coque qui ne se remplit qu'après l'exécution des scripts de la page, donc une requête HTTP brute renvoie le statut 200 avec le champ de prix vide. Pour obtenir le chiffre, vous devez d'abord rendre la page, ce que gère le token JS de l'API Crawling.

Ai-je besoin du token normal ou du token JS pour Yahoo Finance ?

Le token JS. Le token normal récupère le HTML statique, qui sur une page de cotation est la même coque qu'une récupération simple renvoie. Le token JS rend la page dans un vrai navigateur avant de restituer le HTML, de sorte que le prix, la variation et la variation en pourcentage sont présents quand BeautifulSoup les analyse.

Comment récupérer les prix pour plus d'un symbole boursier ?

Mettez vos symboles dans une liste et appelez get_stock_price pour chacun, en collectant les dictionnaires renvoyés. Ajoutez un court time.sleep entre les requêtes pour cadencer l'exécution, et ajoutez chaque enregistrement à une liste que vous pouvez ensuite écrire en JSON ou CSV.

Mon champ de prix revient comme None. Qu'est-ce qui a changé ?

Généralement l'une de deux choses. Soit la page n'avait pas fini de se rendre au moment de la capture, auquel cas augmentez page_wait d'une ou deux secondes, soit Yahoo a déplacé le balisage et l'attribut data-field ne correspond plus. Ouvrez la page de cotation en direct dans les outils de développement de votre navigateur, trouvez l'élément contenant le prix et mettez à jour le sélecteur. Une maintenance périodique des sélecteurs est normale pour tout scraper.

Puis-je obtenir des prix historiques avec ce script ?

Ce script est limité à la cotation actuelle : prix, variation et variation en pourcentage. Les données historiques se trouvent sur une vue Yahoo Finance différente avec sa propre mise en page, elles nécessitent donc des sélecteurs différents. Le guide plus complet scraper Yahoo Finance couvre plus du panneau de cotation et est le bon point de départ pour des champs supplémentaires.

Puis-je utiliser commercialement des données Yahoo Finance scrapées ?

Traitez cela comme une question juridique, pas technique. Une grande partie des données de Yahoo Finance est sous licence de fournisseurs de données de marché et de bourses avec leurs propres conditions de redistribution, et les propres Conditions d'utilisation de Yahoo restreignent la réutilisation automatisée, donc un usage commercial ou en masse nécessite généralement une autorisation. Pour un produit ou un usage à grande échelle, octroyez une licence pour une API de données de marché officielle et consultez un juriste avant de construire sur ces données.

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