TL:DR: Sie werden lernen, wie Sie einen Scraper für Yahoo Finanzen zur Extraktion von Aktiendaten erstellen, um Finanzanalysen für den Handel und Investitionen durchzuführen.
In dieser Anleitung geht es um Folgendes:
- Warum sollten Sie Finanzdaten aus dem Internet scrapen?
- Bibliotheken und Tools zum Scrapen von Finanzdaten
- Scrapen von Aktiendaten aus Yahoo Finanzen mit Selenium
Warum sollten Sie Finanzdaten aus dem Internet scrapen?
Das Scrapen von Finanzdaten aus dem Internet bietet wertvolle Einblicke, die sich in verschiedenen Szenarien als nützlich erweisen:
- Automatisierter Handel: Mit gescrapten Echtzeit- oder historischen Marktdaten – z. B. Aktienkurse und -volumen – können Entwickler automatisierte Handelsstrategien entwickeln.
- Technische Analyse: Historische Marktdaten und Indikatoren sind für technische Analysten sehr wichtig. Sie ermöglichen es, Muster und Trends zu erkennen, die eine Hilfe für Investitionsentscheidungen sind.
- Finanzmodellierung: Forscher und Analysten können relevante Daten wie Finanzberichte und Wirtschaftsindikatoren erfassen, um komplexe Modelle für die Bewertung der Unternehmensleistung, Gewinnprognosen und die Beurteilung von Investitionsmöglichkeiten zu erstellen.
- Marktforschung: Finanzdaten liefern eine Vielzahl von Informationen über Aktien, Marktindizes und Rohstoffe. Die Analyse dieser Daten hilft Forschern, Markttrends, Stimmungen und die Branchenlage zu verstehen und auf der Grundlage dieser Daten fundierte Investitionsentscheidungen zu treffen.
Wenn es um die Beobachtung des Marktes geht, ist Yahoo Finanzen eine der beliebtesten Finanz-Websites. Sie bietet Anlegern und Händlern ein breites Spektrum an Informationen und Tools, wie Echtzeit- und historische Daten über Aktien, Anleihen, Investmentfonds, Rohstoffe, Währungen und Marktindizes. Darüber hinaus bietet sie Nachrichten, Finanzberichte, Schätzungen von Analysten, Diagramme und andere wertvolle Ressourcen.
Wenn Sie Yahoo Finanzen scrapen, können Sie auf eine Fülle von Informationen zugreifen, die Sie bei Ihren Finanzanalysen, Recherchen und Entscheidungsprozessen unterstützen.
Bibliotheken und Tools zum Scrapen von Finanzdaten
Python gilt dank seiner Syntax, Benutzerfreundlichkeit und der Vielzahl an Bibliotheken als eine der besten Sprachen für das Web Scraping. Lesen Sie unsere Anleitung zum Web Scraping in Python.
Um die geeigneten Scraping-Bibliotheken aus den vielen verfügbaren auszuwählen, erkunden Sie zunächst Yahoo Finanzen in Ihrem Browser. Sie werden feststellen, dass die meisten Daten auf der Website in Echtzeit aktualisiert werden oder sich nach einer Interaktion ändern. Das bedeutet, dass die Website stark auf AJAX basiert, weshalb die Daten dynamisch geladen und aktualisiert werden, ohne dass die Seite neu geladen werden muss. Mit anderen Worten: Sie benötigen ein Tool, das JavaScript ausführen kann.
Selenium macht es möglich, dynamische Websites in Python zu scrapen. Es rendert Websites in Webbrowsern und führt programmatisch Operationen auf ihnen aus, sogar wenn sie JavaScript zum Rendern oder Abrufen von Daten verwenden.
Dank Selenium können Sie die Ziel-Website in Python scrapen. Lernen Sie jetzt, wie das geht!
Scrapen von Aktiendaten aus Yahoo Finanzen mit Selenium
Folgen Sie dieser Schritt-für-Schritt-Anleitung und lernen Sie, wie Sie ein Python-Skript für das Web-Scraping von Yahoo Finanzen erstellen.
Schritt 1: Einrichten
Bevor Sie mit dem Scrapen von Finanzdaten beginnen, sollten Sie die folgenden Voraussetzungen erfüllen:
- Python 3+ muss auf Ihrem Rechner installiert sein: Laden Sie das Installationsprogramm herunter, doppelklicken Sie darauf und folgen Sie den Anweisungen des Installationsassistenten.
- Eine Python-IDE Ihrer Wahl: PyCharm Community Edition oder Visual Studio Code mit der Erweiterung für Python reicht aus.
Als Nächstes verwenden Sie die folgenden Befehle, um ein Python-Projekt mit einer virtuellen Umgebung einzurichten:
nmkdir yahoo-finance-scraperncd yahoo-finance-scrapernpython -m venv env
Sie initialisieren den Projektordner yahoo-finance-scraper
. Fügen Sie, so wie Sie unten sehen, die Datei scraper.py
darin ein:
print('Hello, World!')
Jetzt fügen Sie die Logik zum Scrapen von Yahoo Finanzen hinzu. Im Moment haben Sie ein Beispielskript, das nur „Hello, World!“ ausgibt.
Starten Sie es, um zu prüfen, ob es funktioniert mit:
python scraper.py
Ihr Gerät sollte Folgendes angezeigen:
Hello, World!
Super, jetzt haben Sie ein Python-Projekt für Ihren Finanz-Scraper! Jetzt müssen Sie nur noch die Abhängigkeiten des Projekts hinzufügen. Installieren Sie Selenium und Webdriver Manager mit dem folgenden Befehl:
pip install selenium webdriver-manager
Das kann eine Weile dauern, haben Sie also Geduld.
Webdriver Manager
ist nicht unbedingt erforderlich. Diese Bibliothek ist jedoch sehr empfehlenswert, da sie die Verwaltung von Web-Treibern in Selenium erheblich erleichtert. Mit Webdriver Manager müssen Sie den Webtreiber nicht manuell herunterladen, konfigurieren und importieren.
Aktualisieren Sie scraper.py
nfrom selenium import webdrivernfrom selenium.webdriver.chrome.service import Service as ChromeServicenfrom webdriver_manager.chrome import ChromeDriverManagernn# initialize a web driver instance to control a Chrome windowndriver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))nn# scraping logic...nn# close the browser and free up the resourcesndriver.quit()
Dieses Skript instanziiert einfach eine Instanz von ChromeWebDriver
. Sie werden es gleich für die Implementierung der Logik für die Datenextraktion verwenden.
Schritt 2: Bauen Sie eine Verbindung zur Ziel-Website auf.
So sieht die URL einer Seite mit Börseninformationen auf Yahoo Finanzen aus:
https://finance.yahoo.com/quote/AMZN
Wie Sie sehen, handelt es sich um eine dynamische URL, die sich entsprechend dem Tickersymbol ändert. Falls Sie mit dem Begriff nicht vertraut sind, es handelt sich dabei um eine Abkürzung, die zur eindeutigen Identifizierung von an der Börse gehandelten Aktien verwendet wird. „AMZN“ ist zum Beispiel das Tickersymbol der Aktie von Amazon.
Ändern wir das Skript so, dass es den Ticker aus einem Befehlszeilenargument liest.
nimport sysnn# if there are no CLI parametersnif len(sys.argv) u003c= 1:n print('Ticker symbol CLI argument missing!')n sys.exit(2)nn# read the ticker from the CLI argumentnticker_symbol = sys.argv[1]nn# build the URL of the target pagenurl = f'https://finance.yahoo.com/quote/{ticker_symbol}'
s
ys
ist eine Python-Standardbibliothek, die den Zugriff auf die Befehlszeilenargumente ermöglicht. Denken Sie daran, dass das Argument mit dem Index 0 der Name Ihres Skripts ist. Sie müssen das Argument also mit dem Index 1 ansteuern.
Nach dem Lesen des Tickers aus der CLI wird er in einem f-String
verwendet, um die Ziel-URL zu erzeugen, die gescrapt werden soll.
Nehmen wir zum Beispiel an, dass der Scraper mit dem Tesla-Ticker „TSLA“ gestartet werden soll:
python scraper.py TSLAn
Die URL
wird Folgendes enthalten:
https://finance.yahoo.com/quote/TSLA
Wenn Sie das Tickersymbol in der CLI vergessen, schlägt das Programm mit der nachfolgenden Fehlermeldung fehl:
Ticker symbol CLI argument missing!
Bevor Sie eine Seite in Selenium öffnen, sollten Sie die Größe des Fensters einstellen, um sicherzustellen, dass alle Elemente sichtbar sind:
driver.set_window_size(1920, 1080)
Sie können nun Selenium verwenden, um sich mit der Ziel-Website zu verbinden:
driver.get(url)
Die Funktion get()
weist den Browser an, die gewünschte Seite aufzurufen.
So sieht Ihr Skript zum Scrapen von Yahoo Finanzen bis jetzt aus:
nfrom selenium import webdrivernfrom selenium.webdriver.chrome.service import Service as ChromeServicenfrom webdriver_manager.chrome import ChromeDriverManagernimport sysnn# if there are no CLI parametersnif len(sys.argv) u003c= 1:n print('Ticker symbol CLI argument missing!')n sys.exit(2)nn# read the ticker from the CLI argumentnticker_symbol = sys.argv[1]nn# build the URL of the target pagenurl = f'https://finance.yahoo.com/quote/{ticker_symbol}'nn# initialize a web driver instance to control a Chrome windowndriver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))n# set up the window size of the controlled browserndriver.set_window_size(1920, 1080)n# visit the target pagendriver.get(url)nn# scraping logic...nn# close the browser and free up the resourcesndriver.quit()
Wenn Sie es starten, wird dieses Fenster für den Bruchteil einer Sekunde geöffnet, bevor es beendet wird:

Das Starten des Browsers mit der Benutzeroberfläche ist nützlich für die Fehlersuche, da Sie so überwachen können, was der Scraper auf der Website tut. Das erfordert aber auch eine Menge Ressourcen. Um das zu vermeiden, stellen Sie Chrome so ein, dass er im Headless-Modus läuft:
nfrom selenium.webdriver.chrome.options import Optionsn# ...nnoptions = Options()noptions.add_argument('u002du002dheadless=new')nndriver = webdriver.Chrome(n service=ChromeService(ChromeDriverManager().install()),n options=optionsn)
Der kontrollierte Browser wird nun im Hintergrund ohne Benutzeroberfläche gestartet.
Schritt 3: Untersuchen Sie die Ziel-Website
Wenn Sie eine effektive Strategie zur Datengewinnung entwickeln wollen, müssen Sie zunächst die Ziel-Website analysieren. Öffnen Sie Ihren Browser und besuchen Sie die Aktienseite vonYahoo.
Wenn Sie in Europa ansässig sind, werden Sie in einem Fenster zunächst gefragt, ob Sie die Cookies akzeptieren möchten:

Um das Fenster zu schließen und die gewünschte Seite weiter zu besuchen, klicken Sie auf „Alle akzeptieren“ oder „Alle ablehnen“. Klicken Sie mit der rechten Maustaste auf die erste Schaltfläche und wählen Sie die Option „Inspect“ (Untersuchen), um die DevTools Ihres Browsers zu öffnen:

Hier werden Sie feststellen, dass Sie die Schaltfläche mit dem folgenden CSS-Selektor auswählen können:
.consent-overlay .accept-all
Verwenden Sie diese ice-Zeilen, um mit dem Zustimmungsmodul in Selenium umzugehen:
ntry:n # wait up to 3 seconds for the consent modal to show upn consent_overlay = WebDriverWait(driver, 3).until(n EC.presence_of_element_located((By.CSS_SELECTOR, '.consent-overlay')))nn # click the u0022Accept allu0022 buttonn accept_all_button = consent_overlay.find_element(By.CSS_SELECTOR, '.accept-all')n accept_all_button.click()nexcept TimeoutException:n print('Cookie consent overlay missing')
WebDriverWait
ermöglicht es Ihnen, zu warten, bis eine erwartete Bedingung auf der Seite angezeigt wird. Wenn innerhalb der angegebenen Zeitspanne nichts passiert, wird eine TimeoutException
ausgegeben. Da die Cookie-Einblendung nur angezeigt wird, wenn Ihre IP-Adresse aus Europa stammt, können Sie die Ausnahme mit der Anweisung try-catch
behandeln. Auf diese Weise läuft das Skript auch dann weiter, wenn das Zustimmungsfenster nicht angezeigt wird.
Damit das Skript funktioniert, müssen Sie die folgenden Importe hinzufügen:
nfrom selenium.webdriver.support.ui import WebDriverWaitnfrom selenium.webdriver.support import expected_conditions as ECnfrom selenium.webdriver.common.by import Bynfrom selenium.common import TimeoutException
Untersuchen Sie nun die Ziel-Website in den DevTools und machen Sie sich mit ihrer DOM-Struktur vertraut.
Schritt 4: Extrahieren der Aktiendaten
Wie Sie im vorangegangenen Schritt festgestellt haben sollten, befinden sich einige der interessantesten Informationen in folgendem Abschnitt:

Untersuchen Sie das HTML-Preisindikator-Element:

Beachten Sie, dass CSS-Klassen für die Festlegung geeigneter Selektoren in Yahoo Finanzen nicht nützlich sind. Sie scheinen einer speziellen Syntax für ein Styling-Framework zu folgen. Konzentrieren Sie sich stattdessen auf die anderen HTML-Attribute. So können Sie zum Beispiel den Aktienkurs mit dem unten stehenden CSS-Selektor abrufen:
[data-symbol=u0022TSLAu0022][data-field=u0022regularMarketPriceu0022]
Extrahieren Sie auf ähnliche Weise alle Aktiendaten aus den Preisindikatoren mit:
nregular_market_price = drivern .find_element(By.CSS_SELECTOR, f'[data-symbol=u0022{ticker_symbol}u0022][data-field=u0022regularMarketPriceu0022]')n .textnregular_market_change = drivern .find_element(By.CSS_SELECTOR, f'[data-symbol=u0022{ticker_symbol}u0022][data-field=u0022regularMarketChangeu0022]')n .textnregular_market_change_percent = drivern .find_element(By.CSS_SELECTOR, f'[data-symbol=u0022{ticker_symbol}u0022][data-field=u0022regularMarketChangePercentu0022]')n .textn .replace('(', '').replace(')', '')n npost_market_price = drivern .find_element(By.CSS_SELECTOR, f'[data-symbol=u0022{ticker_symbol}u0022][data-field=u0022postMarketPriceu0022]')n .textnpost_market_change = drivern .find_element(By.CSS_SELECTOR, f'[data-symbol=u0022{ticker_symbol}u0022][data-field=u0022postMarketChangeu0022]')n .textnpost_market_change_percent = drivern .find_element(By.CSS_SELECTOR, f'[data-symbol=u0022{ticker_symbol}u0022][data-field=u0022postMarketChangePercentu0022]')n .textn .replace('(', '').replace(')', '')n
Nachdem Sie ein HTML-Element mit der spezifischen CSS-Selektorstrategie ausgewählt haben, können Sie den Inhalt mit dem Feld text
extrahieren. Da die Prozentfelder runde Klammern enthalten, entfernen Sie diese mit replace()
.
Fügen Sie die Felder dem Wörterbuch stock
hinzu und geben Sie es aus, um zu überprüfen, ob das Scrapen der Finanzdaten erwartungsgemäß verläuft:
n# initialize the dictionarynstock = {}nn# stock price scraping logic omitted for brevity...nn# add the scraped data to the dictionarynstock['regular_market_price'] = regular_market_pricenstock['regular_market_change'] = regular_market_changenstock['regular_market_change_percent'] = regular_market_change_percentnstock['post_market_price'] = post_market_pricenstock['post_market_change'] = post_market_changenstock['post_market_change_percent'] = post_market_change_percentnnprint(stock)
Führen Sie das Skript für das Wertpapier, das Sie scrapen möchten, aus. Sie sollten etwas Ähnliches wie das sehen:
{'regular_market_price': '193.17', 'regular_market_change': '+8.70', 'regular_market_change_percent': '+4.72%', 'post_market_price': '194.00', 'post_market_change': '+0.83', 'post_market_change_percent': '+0.43%'}
Weitere nützliche Informationen finden Sie in der Tabelle #quote-summary
:

In diesem Fall können Sie jedes Datenfeld mit Hilfe des Attributs data-test
wie im folgenden CSS-Selektor extrahieren:
#quote-summary [data-test=u0022PREV_CLOSE-valueu0022]
Scrapen Sie sie alle mit:
nprevious_close = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test=u0022PREV_CLOSE-valueu0022]').textnopen_value = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test=u0022OPEN-valueu0022]').textnbid = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test=u0022BID-valueu0022]').textnask = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test=u0022ASK-valueu0022]').textndays_range = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test=u0022DAYS_RANGE-valueu0022]').textnweek_range = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test=u0022FIFTY_TWO_WK_RANGE-valueu0022]').textnvolume = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test=u0022TD_VOLUME-valueu0022]').textnavg_volume = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test=u0022AVERAGE_VOLUME_3MONTH-valueu0022]').textnmarket_cap = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test=u0022MARKET_CAP-valueu0022]').textnbeta = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test=u0022BETA_5Y-valueu0022]').textnpe_ratio = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test=u0022PE_RATIO-valueu0022]').textneps = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test=u0022EPS_RATIO-valueu0022]').textnearnings_date = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test=u0022EARNINGS_DATE-valueu0022]').textndividend_yield = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test=u0022DIVIDEND_AND_YIELD-valueu0022]').textnex_dividend_date = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test=u0022EX_DIVIDEND_DATE-valueu0022]').textnyear_target_est = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test=u0022ONE_YEAR_TARGET_PRICE-valueu0022]').text
Dann fügen Sie sie zu stock
hinzu:
nstock['previous_close'] = previous_closenstock['open_value'] = open_valuenstock['bid'] = bidnstock['ask'] = asknstock['days_range'] = days_rangenstock['week_range'] = week_rangenstock['volume'] = volumenstock['avg_volume'] = avg_volumenstock['market_cap'] = market_capnstock['beta'] = betanstock['pe_ratio'] = pe_rationstock['eps'] = epsnstock['earnings_date'] = earnings_datenstock['dividend_yield'] = dividend_yieldnstock['ex_dividend_date'] = ex_dividend_datenstock['year_target_est'] = year_target_est
Großartig! Sie haben soeben in Python eine Finanz-Website gescrapt!
Schritt 5: Scrapen Sie mehrere Aktienkurse
Ein diversifiziertes Anlageportfolio besteht aus mehr als einem Wertpapier. Um Daten für alle abzurufen, müssen Sie Ihr Skript erweitern, um mehrere Ticker zu scrapen.
Zunächst verkapseln Sie die Scraping-Logik mit der folgenden Funktion:
ndef scrape_stock(driver, ticker_symbol):n url = f'https://finance.yahoo.com/quote/{ticker_symbol}'n driver.get(url)nn # deal with the consent modal...nn # initialize the stock dictionary with then # ticker symboln stock = { 'ticker': ticker_symbol }nn # scraping the desired data and populate n # the stock dictionary...nn return stock
Durchlaufen Sie dann die CLI-Argumente des Tickers und wenden Sie die Scraping-Funktion an:
nif len(sys.argv) u003c= 1:n print('Ticker symbol CLI arguments missing!')n sys.exit(2)nn# initialize a Chrome instance with the rightn# configsnoptions = Options()noptions.add_argument('u002du002dheadless=new')ndriver = webdriver.Chrome(n service=ChromeService(ChromeDriverManager().install()),n options=optionsn)ndriver.set_window_size(1150, 1000)nn# the array containing all scraped datanstocks = []nn# scraping all market securitiesnfor ticker_symbol in sys.argv[1:]:n stocks.append(scrape_stock(driver, ticker_symbol))
Am Ende des Zyklus for
wird die Liste der Python-Wörterbücher stocks alle Börsendaten enthalten.
Schritt 6: Exportieren Sie die gescrapten Daten nach CSV
Sie können die erfassten Daten mit nur wenigen Codezeilen nach CSV exportieren:
nimport csvnn# ...nn# extract the name of the dictionary fieldsn# to use it as the header of the output CSV filencsv_header = stocks[0].keys()nn# export the scraped data to CSVnwith open('stocks.csv', 'w', newline='') as output_file:n dict_writer = csv.DictWriter(output_file, csv_header)n dict_writer.writeheader()n dict_writer.writerows(stocks)
Dieses Schnipsel erstellt die Datei stocks.csv
mit open()
, initialisiert sie mit einer Kopfzeile und füllt sie auf. DictWriter.writerows()
wandelt jedes Wörterbuch in einen CSV-Datensatz um und hängt ihn der Ausgabedatei an.
Da csv
aus der Python-Standardbibliothek stammt, müssen Sie nicht einmal eine zusätzliche Abhängigkeit installieren, um Ihr Ziel zu erreichen.
Sie sind von Rohdaten einer Website ausgegangen und haben teilweise strukturierte Daten in einer CSV-Datei gespeichert. Es ist an der Zeit, einen Blick auf den gesamten Yahoo Finanz-Scraper zu werfen.
Schritt 7: Fügen Sie alles zusammen
Hier finden Sie die komplette Datei scraper.py
:
nfrom selenium import webdrivernfrom selenium.webdriver.chrome.service import Service as ChromeServicenfrom webdriver_manager.chrome import ChromeDriverManagernfrom selenium.webdriver.chrome.options import Optionsnfrom selenium.webdriver.support.ui import WebDriverWaitnfrom selenium.webdriver.support import expected_conditions as ECnfrom selenium.webdriver.common.by import Bynfrom selenium.common import TimeoutExceptionnimport sysnimport csvnndef scrape_stock(driver, ticker_symbol):n # build the URL of the target pagen url = f'https://finance.yahoo.com/quote/{ticker_symbol}'nn # visit the target pagen driver.get(url)nn try:n # wait up to 3 seconds for the consent modal to show upn consent_overlay = WebDriverWait(driver, 3).until(n EC.presence_of_element_located((By.CSS_SELECTOR, '.consent-overlay')))nn # click the 'Accept all' buttonn accept_all_button = consent_overlay.find_element(By.CSS_SELECTOR, '.accept-all')n accept_all_button.click()n except TimeoutException:n print('Cookie consent overlay missing')nn # initialize the dictionary that will containn # the data collected from the target pagen stock = { 'ticker': ticker_symbol }nn # scraping the stock data from the price indicatorsn regular_market_price = driver n .find_element(By.CSS_SELECTOR, f'[data-symbol=u0022{ticker_symbol}u0022][data-field=u0022regularMarketPriceu0022]') n .textn regular_market_change = driver n .find_element(By.CSS_SELECTOR, f'[data-symbol=u0022{ticker_symbol}u0022][data-field=u0022regularMarketChangeu0022]') n .textn regular_market_change_percent = driver n .find_element(By.CSS_SELECTOR, f'[data-symbol=u0022{ticker_symbol}u0022][data-field=u0022regularMarketChangePercentu0022]') n .text n .replace('(', '').replace(')', '')nn post_market_price = driver n .find_element(By.CSS_SELECTOR, f'[data-symbol=u0022{ticker_symbol}u0022][data-field=u0022postMarketPriceu0022]') n .textn post_market_change = driver n .find_element(By.CSS_SELECTOR, f'[data-symbol=u0022{ticker_symbol}u0022][data-field=u0022postMarketChangeu0022]') n .textn post_market_change_percent = driver n .find_element(By.CSS_SELECTOR, f'[data-symbol=u0022{ticker_symbol}u0022][data-field=u0022postMarketChangePercentu0022]') n .text n .replace('(', '').replace(')', '')nn stock['regular_market_price'] = regular_market_pricen stock['regular_market_change'] = regular_market_changen stock['regular_market_change_percent'] = regular_market_change_percentn stock['post_market_price'] = post_market_pricen stock['post_market_change'] = post_market_changen stock['post_market_change_percent'] = post_market_change_percentnn # scraping the stock data from the u0022Summaryu0022 tablen previous_close = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test=u0022PREV_CLOSE-valueu0022]').textn open_value = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test=u0022OPEN-valueu0022]').textn bid = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test=u0022BID-valueu0022]').textn ask = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test=u0022ASK-valueu0022]').textn days_range = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test=u0022DAYS_RANGE-valueu0022]').textn week_range = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test=u0022FIFTY_TWO_WK_RANGE-valueu0022]').textn volume = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test=u0022TD_VOLUME-valueu0022]').textn avg_volume = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test=u0022AVERAGE_VOLUME_3MONTH-valueu0022]').textn market_cap = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test=u0022MARKET_CAP-valueu0022]').textn beta = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test=u0022BETA_5Y-valueu0022]').textn pe_ratio = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test=u0022PE_RATIO-valueu0022]').textn eps = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test=u0022EPS_RATIO-valueu0022]').textn earnings_date = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test=u0022EARNINGS_DATE-valueu0022]').textn dividend_yield = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test=u0022DIVIDEND_AND_YIELD-valueu0022]').textn ex_dividend_date = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test=u0022EX_DIVIDEND_DATE-valueu0022]').textn year_target_est = driver.find_element(By.CSS_SELECTOR,n '#quote-summary [data-test=u0022ONE_YEAR_TARGET_PRICE-valueu0022]').textnn stock['previous_close'] = previous_closen stock['open_value'] = open_valuen stock['bid'] = bidn stock['ask'] = askn stock['days_range'] = days_rangen stock['week_range'] = week_rangen stock['volume'] = volumen stock['avg_volume'] = avg_volumen stock['market_cap'] = market_capn stock['beta'] = betan stock['pe_ratio'] = pe_ration stock['eps'] = epsn stock['earnings_date'] = earnings_daten stock['dividend_yield'] = dividend_yieldn stock['ex_dividend_date'] = ex_dividend_daten stock['year_target_est'] = year_target_estnn return stocknn# if there are no CLI parametersnif len(sys.argv) u003c= 1:n print('Ticker symbol CLI argument missing!')n sys.exit(2)nnoptions = Options()noptions.add_argument('u002du002dheadless=new')nn# initialize a web driver instance to control a Chrome windowndriver = webdriver.Chrome(n service=ChromeService(ChromeDriverManager().install()),n options=optionsn)nn# set up the window size of the controlled browserndriver.set_window_size(1150, 1000)nn# the array containing all scraped datanstocks = []nn# scraping all market securitiesnfor ticker_symbol in sys.argv[1:]:n stocks.append(scrape_stock(driver, ticker_symbol))nn# close the browser and free up the resourcesndriver.quit()nn# extract the name of the dictionary fieldsn# to use it as the header of the output CSV filencsv_header = stocks[0].keys()nn# export the scraped data to CSVnwith open('stocks.csv', 'w', newline='') as output_file:n dict_writer = csv.DictWriter(output_file, csv_header)n dict_writer.writeheader()n dict_writer.writerows(stocks)
Mit weniger als 150 Zeilen Code haben Sie einen voll funktionsfähigen Web Scraper zum Abrufen von Daten aus Yahoo Finanzen erstellt.
Starten Sie ihn für die von Ihnen angepeilten Börsenkurse wie im folgenden Beispiel:
python scraper.py TSLA AMZN AAPL META NFLX GOOG
Wenn Sie mit dem Scrapen fertig sind, erscheint die Datei stocks.csv
im Stammordner Ihres Projekts:

Fazit
In diesem Tutorial haben Sie erfahren, warum Yahoo Finance eines der besten Finanzportale im Web ist und wie Sie Daten daraus extrahieren können. Insbesondere haben Sie gesehen, wie Sie mit Python einen Scraper erstellen können, der Börsendaten abruft. Wie hier demonstriert, ist dies nicht komplex und erfordert nur wenige Codezeilen.
Allerdings ist Yahoo Finance eine dynamische Website, die stark auf JavaScript basiert und fortschrittliche Technologien zum Datenschutz einsetzt. Für eine reibungslose Datenerfassung auf solchen Websites empfehlen wir unsere Yahoo Finance Scraper API. Diese API übernimmt die komplexen Aufgaben beim Scraping, einschließlich CAPTCHAs, Fingerprinting und automatischen Wiederholungen. So können Sie problemlos strukturierte Finanzdaten abrufen. Starten Sie noch heute mit unserer Yahoo Finance Scraper API und vereinfachen Sie Ihren Datenerfassungsprozess.
Sie wollen sich gar nicht mit Web Scraping beschäftigen, sind aber an Finanzdaten interessiert? Dann erkunden Sie unseren Datensatzmarkt.