この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:3
ページ更新者:T
更新日時:2026-06-11 07:07:02

タイトル: Webスクレイピング
SEOタイトル: Webスクレイピングとは|Python で始めるサンプルコード・robots.txt・利用規約・法的注意点まとめ

この記事の要点
  • Webスクレイピングとは、Web ページの HTML を取得して必要な情報を抽出する技術
  • Python なら requests + BeautifulSoup が定番。動的レンダリングが必要なら Playwright / Selenium
  • robots.txt、利用規約、レート制限の遵守が必須。やりすぎると業務妨害罪・著作権侵害・規約違反に問われる
  • API が提供されているサイトは必ず API を優先。スクレイピングは最終手段

Webスクレイピングとは

Webスクレイピング 概念図

Webスクレイピングとは、Web サイトの HTML を取得して必要な情報を抽出するプログラミング技術の総称です。主な用途は次の通りです。

  • 価格情報・在庫情報の収集
  • ニュース記事や口コミ等のテキスト集約
  • 研究用データセットの構築
  • 外部 API が提供されていないサービスからの情報取得

各プログラミング言語にスクレイピング用ライブラリが整備されているため、HTML 取得・パース・保存までを比較的少ない行数で実装できます。一方でサイト側の利用規約で禁止されているケースが多く、技術的にも法的にも注意点が多い分野です。

仕組み

スクレイピングは大きく次の 3 ステップで動作します。

  1. HTTP リクエスト: 対象 URL に GET リクエストを送り HTML を取得する
  2. パース: HTML を DOM ツリーに変換し、CSS セレクタや XPath で必要な要素を抽出
  3. 保存: CSV / JSON / DB などに保存して後続処理へ繋げる

Python での実装例 - requests + BeautifulSoup

静的な HTML を取得して解析する場合は、requests(HTTP クライアント)と beautifulsoup4(HTML パーサ)の組み合わせが最も簡単です。

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

URL = "https://example.com/articles"
HEADERS = {
    "User-Agent": "MyScraper/1.0 (contact: me@example.com)"
}

res = requests.get(URL, headers=HEADERS, timeout=10)
res.raise_for_status()

soup = BeautifulSoup(res.text, "html.parser")

for item in soup.select("article.post"):
    title = item.select_one("h2").get_text(strip=True)
    link = item.select_one("a")["href"]
    print(title, link)

time.sleep(1)  # 次のリクエストまで間隔を空ける

ポイントは User-Agent を明示することタイムアウトを設定すること連続リクエスト間に sleep を挟むことです。これらを怠るとサーバーに過剰な負荷を与え、IP ブロックや法的トラブルの原因になります。

JavaScript で描画されるページへの対応

SPA や JavaScript で動的にレンダリングされるページは、requests で取得した HTML には目的の要素が含まれません。この場合はヘッドレスブラウザ(Playwright / Selenium)でブラウザごと実行します。

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(headless=True)
    page = browser.new_page()
    page.goto("https://example.com/spa-page", wait_until="networkidle")
    titles = page.locator("h2.post-title").all_text_contents()
    print(titles)
    browser.close()

守るべきルール

1. robots.txt を確認する

サイトのルートにある /robots.txt でクローラ向けの許可/禁止が定義されています。Disallow されているパスへのアクセスは避けるのが基本です。

curl https://example.com/robots.txt

2. 利用規約・著作権を確認する

サイトの利用規約に「スクレイピング禁止」「自動アクセス禁止」と明記されているケースは少なくありません。違反すると規約違反として民事責任を問われる可能性があり、収集データの転載は著作権侵害に該当する場合もあります。

3. アクセス頻度を抑える

1 秒以下の高頻度でアクセスし続けるとサーバーに過負荷を与え、業務妨害として刑事責任を問われた事例も日本国内で存在します。最低でも 1〜数秒の間隔を空けるか、サイト指定のクロール間隔に従いましょう。

4. 公式 API があれば必ず API を使う

X(旧 Twitter)、YouTube、楽天、Amazon など主要サービスは公式 API を提供しています。HTML を取りに行く前に API の有無を必ず確認してください。API は安定性・利用規約の明確さ・将来の保守性すべてでスクレイピングに勝ります。

コピーサイトを作らないこと

スクレイピングを使うと既存サイトのコンテンツを丸ごと複製した「コピーサイト」を比較的簡単に作れてしまいますが、これは著作権侵害に直結する行為です。データを取得しても、そのまま再公開するのではなく、独自の付加価値を加える、リンク元として明示する、といった倫理的・法的な配慮を欠かさないようにしましょう。

パース手法の使い分け

HTML から要素を抽出する方法には、CSS セレクタ・XPath・正規表現の 3 通りがあります。CSS セレクタは Web 制作で慣れ親しんだ記法で、BeautifulSoupselect()lxmlcssselect で利用できます。XPath はパスをツリー上の条件で記述するため、「親の前の兄弟」のような複雑な参照が可能で、表形式データの抽出に強みがあります。正規表現は最後の手段で、HTML 構造の変化に極端に弱いため極力使わないのが鉄則です。「クラス名がたまたま空白を含む」だけで一気に壊れます。

非同期スクレイピングと並列実行

大量ページを取得する場合は asyncio + aiohttp を組み合わせると圧倒的に高速になります。ただし非同期にすると意図せず連続リクエストを送りすぎて相手のサーバーを攻撃する形になりやすいため、asyncio.Semaphore で同時接続数を 3〜5 程度に絞り、各タスク内で await asyncio.sleep(1) を入れるのが現実的なバランスです。スレッドプールの concurrent.futures.ThreadPoolExecutor も同様の用途で使えますが、I/O バウンドな処理では asyncio の方が軽量です。

クローラーとの違い

スクレイピングが「特定ページから必要なデータを抽出する」ことに焦点を当てるのに対し、クローラー (crawler) は「リンクを辿って多数のページを巡回する」仕組みです。検索エンジンの Googlebot が代表例です。実務ではこの 2 つを組み合わせ、まずクローラーで対象ページを発見し、各ページに対してスクレイピングを行うという二段構えで実装します。フレームワークとしては Scrapy が高機能で、リクエスト並列・パイプライン・自動リトライ・robots.txt 遵守などをデフォルトで備えており、本格運用向きです。

データ保存とインクリメンタル更新

取得したデータをそのまま CSV に追記し続けると重複が積もるため、ユニークキー(URL や記事 ID)を主キーとした SQLite / PostgreSQL に保存し、UPSERT で挿入・更新を分岐させるのが堅実です。差分だけ取得したい場合は、前回取得時の最終更新日時を記録しておき、If-Modified-Since ヘッダや、RSS / sitemap.xml の lastmod を参照する設計が有効です。これにより、対象サイトへの負荷も自分の処理時間も大幅に削減できます。

ログインが必要なサイトへの対応

会員制サイトや管理画面など、ログインが必要なページをスクレイピングする場合は、まず認証フォームに POST してセッション Cookie を取得し、その Cookie を保持したまま後続のページを取得します。requests.Session() を使うと自動的に Cookie が引き継がれるため便利です。ただし利用規約で第三者ツールによる自動ログインを禁じているサイトも多く、規約違反が判明すればアカウント停止や法的措置の対象になります。BOT 検知のために CAPTCHA や JavaScript チャレンジ(Cloudflare 等)が挿入されている場合、回避を試みると不正アクセス禁止法に該当するリスクもあり、絶対に避けるべきです。

User-Agent と識別の作法

HTTP リクエストの User-Agent ヘッダは、本来「どんなクライアントから来たか」をサーバーに伝えるものです。スクレイピングでは Web ブラウザの UA をそのまま借りるサンプルが多く出回っていますが、これは偽装行為です。良識的なクローラーは MyAppName/1.0 (+https://example.com/bot) のように、自分の名前と連絡先を含む UA を名乗ります。これによりサイト管理者は問い合わせ先を知ることができ、もし負荷が問題になれば直接コンタクトしてもらえる関係が築けます。逆に偽装 UA で連打アクセスをしていると、検知された段階で IP ブロック・法的通告に直結します。

取得結果のクレンジング

取得した HTML から要素を抜いた後、テキストには余分な空白・改行・タブ・全角スペース・ゼロ幅文字などが混在することが多く、そのまま保存すると分析時に困ります。str.strip() で前後の空白を除き、正規表現 re.sub(r"\s+", " ", text) で連続空白を 1 個に圧縮するのが最低限。さらに HTML エンティティ(&  など)の復号、Unicode 正規化 (NFKC)、改行コードの統一など、データ品質に直結する処理を実装しましょう。クレンジングを後回しにすると、データ分析や機械学習モデルの精度が大きく下がる原因になります。

関連記事