PythonでYahoo Financeをスクレイピングする方法

このステップガイドでは、Pythonを使ってYahoo Financeをスクレイピングする方法を説明します。
1 min read
Yahoo Finance scraping guide

TL:DR:取引・投資向けの財務分析に活用できるYahoo Financeスクレイパーを作成して株式データを抽出する方法を学びましょう。

このチュートリアルでは、次の内容を取り上げます。

  • ウェブから財務データをスクレイピングするのはなぜか?
  • 財務スクレイピングのライブラリとツール
  • Seleniumを使ってYahoo Financeから株式データをスクレイピングする

ウェブから財務データをスクレイピングするのはなぜか?

ウェブから財務データをスクレイピングすることで、以下のようなさまざまな場面で役立つ貴重なインサイトを得られます。  

  • 自動取引:開発者は、株価や出来高など、市場のリアルタイムデータや履歴データを収集することで、自動取引戦略を構築できます。  
  • テクニカル分析:テクニカルアナリストにとって、市場の履歴データと指標は非常に重要です。これらを利用してパターンやトレンドを把握し、投資の意思決定に活用できます。  
  • 財務モデリング:研究者やアナリストは、財務諸表や経済指標などの関連データを収集し、企業業績の評価、収益予測、投資機会を評価する複雑なモデルを構築できます。  
  • 市場調査:財務データは、株式、市場指数、商品に関する多くの情報を提供します。このデータを分析することで、研究者は市場のトレンド、センチメント、業界の健全性を理解し、情報に基づいた投資判断を下せます。  

Yahoo Financeは、市場を監視する上で人気のある財務ウェブサイトの1つです。このサイトは、株式、債券、ミューチュアルファンド、コモディティ、通貨、市場指数に関するリアルタイムデータや履歴データなど、幅広い情報とツールを投資家やトレーダーに提供しています。さらに、ニュース記事、財務諸表、アナリストの予測、チャート、その他の貴重なリソースも提供しています。

Yahoo Financeをスクレイピングすることで、財務分析、リサーチ、意思決定プロセスをサポートする豊富な情報にアクセスできます。  

財務スクレイピングのライブラリとツール

Pythonは、構文、使いやすさ、ライブラリの豊富なエコシステムのおかげで、スクレイピングに最適な言語の1つと考えられています。Pythonを使ったウェブスクレイピングのガイドをご覧ください。  

数あるスクレイピングライブラリの中から適切なものを選ぶため、ブラウザでYahoo Financeを検索してみましょう。サイト上のほとんどのデータがリアルタイムで、または対話処理の後に変更されるのに気づくでしょう。これは、ページを再読み込みせずに、データを動的に読み込んで更新するために、サイトがAJAXを多用していることを示しています。つまり、JavaScriptを実行できるツールが必要です。

Seleniumを使用すると、Pythonで動的なウェブサイトをスクレイピングできるようになります。データのレンダリングや取得にJavaScriptを使用している場合でも、ウェブブラウザでサイトをレンダリングし、プログラムで操作を実行します。  

Seleniumがあれば、Pythonを使ってターゲットサイトをスクレイピングできます。その方法を学びましょう!

Seleniumを使ってYahoo Financeから株式データをスクレイピングする

このステップバイステップのチュートリアルに従って、Yahoo FinanceのウェブスクレイピングPythonスクリプトを構築する方法を確認してください。

ステップ1:セットアップ  

財務スクレイピングを始める前に、以下の前提条件を満たしていることを確認してください。

次に、以下のコマンドを使って、Pythonプロジェクトを仮想環境でセットアップします。


mkdir yahoo-finance-scraper
cd yahoo-finance-scraper
python -m venv env

これで、yahoo-finance-scraperプロジェクトフォルダが初期化されます。その中に、以下のようにscraper.pyファイルを追加します。

print('Hello, World!')

Yahoo Financeをスクレイピングするロジックをここに追加します。現時点では、これは「Hello, World!」と表示するだけのサンプルスクリプトです。

起動して、動作することを確認します。

python scraper.py

ターミナルには次のように表示されているはずです。

Hello, World!

これで財務スクレイパー用のPythonプロジェクトができました。あとはプロジェクトの依存関係を追加するだけです。以下のターミナルコマンドで、SeleniumWebdriver Managerをインストールします。

pip install selenium webdriver-manager

少し時間がかかる場合があります。しばらく待ってください。

webdriver-managerは厳密には必須ではありません。ただ、Seleniumでウェブドライバを管理するのが非常に簡単になるので、強くお勧めします。このおかげで、ウェブドライバを手動でダウンロード、設定、インポートする必要がなくなります。

scraper.pyを更新する


from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager

# initialize a web driver instance to control a Chrome window
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))

# scraping logic...

# close the browser and free up the resources
driver.quit()

このスクリプトは、ChromeWebDriverのインスタンスをインスタンス化するだけです。データ抽出ロジックを実装するために、すぐにそれを使うことになります。  

ステップ2:ターゲットのウェブページに接続する

 

Yahoo Finenceの株式ページのURLは、以下のようになっています。

https://finance.yahoo.com/quote/AMZN

ご覧のように、これはティッカーシンボルによって変化する動的URLです。この概念に詳しくない方のために説明すると、これは株式市場で取引される株式を一意に識別するために使用される文字列の略称です。例えば、「AMZN」はAmazon株のティッカーシンボルです。

コマンドライン引数からティッカーを読み込むようにスクリプトを修正しましょう。


import sys

# if there are no CLI parameters
if len(sys.argv) <= 1:
    print('Ticker symbol CLI argument missing!')
    sys.exit(2)

# read the ticker from the CLI argument
ticker_symbol = sys.argv[1]

# build the URL of the target page
url = f'https://finance.yahoo.com/quote/{ticker_symbol}'

sysは、コマンドライン引数へのアクセスを提供するPython標準ライブラリです。インデックス0の引数がスクリプトの名前であることを覚えておいてください。したがって、インデックス1の引数をターゲットにする必要があります。

CLIからティッカーを読み取った後、それをf文字列で使用し、スクレイピングするターゲットURLを生成します。

例えば、Teslaのティッカー「TSLA:」でスクレイパーを起動するとします。

python scraper.py TSLA

urlには以下が含まれます。

https://finance.yahoo.com/quote/TSLA

CLIでティッカーシンボルを指定し忘れると、プログラムは以下のエラーで失敗します。

Ticker symbol CLI argument missing!

Seleniumでページを開く前に、すべての要素が見えるようにウィンドウサイズを設定することをお勧めします。

driver.set_window_size(1920, 1080)

get()関数はブラウザに、目的のページにアクセスするよう指示します。

driver.get(url)

get()関数はブラウザに、目的のページにアクセスするよう指示します。

Yahoo Financeのスクレイピングスクリプトは、現在のところ次のようになります。


from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
import sys

# if there are no CLI parameters
if len(sys.argv) <= 1:
    print('Ticker symbol CLI argument missing!')
    sys.exit(2)

# read the ticker from the CLI argument
ticker_symbol = sys.argv[1]

# build the URL of the target page
url = f'https://finance.yahoo.com/quote/{ticker_symbol}'

# initialize a web driver instance to control a Chrome window
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))
# set up the window size of the controlled browser
driver.set_window_size(1920, 1080)
# visit the target page
driver.get(url)

# scraping logic...

# close the browser and free up the resources
driver.quit()

起動すると、このウィンドウが一瞬だけ開いて終了します。

Yahoo finance画像

UI付きでブラウザを起動すると、スクレイパーがウェブページ上で何を実行しているかを監視してデバッグするのに便利です。ただし、これには多くのリソースが必要です。これを避けるには、ヘッドレスモードで実行するようにChromeを構成します。


from selenium.webdriver.chrome.options import Options
# ...

options = Options()
options.add_argument('--headless=new')

driver = webdriver.Chrome(
    service=ChromeService(ChromeDriverManager().install()),
    options=options
)

制御対象のブラウザは、UIなしでバックグラウンドで起動します。

ステップ3:ターゲットページを検査する  

効果的なデータマイニング戦略を構築したいのであれば、まずターゲットのウェブページを分析する必要があります。ブラウザを開き、Yahoo株式ページにアクセスします。

欧州に拠点を置いているのであれば、最初にクッキーを受け入れるよう求めるモーダルが表示されます。

Yahooクッキー

それを閉じて、目的のページにアクセスし続けるには、「すべて受け入れる」または「すべて拒否する」をクリックする必要があります。最初のボタンを右クリックし、「検査」オプションを選択すると、ブラウザのDevToolsが開きます。

Yahoo検査

ここで、次のCSSセレクタを使うと、そのボタンを選択できることがお分かりいただけるでしょう。

.consent-overlay .accept-all

以下の行を使用して、Seleniumの同意モーダルに対処します。


try:
    # wait up to 3 seconds for the consent modal to show up
    consent_overlay = WebDriverWait(driver, 3).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, '.consent-overlay')))

    # click the "Accept all" button
    accept_all_button = consent_overlay.find_element(By.CSS_SELECTOR, '.accept-all')
    accept_all_button.click()
except TimeoutException:
    print('Cookie consent overlay missing')

WebDriverWaitを使用すると、予期される条件がページ上で発生するのを待機できます。指定されたタイムアウトの間に何も起こらなければ、TimeoutExceptionを発生させます。クッキーオーバーレイは、出口IPが欧州の場合にのみ表示されるため、try-catch命令で例外を扱うことができます。こうすることで、同意モーダルが存在しない場合でも、スクリプトは実行を続けます。

スクリプトを動作させるには、以下のimportを追加する必要があります。


from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common import TimeoutException

DevToolsでターゲットサイトの検査を続けて、そのDOM構造に精通していきます。

ステップ4:株式データを抽出する  

前のステップでお気づきのように、最も興味深い情報の一部がこのセクションにあります。

株式データを抽出する

HTML価格指標要素を検査します。

CSSクラスは、Yahoo Financeで適切なセレクタを定義するのには役に立たないことに留意してください。これらはスタイリングフレームワーク向けの特殊な構文に従っているようです。代わりに、他のHTML属性に注目します。例えば、以下のCSSセレクタで株価を取得できます。

[data-symbol="TSLA"][data-field="regularMarketPrice"]

同様の手法で、価格指標からすべての株式データを抽出します。


regular_market_price = driver\
    .find_element(By.CSS_SELECTOR, f'[data-symbol="{ticker_symbol}"][data-field="regularMarketPrice"]')\
    .text
regular_market_change = driver\
    .find_element(By.CSS_SELECTOR, f'[data-symbol="{ticker_symbol}"][data-field="regularMarketChange"]')\
    .text
regular_market_change_percent = driver\
    .find_element(By.CSS_SELECTOR, f'[data-symbol="{ticker_symbol}"][data-field="regularMarketChangePercent"]')\
    .text\
    .replace('(', '').replace(')', '')
 
post_market_price = driver\
    .find_element(By.CSS_SELECTOR, f'[data-symbol="{ticker_symbol}"][data-field="postMarketPrice"]')\
    .text
post_market_change = driver\
    .find_element(By.CSS_SELECTOR, f'[data-symbol="{ticker_symbol}"][data-field="postMarketChange"]')\
    .text
post_market_change_percent = driver\
    .find_element(By.CSS_SELECTOR, f'[data-symbol="{ticker_symbol}"][data-field="postMarketChangePercent"]')\
    .text\
    .replace('(', '').replace(')', '')

特定のCSSセレクタ戦略でHTML要素を選択した後、textフィールドでその内容を抽出できます。パーセントフィールドには丸括弧が含まれるため、replace()で丸括弧を削除します。

それらをstock辞書に追加して出力し、財務データのスクレイピングプロセスが期待通りに機能することを検証します。


# initialize the dictionary
stock = {}

# stock price scraping logic omitted for brevity...

# add the scraped data to the dictionary
stock['regular_market_price'] = regular_market_price
stock['regular_market_change'] = regular_market_change
stock['regular_market_change_percent'] = regular_market_change_percent
stock['post_market_price'] = post_market_price
stock['post_market_change'] = post_market_change
stock['post_market_change_percent'] = post_market_change_percent

print(stock)

スクリプトをスクレイピングしたいセキュリティで実行すると、以下のようなものが表示されるはずです。

{'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%'}

その他の有用な情報は、#quote-summaryテーブルで見つけることができます。

見積概要テーブル

この場合、以下のCSSセレクタのように、data-test属性のおかげで各データフィールドを抽出できます。

#quote-summary [data-test="PREV_CLOSE-value"]

以下を使ってすべてをスクレイピングします。


previous_close = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test="PREV_CLOSE-value"]').text
open_value = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test="OPEN-value"]').text
bid = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test="BID-value"]').text
ask = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test="ASK-value"]').text
days_range = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test="DAYS_RANGE-value"]').text
week_range = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test="FIFTY_TWO_WK_RANGE-value"]').text
volume = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test="TD_VOLUME-value"]').text
avg_volume = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test="AVERAGE_VOLUME_3MONTH-value"]').text
market_cap = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test="MARKET_CAP-value"]').text
beta = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test="BETA_5Y-value"]').text
pe_ratio = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test="PE_RATIO-value"]').text
eps = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test="EPS_RATIO-value"]').text
earnings_date = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test="EARNINGS_DATE-value"]').text
dividend_yield = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test="DIVIDEND_AND_YIELD-value"]').text
ex_dividend_date = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test="EX_DIVIDEND_DATE-value"]').text
year_target_est = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test="ONE_YEAR_TARGET_PRICE-value"]').text

その後、それらをstockに追加します。


stock['previous_close'] = previous_close
stock['open_value'] = open_value
stock['bid'] = bid
stock['ask'] = ask
stock['days_range'] = days_range
stock['week_range'] = week_range
stock['volume'] = volume
stock['avg_volume'] = avg_volume
stock['market_cap'] = market_cap
stock['beta'] = beta
stock['pe_ratio'] = pe_ratio
stock['eps'] = eps
stock['earnings_date'] = earnings_date
stock['dividend_yield'] = dividend_yield
stock['ex_dividend_date'] = ex_dividend_date
stock['year_target_est'] = year_target_est

素晴しいです!これで、Pythonを使って財務ウェブスクレイピングを実行できました!

ステップ5:複数の株式をスクレイピングする  

分散投資ポートフォリオは、複数の証券で構成されます。これらすべてのデータを取得するには、複数のティッカーをスクレイピングするようにスクリプトを拡張する必要があります。

まず、スクレイピングロジックを関数にカプセル化します。


def scrape_stock(driver, ticker_symbol):
    url = f'https://finance.yahoo.com/quote/{ticker_symbol}'
    driver.get(url)

    # deal with the consent modal...

    # initialize the stock dictionary with the
    # ticker symbol
    stock = { 'ticker': ticker_symbol }

    # scraping the desired data and populate 
    # the stock dictionary...

    return stock

次に、CLIのティッカー引数を反復処理して、スクレイピング関数を適用します。


if len(sys.argv) <= 1:
    print('Ticker symbol CLI arguments missing!')
    sys.exit(2)

# initialize a Chrome instance with the right
# configs
options = Options()
options.add_argument('--headless=new')
driver = webdriver.Chrome(
    service=ChromeService(ChromeDriverManager().install()),
    options=options
)
driver.set_window_size(1150, 1000)

# the array containing all scraped data
stocks = []

# scraping all market securities
for ticker_symbol in sys.argv[1:]:
    stocks.append(scrape_stock(driver, ticker_symbol))

forサイクルが終了すると、Python辞書のstocksのリストには、すべての株式市場のデータが含まれることになります。

ステップ6:スクレイピングしたデータをCSVにエクスポートする  

わずか数行のコードで、収集したデータをCSVにエクスポートできます。


import csv

# ...

# extract the name of the dictionary fields
# to use it as the header of the output CSV file
csv_header = stocks[0].keys()

# export the scraped data to CSV
with open('stocks.csv', 'w', newline='') as output_file:
    dict_writer = csv.DictWriter(output_file, csv_header)
    dict_writer.writeheader()
    dict_writer.writerows(stocks)

このスニペットは、open()stocks.csvファイルを作成し、ヘッダ行で初期化し、それにデータを入力します。具体的にはDictWriter.writerows()は、各辞書をCSVレコードに変換して、出力ファイルに追加します。

csvはPython Standard Libraryから提供されているため、目的を達成するために追加の依存関係をインストールする必要はありません。

ウェブページに含まれる生データを、半構造化データにしてCSVファイルに格納できます。それでは、Yahoo Financeスクレイパー全体を見てみましょう。

ステップ7:すべてを統合する  

以下に、完全なscraper.pyファイルを示します。


from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common import TimeoutException
import sys
import csv

def scrape_stock(driver, ticker_symbol):
    # build the URL of the target page
    url = f'https://finance.yahoo.com/quote/{ticker_symbol}'

    # visit the target page
    driver.get(url)

    try:
        # wait up to 3 seconds for the consent modal to show up
        consent_overlay = WebDriverWait(driver, 3).until(
            EC.presence_of_element_located((By.CSS_SELECTOR, '.consent-overlay')))

        # click the 'Accept all' button
        accept_all_button = consent_overlay.find_element(By.CSS_SELECTOR, '.accept-all')
        accept_all_button.click()
    except TimeoutException:
        print('Cookie consent overlay missing')

    # initialize the dictionary that will contain
    # the data collected from the target page
    stock = { 'ticker': ticker_symbol }

    # scraping the stock data from the price indicators
    regular_market_price = driver \
        .find_element(By.CSS_SELECTOR, f'[data-symbol="{ticker_symbol}"][data-field="regularMarketPrice"]') \
        .text
    regular_market_change = driver \
        .find_element(By.CSS_SELECTOR, f'[data-symbol="{ticker_symbol}"][data-field="regularMarketChange"]') \
        .text
    regular_market_change_percent = driver \
        .find_element(By.CSS_SELECTOR, f'[data-symbol="{ticker_symbol}"][data-field="regularMarketChangePercent"]') \
        .text \
        .replace('(', '').replace(')', '')

    post_market_price = driver \
        .find_element(By.CSS_SELECTOR, f'[data-symbol="{ticker_symbol}"][data-field="postMarketPrice"]') \
        .text
    post_market_change = driver \
        .find_element(By.CSS_SELECTOR, f'[data-symbol="{ticker_symbol}"][data-field="postMarketChange"]') \
        .text
    post_market_change_percent = driver \
        .find_element(By.CSS_SELECTOR, f'[data-symbol="{ticker_symbol}"][data-field="postMarketChangePercent"]') \
        .text \
        .replace('(', '').replace(')', '')

    stock['regular_market_price'] = regular_market_price
    stock['regular_market_change'] = regular_market_change
    stock['regular_market_change_percent'] = regular_market_change_percent
    stock['post_market_price'] = post_market_price
    stock['post_market_change'] = post_market_change
    stock['post_market_change_percent'] = post_market_change_percent

    # scraping the stock data from the "Summary" table
    previous_close = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test="PREV_CLOSE-value"]').text
    open_value = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test="OPEN-value"]').text
    bid = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test="BID-value"]').text
    ask = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test="ASK-value"]').text
    days_range = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test="DAYS_RANGE-value"]').text
    week_range = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test="FIFTY_TWO_WK_RANGE-value"]').text
    volume = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test="TD_VOLUME-value"]').text
    avg_volume = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test="AVERAGE_VOLUME_3MONTH-value"]').text
    market_cap = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test="MARKET_CAP-value"]').text
    beta = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test="BETA_5Y-value"]').text
    pe_ratio = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test="PE_RATIO-value"]').text
    eps = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test="EPS_RATIO-value"]').text
    earnings_date = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test="EARNINGS_DATE-value"]').text
    dividend_yield = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test="DIVIDEND_AND_YIELD-value"]').text
    ex_dividend_date = driver.find_element(By.CSS_SELECTOR, '#quote-summary [data-test="EX_DIVIDEND_DATE-value"]').text
    year_target_est = driver.find_element(By.CSS_SELECTOR,
                                          '#quote-summary [data-test="ONE_YEAR_TARGET_PRICE-value"]').text

    stock['previous_close'] = previous_close
    stock['open_value'] = open_value
    stock['bid'] = bid
    stock['ask'] = ask
    stock['days_range'] = days_range
    stock['week_range'] = week_range
    stock['volume'] = volume
    stock['avg_volume'] = avg_volume
    stock['market_cap'] = market_cap
    stock['beta'] = beta
    stock['pe_ratio'] = pe_ratio
    stock['eps'] = eps
    stock['earnings_date'] = earnings_date
    stock['dividend_yield'] = dividend_yield
    stock['ex_dividend_date'] = ex_dividend_date
    stock['year_target_est'] = year_target_est

    return stock

# if there are no CLI parameters
if len(sys.argv) <= 1:
    print('Ticker symbol CLI argument missing!')
    sys.exit(2)

options = Options()
options.add_argument('--headless=new')

# initialize a web driver instance to control a Chrome window
driver = webdriver.Chrome(
    service=ChromeService(ChromeDriverManager().install()),
    options=options
)

# set up the window size of the controlled browser
driver.set_window_size(1150, 1000)

# the array containing all scraped data
stocks = []

# scraping all market securities
for ticker_symbol in sys.argv[1:]:
    stocks.append(scrape_stock(driver, ticker_symbol))

# close the browser and free up the resources
driver.quit()

# extract the name of the dictionary fields
# to use it as the header of the output CSV file
csv_header = stocks[0].keys()

# export the scraped data to CSV
with open('stocks.csv', 'w', newline='') as output_file:
    dict_writer = csv.DictWriter(output_file, csv_header)
    dict_writer.writeheader()
    dict_writer.writerows(stocks)

150行未満のコードで、Yahoo Financeからデータを取得するフル機能のウェブスクレイパーを構築できました。

以下の例のように、ターゲットの株式を指定してこれを起動します。

python scraper.py TSLA AMZN AAPL META NFLX GOOG

スクレイピングプロセスの最後に、このstocks.csvファイルがプロジェクトのルートフォルダに表示されます。

株式csv

まとめ

このチュートリアルでは、Yahoo Financeがウェブ上の最高の財務ポータルの1つである理由と、そこからデータを抽出する方法を解説しました。特に、そこから株式データを取得するPythonスクレイパーの構築方法を見てきました。ご覧いただいておわかりのように、これは複雑なものではなく、わずか数行のコードで済むものです。

同時に、Yohoo FinanceはJavaScriptに大きく依存する動的なサイトです。この種のサイトを扱う場合、HTTPライブラリとHTMLパーサーに基づく従来のアプローチでは不十分です。その上、この種の人気サイトは高度なデータ保護技術を導入する傾向があります。それらをスクレイピングするには、CAPTCHAやフィンガープリンティング、自動再試行などを自動的に処理できる制御可能なブラウザが必要です。当社の新しいScraping Browserソリューションは、まさにそのためのツールです!  

ウェブスクレイピングには全く関心がないとしても、財務データには興味がありませんか?当社のデータセットマーケットプレイスをご覧ください。  

More from Bright Data

Datasets Icon
Get immediately structured data
Access reliable public web data for any use case. The datasets can be downloaded or delivered in a variety of formats. Subscribe to get fresh records of your preferred dataset based on a pre-defined schedule.
Web scraper IDE Icon
Build reliable web scrapers. Fast.
Build scrapers in a cloud environment with code templates and functions that speed up the development. This solution is based on Bright Data’s Web Unlocker and proxy infrastructure making it easy to scale and never get blocked.
Web Unlocker Icon
Implement an automated unlocking solution
Boost the unblocking process with fingerprint management, CAPTCHA-solving, and IP rotation. Any scraper, written in any language, can integrate it via a regular proxy interface.

Ready to get started?