INVESTMENT #02

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

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

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

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

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

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

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

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

サイトスタンス正規の代替
Yahoo!ファイナンススクレイピング禁止公式ヘルプ「掲載情報の自動取得(スクレイピング)は禁止しています」に明記。システム過負荷・サービス妨害のおそれ)「VIP倶楽部」の時系列データダウンロード/yfinance
みんかぶ利用規約でスクレイピング等の機械的取得を禁止利用規約 第7条 禁止事項)。私的使用の範囲を超えた蓄積・再配布も不可公式の提供範囲を確認

いずれも一次情報にあたって確認できます。Yahoo!ファイナンスは公式ヘルプで「掲載情報の自動取得(スクレイピング)は禁止しています」と題した記事を出し、禁止理由として「システムに過度の負荷がかかり、安定したサービス提供に支障をきたす恐れ」を挙げています。株価データが欲しい場合は「VIP倶楽部」の時系列データダウンロードを使うよう案内されています。みんかぶは利用規約の第7条(禁止事項)で「本サイト公認以外の方法による、プログラム、スクレイピング等により本サイトのコンテンツを機械的に取得する行為」を明文で禁止し、あわせて私的使用の範囲を超えた蓄積も禁じています。「規約に書いてあるか」を自分の目で確かめる——それがスクレイピングを検討する第一歩です。

🚫
この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 で機械的に判定できます。ここでは robots.txt が実在するサイトとして、python.org を例にします(https://www.python.org/robots.txt をブラウザで開くと Disallow の記述を実際に確認できます)。

from urllib.robotparser import RobotFileParser

rp = RobotFileParser()
rp.set_url("https://www.python.org/robots.txt")
rp.read()

# 指定UAで、そのURLを取得してよいか
ua = "MyResearchBot/1.0"
print(rp.can_fetch(ua, "https://www.python.org/"))          # True(トップは許可)
print(rp.can_fetch(ua, "https://www.python.org/webstats/")) # False(Disallow指定あり)

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

💡
robots.txt が存在しない(404)サイトの扱い

すべてのサイトが robots.txt を置いているわけではありません。robots.txt が 404(存在しない)のサイトでは、RobotFileParser「制限なし=全パス許可」として扱いcan_fetch()True を返します。ただしこれは「robots.txt が無い=何をしてもよい」という意味ではありません。robots.txt はあくまで技術的な指示にすぎず、利用規約が自動取得を禁止していれば、robots.txt の有無にかかわらず行ってはいけません。robots.txt が無いときこそ、規約と法令の確認がいっそう重要になります。

5. 責任ある実装の作法

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

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

とくにアクセス頻度は重要です。短時間に大量のリクエストを送ると、相手から見れば攻撃(DoS)と区別がつきません。「人がブラウザで見るより明らかに遅いくらい」を目安にしましょう。間隔を空けて少しずつ取得する処理は、実行に時間がかかるぶんPCを起動したまま待つ場面も出てきます。常時稼働で回すなら、静音・省電力の環境を選んでおくと快適です(Python学習・開発向けのPC選びも参考にしてください)。

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記事と同じ分析の流れにそのまま乗せられます。BeautifulSoupやpandasを腰を据えて学びたいなら、体系立ったPython学習・データ分析の書籍を1冊手元に置くと、壊れにくいコードの書き方まで含めて理解が深まります。

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

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

  • 公式API・開発者ページ: サイトのフッターやヘルプに「API」「Developers」のリンクがないか。提供されていれば、利用規約のもとで安定したデータが得られます
  • 公的データポータル: 経済・金融指標なら、日本の e-Stat(政府統計)や米国の FRED(連邦準備制度の経済データ)など、再利用が許可された公式データが豊富です。企業の財務データ(有価証券報告書・決算情報)を Python で扱いたい場合も、金融庁の EDINET が API と XBRL 形式でデータを公開しており、みんかぶ等をスクレイピングするより安全かつ確実に取得できます
  • 専用ライブラリ: 株価の yfinance のように、面倒な取得を肩代わりしてくれるラッパーが既にあることが多いです

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

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

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

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

関係し得る法令をおおまかに挙げると、記事本文や編集された情報には著作権法が関わり、複製・再配布には権利者の許諾が必要になる場面があります。過度なアクセスでサーバーを機能不全にすれば刑法(電子計算機損壊等業務妨害・偽計業務妨害)の議論につながり得ます。ログイン後の領域を突破するような取得なら不正アクセス禁止法が問題になる余地もあります。実際に過去には、公開情報を高頻度で自動取得したことをめぐり運営側とトラブルになった事例が報じられています。どの法令にどう当たるかは事案ごとに大きく異なり、ここでは網羅も断定もできません。個別の判断が必要なら、必ず専門家(弁護士)に相談してください。

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

8. よくある質問(FAQ)

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

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

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

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

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

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

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

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

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

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

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

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