Contents
1. スクレイピングとは何か ― 基本概念
| 用語 | 説明 |
|---|---|
| Webスクレイピング | プログラム(主に Python)を用いて、HTML・JSON 等の公開データを自動取得し、構造化された形で保存する技術。 |
| クローラ / ボット | 複数ページを巡回して情報を収集するプログラム全般。 |
| 対象ページ | 静的 HTML(requests+BeautifulSoup)と、JavaScript で動的生成されるコンテンツ(Selenium 等)に分かれる。 |
2. 法的留意点 ― 「robots.txt」だけでは足りない
2‑1. 法律上の主なリスク
| 項目 | 主な根拠法令・判例 | 留意点 |
|---|---|---|
| 著作権 | 著作権法第2条(思想・感情を表現したもの) | 取得したテキストや画像が「著作物」かどうかを判断し、引用の範囲と出典表示を守る。 |
| 個人情報保護 | 個人情報保護法 | 氏名・住所・電話番号等の個人情報を取得した場合は、利用目的の明示・適正管理が必須。 |
| 不正アクセス防止 | 不正アクセス行為の禁止等に関する法律(不正アクセス法) | サイト側が認証やトークンで保護しているページへ無断でアクセスすると違法になる可能性。 |
| 契約上の規制 | 利用規約・サービス提供条件 | 「本サイトのデータを自動取得しない」旨が明記されていれば、契約違反となり損害賠償請求リスクがある。 |
2‑2. robots.txt の位置付け
- 技術的指示:検索エンジンなどに対して「クロール許可/禁止」を示すだけのテキストファイルです。
- 法的効力は 直接的な根拠ではない が、裁判例(米国・EU での判断)では「サイト運営者の意向を無視した取得が不誠実行為」と評価されることがあります。
- 従って
robots.txtを確認するだけで合法とは限らず、利用規約や著作権法と合わせて総合的に判断 してください。
2‑3. 実務上のチェックリスト
robots.txtの対象パスを確認(Disallow がないか)。- 利用規約(Terms of Service) に「データ抽出」や「API 以外の取得」の禁止条項が無いか。
- 著作権・個人情報 が関与するかどうかを社内でレビュー。
- 取得頻度とサーバ負荷 を配慮し、1 秒以上のインターバルやランダム待機時間を設定。
- 疑義が残る場合は必ず専門家に相談。
3. 開発環境構築 ― 推奨ライブラリとサンプルコード
3‑1. 仮想環境の作成(venv)
|
1 2 3 4 5 6 7 8 |
# Windows python -m venv .venv .\.venv\Scripts\activate # macOS / Linux python3 -m venv .venv source .venv/bin/activate |
3‑2. 静的ページ取得(requests + BeautifulSoup)
|
1 2 |
pip install requests beautifulsoup4 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import requests, csv from bs4 import BeautifulSoup def fetch(url: str) -> BeautifulSoup: resp = requests.get(url, timeout=10, headers={"User-Agent":"Mozilla/5.0"}) resp.raise_for_status() return BeautifulSoup(resp.text, "html.parser") soup = fetch("https://quotes.toscrape.com") rows = [] for block in soup.select(".quote"): text = block.select_one(".text").get_text(strip=True) author = block.select_one(".author").get_text(strip=True) rows.append({"text": text, "author": author}) with open("quotes.csv", "w", newline="", encoding="utf-8") as f: writer = csv.DictWriter(f, fieldnames=["text", "author"]) writer.writeheader() writer.writerows(rows) |
3‑3. 動的ページ取得(Selenium + webdriver-manager)
|
1 2 |
pip install selenium webdriver-manager |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC options = webdriver.ChromeOptions() options.add_argument("--headless") driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options) driver.get("https://example-dynamic.com") # 例: 商品名がロードされるまで待機 items = WebDriverWait(driver, 10).until( EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".product-name")) ) for i in items: print(i.text) driver.quit() |
ポイント
User-Agentを設定して人間のブラウザと同様に見せる。
WebDriverWaitで要素が出現するまで待つと、time.sleepより安定。
4. 無料教材の紹介とライセンス情報(2026‑04‑22 時点)
| 教材 | 配布元・URL | 主な内容 | ライセンス(執筆時) |
|---|---|---|---|
| 堀川圭一氏 PPT | note – Python教材 | 308 ページのスライド。ラムダ式・OpenCV まで網羅。 | CC BY‑NC 4.0(非営利利用のみ、出典必須) |
| 三谷純教授 PDF | 筑波大学リポジトリ | 第 9 章が「Webスクレイピング」実装例。 | CC BY 4.0(表示義務のみ) |
| AI Academy 記事 | AI Academy – スクレイピング入門 | 初心者向けコードとエラーハンドリングのベストプラクティス。 | 独自利用規約(無料閲覧可、転載・再配布は不可) |
注意:各教材のライセンスは執筆時点で公表されているものです。実際に社内研修や商用プロジェクトで使用する場合は、最新の利用条件を必ず公式ページで確認してください。
5. ライセンス遵守チェックリスト
- 表示( attribution ) を忘れない
© 堀川圭一 (CC BY‑NC 4.0)のように出典とライセンス表記をコードや資料冒頭へ。- 非営利か商用か を判定
- NC(Non‑Commercial)条項がある場合は、社内利用でも「利益追求目的の外部提供」は禁止。
- 改変の可否
- CC BY 系は改変自由。NC 系は非営利範囲であれば改変可能だが、元作者へのクレジットは必須。
- 再配布の許可
- AI Academy のように「コピー・配布禁止」と明示された場合、教材自体を社内共有サーバへ保存するだけでも違反になる恐れがあります。
6. 1 週間集中学習プランと実践課題
プラン概要
| Day | 学習テーマ | 演習例 |
|---|---|---|
| 1‑2 | 基礎概念 & 静的取得 | quotes.toscrape.com から名言を CSV 出力 |
| 3‑4 | 動的取得 | Selenium で JavaScript 商品一覧ページから価格・在庫情報を抽出 |
| 5 | 教材別演習(堀川 PPT) | スライドの練習問題をコード化し、ローカルテスト |
| 6 | 応用課題(三谷 PDF) | 複数ニュースサイトから本文抽出 → Janome で形態素解析 |
| 7 | 成果物レビュー & 次ステップ策定 | GitHub にリポジトリ作成、README に実行手順・ライセンス情報を記載 |
実装課題例(商品価格比較クローラ)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
import csv, datetime, random, time import requests from bs4 import BeautifulSoup def fetch(url: str) -> BeautifulSoup: headers = {"User-Agent":"Mozilla/5.0 (compatible; Bot/1.0)"} r = requests.get(url, timeout=10, headers=headers) r.raise_for_status() return BeautifulSoup(r.text, "html.parser") def parse(soup: BeautifulSoup) -> dict: name = soup.select_one(".product-title").get_text(strip=True) price = int(soup.select_one(".price").get_text().replace("¥","")) stock = "在庫あり" if soup.select_one(".in-stock") else "品切れ" return {"name": name, "price": price, "stock": stock} sites = [ "https://example-shop1.com/item/123", "https://example-shop2.com/item/456" ] with open("price_compare.csv","w",newline="",encoding="utf-8") as f: writer = csv.DictWriter(f, fieldnames=["site","name","price","stock","date"]) writer.writeheader() for url in sites: time.sleep(random.uniform(1.5, 3.0)) # サーバ負荷軽減 data = parse(fetch(url)) data["site"] = url.split("//")[1].split("/")[0] data["date"] = datetime.datetime.now().isoformat() writer.writerow(data) |
実務的ポイント
User-Agentの偽装は常に許可された範囲で行う。
取得間隔はサイト側のレートリミットやrobots.txtの推奨を尊重すること。
7. 実務活用事例と技術的・法的ベストプラクティス
| シナリオ | 技術スタック | 法的留意点 |
|---|---|---|
| 競合価格比較ダッシュボード | requests → pandas → S3 保存 → PowerBI 連携 |
・取得頻度は 1 日 1 回程度に抑える。 ・利用規約で「価格情報の自動収集」が禁止されていないか必ず確認。 |
| ニュース記事テキストマイニング | Selenium → BeautifulSoup → Janome(形態素解析) |
・記事本文に個人情報が混在する可能性がある場合は正規表現でマスク。 ・著作権保護対象の全文転載は「引用」範囲を超えるため禁止。 |
| 社内データクレンジングツール | pandas + カスタムクラスター分析 |
・取得したデータが個人情報に該当する場合、社内だけでの利用でも目的外使用とならないよう内部規程を策定。 |
重要なベストプラクティス
- リクエストヘッダーに適切な
User-Agentを設定(偽装は許可された範囲に留める)。 - ランダムウェイトでサーバ負荷を分散。
- 取得データの保存先はアクセス制御が施された場所(社内ネットワーク、暗号化ストレージ等)。
- 法的リスクが残る場合は必ず書面で許諾取得し、取得ログを残す。
8. まとめと次のステップ
- 技術面:
requests + BeautifulSoupとSeleniumの組み合わせで、ほぼ全ての Web ページからデータ取得が可能になる。仮想環境で依存管理を徹底し、コードは GitHub などでバージョン管理すると安心です。 - 法的面:著作権・個人情報保護・利用規約の3本柱をチェックリスト化し、
robots.txtは「参考情報」程度に留めて総合的に判断してください。疑義がある場合は専門家への相談が必須です。 - 学習リソース:堀川氏 PPT(CC BY‑NC 4.0)、三谷教授 PDF(CC BY 4.0)、AI Academy 記事(独自規約)を組み合わせれば、基礎から実務応用まで体系的に学べます。
- 実務導入:まずは社内で小規模なプロトタイプ(例:価格比較クローラ)を作り、法務部とライセンスチェックを行った上で、本格運用へ拡大しましょう。
最後に:Webスクレイピングは強力なデータ取得手段ですが、「技術的にできる」ことと「法律・契約上許容される」ことは別問題です。常に最新の規約を確認し、適切なガバナンス体制を構築したうえで活用してください。