はじめに

株式投資の情報収集、毎日どのように行っていますか?多くの人が証券会社のツールや情報サイトを目で見て確認しているかと思いますが、「特定の条件に合う銘柄だけを自動でリストアップできたら便利なのに…」と感じたことはありませんか?

Pythonを使えば、Webサイトから欲しい情報を自動で集める「Webスクレイピング」が可能です。

この記事では、その第一歩として、Yahoo!ファイナンスの時価総額ランキングのデータを取得し、Excelなどで開けるCSVファイルとして保存する簡単なPythonコードをご紹介します。

最終的には「時価総額3000億円以上の銘柄」といった条件でデータを絞り込むことを目指しますが、今回はそのための「準備段階」のコードです。プログラミングが初めての方でも、コピペで試せるのでぜひ挑戦してみてください!

この記事でできること

  • Yahoo!ファイナンスの「時価総額ランキング」ページからデータを自動取得
  • 取得したデータをExcelなどで開けるCSV形式で保存

1. 事前準備:ライブラリのインストール

まず、スクレイピングに必要なライブラリをインストールします。
Google ColaboratoryやJupyter Notebookをお使いであれば、以下の1行をコードセルに貼り付けて実行するだけです。

# 1. 必要なライブラリをインストール
!pip install pandas requests tqdm lxml
  • pandas: データを表形式で扱うための必須ライブラリ
  • requests: Webサイトの情報を取得するためのライブラリ
  • tqdm: 処理の進捗状況をバーで表示してくれるライブラリ
  • lxml: pandasがHTMLを読み込むために内部で利用するライブラリ

2. メインのPythonコード

次に、メインの処理を行うコードです。以下をコピーして、実行してみてください。

# 2. メインのPythonコード
import pandas as pd
import requests
import time
from tqdm import tqdm
import io

def create_debug_file():
    """
    スクレイピングした生データをCSVファイルに出力する。
    """
    print("Yahoo!ファイナンスの時価総額ランキングからデバッグ用の生データを取得します...")
    start_time = time.time()

    base_url = "https://finance.yahoo.co.jp/stocks/ranking/marketCapitalHigh?market=all&page={}"
    all_dfs = []

    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36',
    }

    max_page = 5 # デバッグなので、ページ数を5に減らして高速化します
    for page in tqdm(range(1, max_page + 1), desc="ランキングページ取得中"):
        try:
            url = base_url.format(page)
            response = requests.get(url, headers=headers, timeout=10)
            response.raise_for_status()

            # response.textからHTMLテーブルを直接読み込む
            tables = pd.read_html(io.StringIO(response.text))

            if len(tables) > 0:
                all_dfs.append(tables[0])
            else:
                break
            time.sleep(0.5) # サーバーに負荷をかけないための小休止
        except Exception as e:
            print(f"ページ {page} の取得中にエラーが発生しました: {e}")
            break

    if not all_dfs:
        print("データを取得できませんでした。")
        return

    # --- 取得した全データを結合 ---
    full_df = pd.concat(all_dfs, ignore_index=True)

    # ★★★ ここが今回の目的 ★★★
    # 取得した生のDataFrameを、一切加工せずにCSVファイルとして保存する
    csv_filename = 'raw_scraping_data.csv'
    try:
        # encoding='utf-8-sig' はExcelで文字化けしないためのおまじない
        full_df.to_csv(csv_filename, index=False, encoding='utf-8-sig')

        print(f"\n--- 【デバッグ用ファイル出力完了】 ---")
        print(f"スクレイピングした生データを '{csv_filename}' に保存しました。")
        print("\n★★★ 次のステップ ★★★")
        print("1. Google Colabの左側にあるフォルダアイコンをクリックしてファイル一覧を表示してください。")
        print(f"2. '{csv_filename}' というファイルが表示されているはずです。")
        print("3. このファイルをダウンロードし、Excelやテキストエディタで開いてください。")
        print("4. 特に '名称・コード・市場' 列のセルの中身が、**具体的にどのような文字列になっているか**を確認し、その内容を教えてください。")

    except Exception as e:
        print(f"\nCSVファイルへの保存中にエラーが発生しました: {e}")

    end_time = time.time()
    print(f"\n処理が完了しました。所要時間: {end_time - start_time:.2f} 秒")


if __name__ == '__main__':
    create_debug_file()

3. コードの簡単な解説

このコードが何をしているのか、ポイントを絞って見ていきましょう。

  • base_url: データを取得したいYahoo!ファイナンスのURLです。{}の部分にページ番号を入れることで、2ページ目、3ページ目とアクセスできます。
  • for page in tqdm(...): forループを使って、指定したページ数(今回は5ページ)の情報を順番に取得します。tqdmのおかげで、実行中にカッコいい進捗バーが表示されます。
  • time.sleep(0.5): サイトに連続でアクセスすると、サーバーに大きな負荷をかけてしまう可能性があります。time.sleep()で0.5秒の小休止を入れるのは、スクレイピングを行う上での大切なマナーです。
  • pd.read_html(): このコードの一番のキモです。requestsで取得したWebページの情報(HTML)を渡すだけで、pandas自動でページ内の表(テーブル)を探して、データとして読み込んでくれます。 非常に強力な機能で、これだけでスクレイピングが劇的に楽になります。
  • full_df.to_csv(...): 取得した全ページのデータを1つにまとめ、CSVファイルとして保存します。encoding='utf-8-sig'と指定することで、Excelでファイルを開いたときの文字化けを防ぐことができます。

実行結果について

コードを実行すると、raw_scraping_data.csvというファイルが生成されます。Google Colabなら画面左のファイル一覧に表示されるはずです。

ぜひこのファイルをダウンロードして、Excelなどで開いてみてください。そして、特に「名称・コード・市場」の列がどのような文字列になっているかを確認してみましょう。

  • トヨタ自動車(株) 7203 東証PRM ...のように、スペースで区切られていますか?
  • それとも、すべて連結されていますか?

このセルの構造が分かれば、次はいよいよデータを加工して、欲しい情報だけを抽出するステップに進めます!

まとめ

今回は、Pythonを使ってYahoo!ファイナンスから株価データをスクレイピングする「第一歩」として、生データを取得・保存するコードを紹介しました。

requestspandas.read_htmlを組み合わせることで、Web上のテーブルデータを驚くほど簡単に取得できることがお分かりいただけたかと思います。


この記事が気に入ったら『目黒で働く分析担当の作業メモ』ご支援をお願いします!

※OFUSEに飛びます


おすすめの記事