INVESTMENT #02

Pythonで株価をスクレイピングする前に

Python経験者向けの投資分析シリーズ第2回。本記事は「どうやって株価サイトをスクレイピングするか」ではなく、「その前に何を確認すべきか」と「責任ある実装の作法」を扱います。多くの金融サイトはスクレイピングを禁止しており、知らずに行うと規約違反や法的トラブルにつながります。安全に学ぶための判断軸を身につけましょう。

🎯 対象: Python経験者・投資分析 📦 requests / BeautifulSoup / robotparser ⏱️ 読了: 約11分

1. まず結論:スクレイピングは「最後の手段」

投資分析のためにデータを集めたい——その気持ちはよく分かります。ですが Python 経験者ほど、いきなり requests でHTMLを取りに行く前に、立ち止まる習慣をつけてほしいのです。本記事の結論を先に言います。公式の手段(API・ライブラリ・正規のダウンロード)で取れるデータは、必ずそちらを使う。スクレイピングは「どうしても他に手段がないとき」の最後の選択肢です。

株価データに限れば、前回のyfinanceで株価データを取得するで見たとおり、yfinance を使えば日本株・米国株・ETFが合法的かつ手軽に取得できます。わざわざ規約がグレーなスクレイピングをする理由はありません。それでもスクレイピングの技術と判断軸を学ぶ価値はあるので、本記事では「安全に・責任を持って行うための知識」を整理します。

2. 主要な株価サイトは禁止されている

意外に知られていませんが、日本の主要な株価・金融情報サイトの多くは、スクレイピング(プログラムによる自動取得)を明確に禁止しています。「ブラウザで見られるのだから取得していい」は誤解です。代表例を挙げます。

サイトスタンス正規の代替
Yahoo!ファイナンススクレイピング禁止(公式ヘルプに明記。システム過負荷・サービス妨害のおそれ)有料「VIP Club」の時系列ダウンロード/yfinance
みんかぶ等情報の複製・加工・再配布を禁止。過去にスクレイピング解説者へ是正の連絡を行った例も公式の提供範囲を確認
🚫
この2サイトを題材にした実装は載せません

本記事は、これらの禁止サイトをスクレイピングする方法を教えるものではありません。規約で禁止されている以上、手順を示すこと自体が違反の助長になります。株価が欲しいなら yfinance や公式の正規手段を使ってください。以降の技術解説は、スクレイピングが明示的に許可された練習用サイトで行います。

3. やる前に必ず確認する3つ

あるサイトをスクレイピングしてよいか。判断するために、最低限この3つを順に確認します。1つでも引っかかったら行わないのが安全側の原則です。

確認するもの見るポイント
① 利用規約「自動取得」「スクレイピング」「クローリング」「複製」「再配布」の禁止条項があるか
② robots.txtDisallow で対象パスがブロックされていないか(次章でプログラム確認)
③ 法令・権利著作権・データベースの権利、取得データの用途(私的利用か再配布か)

順番が大切です。robots.txt が許可していても、利用規約が禁止していれば行ってはいけません。robots.txt は「クローラ向けの技術的な指示」であって、規約という契約より上位ではないからです。「規約 → robots.txt → 法令」の3点セットで判断します。

4. robots.txt をプログラムで確認する

robots.txt は、サイトが「どのパスをクローラに許可/拒否するか」を示すファイルです(例: https://example.com/robots.txt)。Python標準ライブラリの urllib.robotparser で機械的に判定できます。

from urllib.robotparser import RobotFileParser

rp = RobotFileParser()
rp.set_url("https://quotes.toscrape.com/robots.txt")
rp.read()

# 指定UAで、そのURLを取得してよいか
ua = "MyResearchBot/1.0"
print(rp.can_fetch(ua, "https://quotes.toscrape.com/page/1/"))  # True/False

can_fetch()False を返すパスには、アクセスしないのが原則です。なお robots.txt には Crawl-delay(アクセス間隔の指定)が書かれていることもあります。その場合は指定された秒数以上の間隔を必ず空けます。robots.txt は「許可の証明書」ではなく「最低限の境界線」だと考えてください。

5. 責任ある実装の作法

規約・robots.txt をクリアし、許可された対象だけを取得する——その前提で、サーバーに迷惑をかけない実装の作法を押さえます。これは「相手のサイトを壊さない」ためのマナーであると同時に、自分を業務妨害のリスクから守るためでもあります。

  • アクセス間隔を空ける: 連続リクエストの間に time.sleep() を入れる(最低でも数秒。robots.txt の Crawl-delay 以上)
  • 素性を名乗る: User-Agent に連絡先を含めた独自名を設定し、ブラウザのふりをしない
  • 取得は最小限に: 必要なページだけ。全件巡回や高頻度の再取得をしない
  • キャッシュする: 一度取ったデータはローカル(SQLite等)に保存し、同じページを何度も叩かない
  • エラー時は止まる: 4xx/5xx が返ったら即座にリトライせず、間隔を空けるか中止する

とくにアクセス頻度は重要です。短時間に大量のリクエストを送ると、相手から見れば攻撃(DoS)と区別がつきません。「人がブラウザで見るより明らかに遅いくらい」を目安にしましょう。

6. 練習:許可されたサイトで手を動かす

技術自体は、スクレイピングの練習用に公開されているサンドボックスで学びます。quotes.toscrape.com は、まさにスクレイピング学習のために用意された公式の練習サイトです。ここで requests(取得)と BeautifulSoup(解析)の基本を確認します。ライブラリの位置づけはよく使うPythonライブラリ50選も参照してください。

pip install requests beautifulsoup4
import time
import requests
from bs4 import BeautifulSoup

URL = "https://quotes.toscrape.com/page/1/"
HEADERS = {"User-Agent": "MyResearchBot/1.0 (contact: you@example.com)"}

res = requests.get(URL, headers=HEADERS, timeout=10)
res.raise_for_status()                 # 4xx/5xx なら例外
soup = BeautifulSoup(res.text, "html.parser")

for q in soup.select(".quote"):
    text = q.select_one(".text").get_text(strip=True)
    author = q.select_one(".author").get_text(strip=True)
    print(f"{author}: {text}")

time.sleep(3)   # 次のページへ行くなら間隔を空ける

ポイントは HTML構造に依存すること。select(".quote") のように CSS セレクタで要素を取りますが、サイト側のHTMLが変われば壊れます。スクレイピングが「壊れやすい」のはこのためで、公式APIがあるならAPIが圧倒的に安定します。取得したデータの扱いは pandas に渡せば、前回のyfinance記事と同じ分析の流れに乗せられます。

スクレイピングの前に「公式の取得手段」を探す

「このデータ、スクレイピングするしかない」と思い込む前に、公式の取得手段を探す習慣をつけると、多くの場合スクレイピングは不要になります。探す場所は主に3つです。

  • 公式API・開発者ページ: サイトのフッターやヘルプに「API」「Developers」のリンクがないか。提供されていれば、利用規約のもとで安定したデータが得られます
  • 公的データポータル: 経済・金融指標なら、日本の e-Stat(政府統計)や米国の FRED(連邦準備制度の経済データ)など、再利用が許可された公式データが豊富です
  • 専用ライブラリ: 株価の yfinance のように、面倒な取得を肩代わりしてくれるラッパーが既にあることが多いです

この順で当たれば、「規約グレーなスクレイピングを自作する」必要はほとんど生じません。投資分析に必要なデータの大半は、すでに合法的に手が届くところにあります。

7. 知っておくべき法的背景

スクレイピングは「即・違法」ではありませんが、やり方次第で複数の法的リスクに触れ得ます。代表的な論点を、過度に怖がらず、しかし軽視もせずに押さえておきましょう。

論点注意点
利用規約違反規約は運営者との契約。違反は契約違反となり、アクセス遮断や損害賠償請求の根拠になり得る
著作権・データベース記事本文や編集された情報には著作権がある。複製・再配布は権利者の許諾が必要
業務妨害過度なアクセスでサーバーに負荷をかけると、業務妨害と評価されるおそれ(高頻度アクセスで逮捕に至った事例も過去にある)

「ブラウザで見られる情報なら自由に集めていい」という直感は、法的には通用しません。取得してよいか、取得したデータをどう使ってよいか(私的利用か、公開・再配布か)は別問題です。判断に迷うグレーなケースは「行わない」が最も安全で、投資データに関しては公式手段がそろっているので、わざわざリスクを取る必要はありません。

8. よくある質問(FAQ)

スクレイピングの可否でよくいただく質問をまとめました。

Q. スクレイピングは違法ですか?

行為そのものが一律に違法なわけではありません。ただし、利用規約違反・著作権侵害・過度なアクセスによる業務妨害など、やり方によっては法的責任を問われ得ます。「規約・robots.txt・法令」を確認し、グレーなら行わないのが安全です。

Q. Yahoo!ファイナンスやみんかぶの株価は取得できますか?

これらはスクレイピングを禁止しています(Yahoo!ファイナンスは公式ヘルプに明記、みんかぶは複製・再配布を禁止)。スクレイピングではなく、yfinanceや各社の正規手段を使ってください。本記事もこれらサイトの取得方法は扱いません。

Q. robots.txtで許可されていれば、自由にスクレイピングしていいですか?

いいえ。robots.txt はクローラ向けの技術的な指示で、利用規約より上位ではありません。robots.txtが許可していても、規約が自動取得を禁止していれば行ってはいけません。両方クリアして初めて検討できます。

Q. 投資データを取りたいだけなら、何を使えばいいですか?

株価・ETF・為替はyfinanceで取得できます。保有データは証券会社のCSVエクスポート(次回以降で解説)を使います。スクレイピングに頼らず、公式に提供された手段で十分にポートフォリオ管理アプリは作れます。

Q. APIとスクレイピング、どちらを使うべきですか?

公式APIがあるなら必ずAPIです。APIは利用が許諾されており、データ構造が安定していて壊れにくく、規約も明確です。スクレイピングはHTML構造の変化で壊れやすく、規約リスクも伴うため、APIが無い場合の最後の手段と考えてください。

本記事は、生成AIを活用して下書きし、運営者が内容を確認・編集したうえで公開しています。本記事は一般的な情報提供を目的としたもので、法的助言ではありません。スクレイピングの可否は各サイトの規約・状況により異なるため、実施前にご自身で確認してください。AIの利用方針は免責事項をご覧ください。