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 3+がお使いのマシンにインストールされていること:インストーラをダウンロードしてダブルクリックし、インストールウィザードに従って操作を行います。
- お好みのPython IDE:PyCharm Community Edition、またはPython拡張機能付きのVisual Studio Codeなどがよいでしょう。
次に、以下のコマンドを使って、Pythonプロジェクトを仮想環境でセットアップします。
これで、yahoo-finance-scraper
プロジェクトフォルダが初期化されます。その中に、以下のようにscraper.py
ファイルを追加します。
Yahoo Financeをスクレイピングするロジックをここに追加します。現時点では、これは「Hello, World!」と表示するだけのサンプルスクリプトです。
起動して、動作することを確認します。
ターミナルには次のように表示されているはずです。
これで財務スクレイパー用のPythonプロジェクトができました。あとはプロジェクトの依存関係を追加するだけです。以下のターミナルコマンドで、SeleniumとWebdriver Managerをインストールします。
少し時間がかかる場合があります。しばらく待ってください。
webdriver-manager
は厳密には必須ではありません。ただ、Seleniumでウェブドライバを管理するのが非常に簡単になるので、強くお勧めします。このおかげで、ウェブドライバを手動でダウンロード、設定、インポートする必要がなくなります。
scraper.py
を更新する
このスクリプトは、ChromeWebDriver
のインスタンスをインスタンス化するだけです。データ抽出ロジックを実装するために、すぐにそれを使うことになります。
ステップ2:ターゲットのウェブページに接続する
Yahoo Finenceの株式ページのURLは、以下のようになっています。
ご覧のように、これはティッカーシンボルによって変化する動的URLです。この概念に詳しくない方のために説明すると、これは株式市場で取引される株式を一意に識別するために使用される文字列の略称です。例えば、「AMZN」はAmazon株のティッカーシンボルです。
コマンドライン引数からティッカーを読み込むようにスクリプトを修正しましょう。
s
ys
は、コマンドライン引数へのアクセスを提供するPython標準ライブラリです。インデックス0の引数がスクリプトの名前であることを覚えておいてください。したがって、インデックス1の引数をターゲットにする必要があります。
CLIからティッカーを読み取った後、それをf文字列で使用し、スクレイピングするターゲットURLを生成します。
例えば、Teslaのティッカー「TSLA:」でスクレイパーを起動するとします。
url
には以下が含まれます。
CLIでティッカーシンボルを指定し忘れると、プログラムは以下のエラーで失敗します。
Seleniumでページを開く前に、すべての要素が見えるようにウィンドウサイズを設定することをお勧めします。
get()関数はブラウザに、目的のページにアクセスするよう指示します。
get()
関数はブラウザに、目的のページにアクセスするよう指示します。
Yahoo Financeのスクレイピングスクリプトは、現在のところ次のようになります。
起動すると、このウィンドウが一瞬だけ開いて終了します。
UI付きでブラウザを起動すると、スクレイパーがウェブページ上で何を実行しているかを監視してデバッグするのに便利です。ただし、これには多くのリソースが必要です。これを避けるには、ヘッドレスモードで実行するようにChromeを構成します。
制御対象のブラウザは、UIなしでバックグラウンドで起動します。
ステップ3:ターゲットページを検査する
効果的なデータマイニング戦略を構築したいのであれば、まずターゲットのウェブページを分析する必要があります。ブラウザを開き、Yahoo株式ページにアクセスします。
欧州に拠点を置いているのであれば、最初にクッキーを受け入れるよう求めるモーダルが表示されます。
それを閉じて、目的のページにアクセスし続けるには、「すべて受け入れる」または「すべて拒否する」をクリックする必要があります。最初のボタンを右クリックし、「検査」オプションを選択すると、ブラウザのDevToolsが開きます。
ここで、次のCSSセレクタを使うと、そのボタンを選択できることがお分かりいただけるでしょう。
以下の行を使用して、Seleniumの同意モーダルに対処します。
WebDriverWait
を使用すると、予期される条件がページ上で発生するのを待機できます。指定されたタイムアウトの間に何も起こらなければ、TimeoutException
を発生させます。クッキーオーバーレイは、出口IPが欧州の場合にのみ表示されるため、try-catch
命令で例外を扱うことができます。こうすることで、同意モーダルが存在しない場合でも、スクリプトは実行を続けます。
スクリプトを動作させるには、以下のimportを追加する必要があります。
DevToolsでターゲットサイトの検査を続けて、そのDOM構造に精通していきます。
ステップ4:株式データを抽出する
前のステップでお気づきのように、最も興味深い情報の一部がこのセクションにあります。
HTML価格指標要素を検査します。
CSSクラスは、Yahoo Financeで適切なセレクタを定義するのには役に立たないことに留意してください。これらはスタイリングフレームワーク向けの特殊な構文に従っているようです。代わりに、他のHTML属性に注目します。例えば、以下のCSSセレクタで株価を取得できます。
同様の手法で、価格指標からすべての株式データを抽出します。
特定のCSSセレクタ戦略でHTML要素を選択した後、text
フィールドでその内容を抽出できます。パーセントフィールドには丸括弧が含まれるため、replace()
で丸括弧を削除します。
それらをstock
辞書に追加して出力し、財務データのスクレイピングプロセスが期待通りに機能することを検証します。
スクリプトをスクレイピングしたいセキュリティで実行すると、以下のようなものが表示されるはずです。
その他の有用な情報は、#quote-summary
テーブルで見つけることができます。
この場合、以下のCSSセレクタのように、data-test
属性のおかげで各データフィールドを抽出できます。
以下を使ってすべてをスクレイピングします。
その後、それらをstock
に追加します。
素晴しいです!これで、Pythonを使って財務ウェブスクレイピングを実行できました!
ステップ5:複数の株式をスクレイピングする
分散投資ポートフォリオは、複数の証券で構成されます。これらすべてのデータを取得するには、複数のティッカーをスクレイピングするようにスクリプトを拡張する必要があります。
まず、スクレイピングロジックを関数にカプセル化します。
次に、CLIのティッカー引数を反復処理して、スクレイピング関数を適用します。
for
サイクルが終了すると、Python辞書のstocks
のリストには、すべての株式市場のデータが含まれることになります。
ステップ6:スクレイピングしたデータをCSVにエクスポートする
わずか数行のコードで、収集したデータをCSVにエクスポートできます。
このスニペットは、open()
でstocks.csv
ファイルを作成し、ヘッダ行で初期化し、それにデータを入力します。具体的にはDictWriter.writerows
()は、各辞書をCSVレコードに変換して、出力ファイルに追加します。
csv
はPython Standard Libraryから提供されているため、目的を達成するために追加の依存関係をインストールする必要はありません。
ウェブページに含まれる生データを、半構造化データにしてCSVファイルに格納できます。それでは、Yahoo Financeスクレイパー全体を見てみましょう。
ステップ7:すべてを統合する
以下に、完全なscraper.py
ファイルを示します。
150行未満のコードで、Yahoo Financeからデータを取得するフル機能のウェブスクレイパーを構築できました。
以下の例のように、ターゲットの株式を指定してこれを起動します。
スクレイピングプロセスの最後に、このstocks.csv
ファイルがプロジェクトのルートフォルダに表示されます。
まとめ
このチュートリアルでは、Yahoo Financeがウェブ上の最高の財務ポータルの1つである理由と、そこからデータを抽出する方法を解説しました。特に、そこから株式データを取得するPythonスクレイパーの構築方法を見てきました。ご覧いただいておわかりのように、これは複雑なものではなく、わずか数行のコードで済むものです。
同時に、Yohoo FinanceはJavaScriptに大きく依存する動的なサイトです。この種のサイトを扱う場合、HTTPライブラリとHTMLパーサーに基づく従来のアプローチでは不十分です。その上、この種の人気サイトは高度なデータ保護技術を導入する傾向があります。それらをスクレイピングするには、CAPTCHAやフィンガープリンティング、自動再試行などを自動的に処理できる制御可能なブラウザが必要です。当社の新しいScraping Browserソリューションは、まさにそのためのツールです!
ウェブスクレイピングには全く関心がないとしても、財務データには興味がありませんか?当社のデータセットマーケットプレイスをご覧ください。