Yahoo Finance ist eine der meistgenutzten öffentlichen Quellen für Marktdaten. Jede Kursseite enthält dieselben Kennzahlen, die ein Trader den ganzen Tag beobachtet: den aktuellen Preis für ein Ticker-Symbol, die absolute Änderung seit dem vorherigen Schlusskurs und die Änderung als Prozentsatz. Wer eine Watchlist verfolgt oder Schlusskurse protokolliert, wird das manuelle Kopieren für mehr als ein oder zwei Symbole schnell leid.
Dies ist ein kurzer Begleiter zur umfassenderen Anleitung Yahoo Finance scrapen. Hier bauen Sie ein kleines, lauffähiges Python-Skript, das ein Ticker-Symbol entgegennimmt und den aktuellen Preis, die Änderung und die prozentuale Änderung zurückgibt, beschränkt auf öffentliche Marktdaten, die jeder ohne Konto einsehen kann. Für den vollständigen Mehrdaten-Leitfaden lesen Sie den Schwesterartikel; dieser ist das schnelle Preis-Abruf-Skript.
Was Sie bauen werden
Eine einzelne Python-Funktion, die Sie mit einem Ticker-Symbol aufrufen. Sie ruft die gerenderte Yahoo Finance-Kursseite über die Crawling API ab, parst drei Felder und gibt diese als kleines Wörterbuch zurück. Als laufendes Beispiel dient Apple (AAPL):
- Preis der aktuelle Kurspreis des Symbols.
- Änderung die absolute Preisänderung seit dem vorherigen Schlusskurs.
- Prozentuale Änderung dieselbe Änderung als Prozentsatz ausgedrückt.
Warum eine einfache Anfrage auf Yahoo Finance scheitert
Richten Sie einen einfachen HTTP-Client auf eine Yahoo Finance-Kurs-URL und Sie erhalten üblicherweise Status 200 mit einer Seite, die die gewünschten Live-Zahlen nicht enthält. Zwei Faktoren spielen dagegen. Erstens rendert die Kursseite ihren Preisblock im Browser über JavaScript, und die Zahl aktualisiert sich in Echtzeit, sodass das ursprüngliche HTML eine Hülle ist, die sich erst füllt, nachdem die Seitenskripte ausgeführt wurden. Parst man diese erste Antwort, kommt das Preisfeld leer zurück. Zweitens beobachten Finanzseiten automatisierten Datenverkehr: Datacenter-IPs und Anfragemuster, die nicht wie ein echter Browser aussehen, werden gedrosselt oder herausgefordert, bevor sie den gerenderten Inhalt erreichen.
Ein funktionierender Preis-Abrufer benötigt daher zwei Dinge in einer Anfrage: einen Browser, der den Kursblock rendert, und eine IP, die die Site wie einen echten Besucher liest. Man kann das mit einem Headless-Browser und rotierenden Residential-Proxies aufbauen, aber diesen Stack gesund zu halten ist der größte Aufwand. Die Crawling API fasst beides in einem einzigen Aufruf zusammen: Senden Sie ihr die URL mit einem JavaScript-Token, sie rendert die Seite hinter einer vertrauenswürdigen IP und gibt fertiges HTML zum Parsen zurück.
Crawlbase bietet zwei Token-Typen. Das normale Token ruft statisches HTML ab; das JavaScript-Token (JS-Token) rendert die Seite zunächst in einem echten Browser. Yahoo Finance befüllt seinen Preisblock clientseitig, daher benötigen Sie hier das JS-Token. Das normale Token gibt dieselbe Hülle wie eine einfache Anfrage zurück, ohne die Live-Zahlen.
Voraussetzungen
Vor dem Schreiben von Code müssen drei Dinge vorhanden sein.
Grundlegende Python-Kenntnisse. Sie sollten mit dem Ausführen von Skripten und dem Installieren von Paketen mit pip vertraut sein. Wer neu auf der Parsing-Seite ist, findet im BeautifulSoup-Leitfaden einen guten Begleiter zu diesem Tutorial.
Python 3.8 oder neuer. Prüfen Sie Ihre Version mit python --version. Falls nicht vorhanden, installieren Sie Python von python.org und stellen Sie sicher, dass Python im PATH liegt.
Ein Crawlbase-Konto und JS-Token. Registrieren Sie sich, öffnen Sie Ihr Dashboard und kopieren Sie Ihr JavaScript-Token (JS-Token) von der Konto-Dokumentationsseite. Crawlbase enthält bis zu 20.000 kostenlose Anfragen zum Einstieg, mehr als genug für dieses Skript. Behandeln Sie das Token wie ein Passwort und halten Sie es aus der Versionskontrolle heraus.
Projekt einrichten
Erstellen Sie eine virtuelle Umgebung, damit Projektabhängigkeiten isoliert bleiben, und installieren Sie dann die zwei benötigten Bibliotheken.
python --version python -m venv yahoo_env source yahoo_env/bin/activate pip install crawlbase beautifulsoup4
Unter Windows aktivieren Sie die Umgebung mit yahoo_env\Scripts\activate statt der source-Zeile. Zwei Abhängigkeiten erledigen die Arbeit: crawlbase ist der offizielle Client für die Crawling API, und beautifulsoup4 parst das zurückgegebene HTML, damit Felder per Attribut herausgezogen werden können. Das Modul json ist Teil der Standardbibliothek.
Schritt 1: Eine gerenderte Kursseite abrufen
Beginnen Sie damit, eine fertig gerenderte Seite zu holen. Importieren Sie die Klasse CrawlingAPI, initialisieren Sie sie mit Ihrem JS-Token und fordern Sie eine Kurs-URL an. Die Kursseite wird aus einem Symbol aufgebaut, also lautet das Muster https://finance.yahoo.com/quote/<SYMBOL>. Übergeben Sie ajax_wait und page_wait, damit der Preisblock geladen ist, bevor die Seite erfasst wird, und prüfen Sie den Crawlbase-cb_status (legacy pc_status) vor dem Parsen, damit Fehler laut statt still bleiben.
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")
Die Warteoptionen sind bei einem clientseitig gerenderten Ziel wichtig. ajax_wait wartet auf das Laden asynchroner Inhalte, und page_wait hält nach dem Laden für eine feste Anzahl von Millisekunden inne, damit der Preisblock befüllt ist, bevor er erfasst wird. Vier Sekunden sind ein vernünftiger Ausgangspunkt; erhöhen Sie den Wert, wenn der Preis leer zurückkommt. Führen Sie das Skript mit python yahoo_price.py aus und Sie sollten echtes Yahoo Finance-Markup sehen, nicht die Hülle einer einfachen Anfrage, was bestätigt, dass das Rendering funktioniert, bevor Sie einen einzigen Selektor schreiben.
Die Kursseite benötigt einen gerenderten Preisblock hinter einer vertrauenswürdigen IP in einem einzigen Aufruf, was genau durch die oben eingestellten Optionen ajax_wait und page_wait erreicht wird. Die Crawling API nimmt ein JS-Token, führt die Seite in einem echten Browser aus, rotiert server-seitig durch Residential-IPs und übergibt fertiges HTML, sodass Sie weder eine Headless-Flotte noch einen Proxy-Pool selbst betreiben müssen. Testen Sie sie zunächst mit einer öffentlichen Kursseite im kostenlosen Tarif.
Schritt 2: Preis, Änderung und prozentuale Änderung parsen
Yahoo Finance versieht seine Kurs-Kennzahlen mit stabilen data-field-Attributen im Preisblock, was sie zuverlässig ansprechbar macht: Der Preis liegt auf regularMarketPrice, die absolute Änderung auf regularMarketChange und der Prozentsatz auf regularMarketChangePercent. Laden Sie das gerenderte HTML in BeautifulSoup und lesen Sie jeden Wert. Jede Abfrage ist abgesichert, sodass ein fehlendes Feld None zurückgibt, statt das Skript zum Absturz zu bringen.
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"), }
Der Helfer field fragt ein Element über sein data-field-Attribut ab und gibt den bereinigten Text zurück, oder None, wenn das Element fehlt, sodass ein Symbol ohne Wert den Lauf nicht unterbricht. parse_quote bündelt die drei Zahlen plus das Symbol in ein Wörterbuch. Das Lesen von attribut-getaggten Feldern ist robuster als das Verlassen auf Yahoos generierte CSS-Klassennamen.
Das Layout und die Klassennamen von Yahoo Finance ändern sich im Laufe der Zeit, und auch die data-field-Attribute können sich verschieben. Behandeln Sie die Selektoren hier als Ausgangspunkt, nicht als Vertrag. Wenn ein Feld None zurückgibt, öffnen Sie die Live-Kursseite in den Entwicklertools Ihres Browsers, suchen Sie das die Zahl enthaltende Element und aktualisieren Sie den Selektor.
Schritt 3: Das vollständige Skript zusammensetzen
Verknüpfen Sie nun die zwei Teile zu einem lauffähigen Skript. Es ruft die gerenderte Kursseite ab, parst die drei Felder, gibt sie aus und schreibt den Datensatz in eine JSON-Datei, damit das Ergebnis leicht weitergegeben werden kann.
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()
Die Funktion get_stock_price ist die, die Sie aufrufen: Übergeben Sie ihr ein Ticker-Symbol, und sie gibt das Wörterbuch zurück, oder None, wenn der Abruf fehlschlägt. main führt sie für AAPL aus, gibt das Ergebnis aus und speichert es in quote.json.
Wie die Ausgabe aussieht
Führen Sie das Skript aus und Sie erhalten einen sauberen strukturierten Datensatz, bereit für eine Watchlist, ein Notebook oder eine Datenbank. Die nachstehenden Zahlen sind illustrativ; Ihr Lauf gibt die Live-Werte zurück.
{ "symbol": "AAPL", "price": "212.44", "change": "+1.86", "change_percent": "(+0.88%)" }
Von hier aus sind die nächsten Schritte klein: über eine Watchlist iterieren, die Datensätze als CSV schreiben oder das Skript so planen, dass es täglich bei Börsenschluss eine Zeile pro Symbol protokolliert. Für den vollständigen Mehrdaten-Leitfaden einschließlich historischer Daten lesen Sie die Anleitung Yahoo Finance scrapen, und für den Render-plus-vertrauenswürdige-IP-Ansatz auf anderen JavaScript-lastigen Zielen lesen Sie JavaScript-Seiten mit Python scrapen.
Entsperrt bleiben
Selbst wenn das Rendering abgedeckt ist, beobachtet eine Finanzsite Scraper-typischen Datenverkehr. Drei Gewohnheiten halten einen längeren Watchlist-Lauf gesund: Anfragen mit einem kurzen Schlaf zwischen Symbolen dosieren, damit ein enger Takt Sie nicht drosselt; auf Rotation setzen, da ein Pool aus Residential-IPs Anfragen auf viele Adressen verteilt, sodass keine einzelne ein Rate-Limit auslöst (die Crawling API übernimmt das für Sie); und Status-Codes lesen, wobei ein Lauf, der beginnt, Nicht-200-cb_status-Werte zurückzugeben, als Signal zum Zurückziehen behandelt wird. Das übergeordnete Playbook finden Sie unter wie man Webseiten scrapt, ohne gesperrt zu werden.
Ist das Scrapen von Yahoo Finance legal?
Ob das Scrapen von Yahoo Finance erlaubt ist, hängt von Yahoos Nutzungsbedingungen, Ihrer Jurisdiktion und dem Verwendungszweck der Daten ab. Yahoos Bedingungen beschränken den automatisierten Zugang und die Massensammlung, sodass ein Scraper unabhängig von der Sorgfalt des Toolings gegen diese verstoßen kann. Lesen Sie Yahoos Nutzungsbedingungen und die robots.txt der Site, halten Sie alle Rate-Erwartungen ein und behandeln Sie beide als Grenze dessen, was Sie sammeln. Beschränken Sie sich auf öffentliche Marktdaten: Kurse, Preise, die tägliche Änderung und die prozentuale Änderung sind sachliche Zahlen, die jeder ohne Konto einsehen kann, was den Rahmen dieses Skripts bildet. Nichts hinter einem Login oder einer Bezahlschranke abrufen, keine persönlichen Kontodaten sammeln und keine urheberrechtlich geschützten redaktionellen Inhalte weiterverbreiten. Wo ein Projekt personenbezogene Daten betrifft, gelten Datenschutzregeln wie DSGVO und CCPA; ein einfacher Kurspreisabruf wie dieser fällt nicht darunter.
Für den Produktionseinsatz bevorzugen Sie einen offiziellen Marktdaten-Feed gegenüber dem Scrapen einer Verbrauchersite. Vieles, was Yahoo Finance anzeigt, ist von Marktdatenanbietern und Börsen mit eigenen Weitergabebedingungen lizenziert, sodass das Abrufen einer Zahl von der Seite Ihnen nicht das Recht verleiht, sie weiterzuverbreiten. Wenn Sie ein Produkt bauen oder Kurse in großem Umfang benötigen, lizenzieren Sie eine offizielle Marktdaten-API: Das ist der richtige Weg für kommerzielle oder Massennutzung, und er gibt Ihnen Daten, die Sie tatsächlich weitergeben dürfen.
Wichtigste Erkenntnisse
- Die Kursseite wird clientseitig gerendert. Eine einfache Anfrage gibt eine Hülle ohne den Live-Preis zurück, also muss die Seite vor dem Parsen gerendert werden.
-
Rendering und eine vertrauenswürdige IP werden zusammen benötigt. Die Crawling API mit einem JS-Token übernimmt beides in einem Aufruf;
ajax_waitundpage_waitsteuern die Wartezeit für den Preisblock. -
Die stabilen Attribute ansprechen.
regularMarketPrice,regularMarketChangeundregularMarketChangePercentüber ihredata-field-Attribute lesen statt über Yahoos generierte Klassennamen. -
Klein und iterierbar halten. Eine Funktion
get_stock_price(symbol)gibt ein Wörterbuch zurück; über eine Watchlist iterieren und die Anfragen dosieren, um mehrere Symbole zu verfolgen. - Bei öffentlichen Marktdaten bleiben. Yahoos Nutzungsbedingungen und robots.txt einhalten, Logins und personenbezogene Daten meiden und für Produktion oder Weitergabe eine offizielle Marktdaten-API verwenden.
Häufig gestellte Fragen
Warum gibt eine einfache Anfrage eine Seite ohne den Live-Preis zurück?
Weil Yahoo Finance seinen Kursblock clientseitig mit JavaScript rendert und der Preis in Echtzeit aktualisiert wird. Das ursprüngliche HTML ist eine Hülle, die sich erst füllt, nachdem die Seitenskripte ausgeführt wurden, sodass eine einfache HTTP-Anfrage Status 200 mit leerem Preisfeld zurückgibt. Um die Zahl zu erhalten, müssen Sie die Seite zunächst rendern, was das JS-Token der Crawling API übernimmt.
Benötige ich das normale Token oder das JS-Token für Yahoo Finance?
Das JS-Token. Das normale Token ruft statisches HTML ab, das auf einer Kursseite dieselbe Hülle wie eine einfache Anfrage ist. Das JS-Token rendert die Seite in einem echten Browser, bevor es das HTML zurückgibt, sodass Preis, Änderung und prozentuale Änderung vorhanden sind, wenn BeautifulSoup sie parst.
Wie rufe ich Preise für mehr als ein Ticker-Symbol ab?
Geben Sie Ihre Symbole in eine Liste und rufen Sie get_stock_price für jedes auf, wobei Sie die zurückgegebenen Wörterbücher sammeln. Fügen Sie ein kurzes time.sleep zwischen Anfragen ein, um den Lauf zu dosieren, und hängen Sie jeden Datensatz an eine Liste an, die Sie am Ende als JSON oder CSV ausgeben können.
Mein Preisfeld kommt als None zurück. Was hat sich geändert?
Meistens eines von zwei Dingen. Entweder hat die Seite das Rendering nicht abgeschlossen, als sie erfasst wurde, also erhöhen Sie page_wait um eine oder zwei Sekunden, oder Yahoo hat das Markup verschoben und das data-field-Attribut stimmt nicht mehr überein. Öffnen Sie die Live-Kursseite in den Entwicklertools Ihres Browsers, suchen Sie das den Preis enthaltende Element und aktualisieren Sie den Selektor. Regelmäßige Selektor-Wartung ist für jeden Scraper normal.
Kann ich mit diesem Skript historische Preise abrufen?
Dieses Skript ist auf den aktuellen Kurs beschränkt: Preis, Änderung und prozentuale Änderung. Historische Daten befinden sich auf einer anderen Yahoo Finance-Ansicht mit eigenem Layout, die unterschiedliche Selektoren erfordert. Die umfassendere Anleitung Yahoo Finance scrapen deckt mehr des Kurs-Panels ab und ist der richtige Ausgangspunkt für weitere Felder.
Darf ich gescrapete Yahoo Finance-Daten kommerziell nutzen?
Das ist eine rechtliche Frage, keine technische. Vieles von Yahoo Finances Daten ist von Marktdatenanbietern und Börsen mit eigenen Weitergabebedingungen lizenziert, und Yahoos eigene Nutzungsbedingungen beschränken die automatisierte Weiterverwendung, sodass kommerzielle oder massenhafte Nutzung generell einer Genehmigung bedarf. Für ein Produkt oder eine großangelegte Nutzung eine offizielle Marktdaten-API lizenzieren und vor dem Aufbau auf Basis der Daten rechtlichen Rat einholen.
Crawlen Sie jede Website im großen Maßstab, ohne gegen die Infrastruktur zu kämpfen.
Crawlbase übernimmt Proxys, Fingerprints und CAPTCHAs, damit Ihr Team Datenpipelines ausliefert, statt Crawl-Infrastruktur zu pflegen. 1.000 Anfragen kostenlos, keine Karte erforderlich.
