結論:Webスクレイピングは「取得していいか」を確認してから、Claude Codeに少しずつ実装させるのが安全で速い。コードを書く速さより、対象サイトの規約・robots.txt・法令を守り、相手サーバーに負荷をかけないことが最優先です。
- 要点1:着手前に「利用規約・robots.txt・著作権・関連法令」を必ず確認する。取得が許されない情報は、Claude Codeに実装させる前に止める。
- 要点2:実装は「取得→解析→保存」の3工程に分け、まずは
requests+BeautifulSoup、JavaScript描画が必要ならPlaywrightへ段階的に切り替える。 - 要点3:アクセス間隔を空ける・タイムアウトとリトライを入れる・個人情報や著作物の扱いに注意する。生成されたコードは必ず人がレビューしてから動かす。
対象読者:Claude Codeでデータ収集スクリプトを書きたい開発者・エンジニア・データ担当者。この記事で分かること:合法・安全にスクレイピングを進める判断フローと、Claude Codeへの具体的な指示文・コード例(2026年6月時点)。
「このサイトの公開データをまとめて取り込みたい」——開発をしていると、こういう要望は頻繁に来ます。手作業のコピペは数十件で限界が来るので、スクリプトで自動化したくなる。ここでClaude Codeを使うと、requestsやBeautifulSoupを使った取得コードを対話的に組み立てられて、試行錯誤がかなり速くなります。
ただ、正直に言うと、スクレイピングは「コードが書けるか」より「そもそも取得していいのか」のほうが何倍も大事です。相手のサーバーに負荷をかけたり、利用規約で禁止されているのにデータを抜いたりすれば、便利どころかトラブルの種になります。この記事では、Claude Codeでスクレイピングを実装する流れを、確認 → 実装 → 安定化 → 落とし穴の順で、エンジニア視点で整理します。

1. 目的と対象を整理する|何を・どこから・どれだけ取るか
最初にやるのは、コードを書くことではなく「要件の言語化」です。ここが曖昧なまま着手すると、Claude Codeに何を頼んでいいか自分でも分からなくなります。次の4点を先に決めましょう。
- 何を取るか(対象データ):商品名・価格・日付など、必要なフィールドを列挙する。
- どこから取るか(対象URL):単一ページか、一覧→詳細のページ遷移が必要か。
- どれだけ取るか(件数・頻度):1回限りか、定期実行か。件数が多いほど相手への負荷も増える。
- そもそもAPIはないか:公式APIやデータダウンロード(CSV・RSS・オープンデータ)があるなら、スクレイピングより先にそちらを使う。これが一番安全で安定します。
この段階でClaude Codeに渡すと、整理を手伝ってくれます。指示例はこんな感じです。
これからWebスクレイピングを検討しています。まだコードは書かないでください。
- 対象サイト: https://example.com の商品一覧ページ
- 取りたいデータ: 商品名 / 価格 / 在庫状況
- 用途: 社内の価格比較メモ(再配布はしない)
まず、(1) 公式APIやCSVダウンロードなど、スクレイピング以外の取得手段がないかを確認する観点と、
(2) 取得前に確認すべき規約・法令の論点を箇条書きで整理してください。
「まだコードは書かないで」と最初に伝えるのがコツです。Claude Codeは指示すれば実装に進みますが、スクレイピングは確認フェーズを飛ばすと危ないので、わざと止めておきます。
2. 取得してよいかを確認する|規約・robots.txt・著作権・法令
ここが本記事で一番強調したいパートです。技術的に取得できることと、取得してよいことは別物です。実装に入る前に、最低でも次の4つを確認してください。
2-1. 利用規約(Terms of Service)
多くのサイトは利用規約で「自動取得・クローリングの禁止」「データの再利用条件」を定めています。規約でスクレイピングが明確に禁止されている場合は、技術的に可能でも取得しないのが原則です。判断に迷う場合はサイト運営者に問い合わせる、あるいは法務・専門家に相談するのが安全です。
2-2. robots.txt
robots.txtは、クローラーに対して「どのパスをクロールしてよいか」を伝える慣習的な仕組みです(The Web Robots Pages)。法的拘束力そのものとは別の話ですが、運営者の意思表示として尊重するのがマナーであり、トラブル回避の基本です。Pythonには標準ライブラリurllib.robotparserがあり、取得可否をプログラムで判定できます。
import urllib.robotparser
rp = urllib.robotparser.RobotFileParser()
rp.set_url("https://example.com/robots.txt")
rp.read()
USER_AGENT = "MyResearchBot/1.0 (+https://example.com/contact)"
target = "https://example.com/products"
if rp.can_fetch(USER_AGENT, target):
print("robots.txt 上は許可されています")
else:
print("robots.txt で許可されていません。取得を中止します")
Claude Codeには、こう頼みます。
取得対象URLにアクセスする前に、urllib.robotparser を使って
robots.txt 上でそのパスが許可されているかを判定する関数を書いてください。
許可されていない場合は例外を投げて処理を止める設計にしてください。
2-3. 著作権・データベースの権利
取得したテキスト・画像・記事本文などには著作権が及ぶことがあります。「社内で参照するだけ」と「再配布・公開する」では話がまったく違います。著作物をそのまま転載・公開する用途なら、特に慎重に判断し、必要なら権利者の許諾を得てください。
2-4. 個人情報・関連法令
氏名・連絡先・購買履歴といった個人情報を含むデータは、収集・保管・利用に追加の配慮が必要です。個人情報保護法をはじめとする関連法令の範囲は用途によって変わるため、業務でグレーな領域に踏み込む場合は自己判断せず、専門家や公式窓口に確認するのが安全です。Claude Codeは法的判断の主体にはなりません。あくまで実装を助ける道具として使い、可否の最終判断は人間が行ってください。
3. 実装の進め方|取得・解析・保存とライブラリの選び方
確認が済んだら、ようやく実装です。スクレイピングは大きく取得(HTTPアクセス)→ 解析(HTMLパース)→ 保存の3工程に分けると、Claude Codeにも頼みやすく、デバッグもしやすくなります。
3-1. ライブラリの使い分け
- 静的HTML:サーバーが返すHTMLにデータが含まれているなら、
requests(HTTP取得)+BeautifulSoup(解析)で十分です。軽量で速い。 - JavaScriptで描画されるページ:表示後にJSがデータを差し込むサイトは、
requestsでは空のHTMLしか取れません。この場合はPlaywrightのようなブラウザ自動化でレンダリング後のDOMを取得します。
「まず軽い方法を試して、ダメならブラウザ自動化に上げる」という順序が、相手への負荷の意味でも実装コストの意味でも合理的です。
3-2. requests + BeautifulSoup の最小例
import time
import requests
from bs4 import BeautifulSoup
USER_AGENT = "MyResearchBot/1.0 (+https://example.com/contact)"
HEADERS = {"User-Agent": USER_AGENT}
def fetch(url: str) -> str:
res = requests.get(url, headers=HEADERS, timeout=10)
res.raise_for_status() # 4xx/5xx を例外化
return res.text
def parse(html: str) -> list[dict]:
soup = BeautifulSoup(html, "html.parser")
items = []
for card in soup.select(".product-card"):
name = card.select_one(".name")
price = card.select_one(".price")
items.append({
"name": name.get_text(strip=True) if name else None,
"price": price.get_text(strip=True) if price else None,
})
return items
if __name__ == "__main__":
html = fetch("https://example.com/products")
rows = parse(html)
print(f"{len(rows)} 件取得")
time.sleep(2) # 連続アクセス時は間隔を空ける
Claude Codeへの指示は、いきなり全部ではなく工程ごとに切るのがコツです。
requests と BeautifulSoup を使って、以下を満たすスクレイパーを段階的に書いてください。
1. fetch(url): User-Agent を明示し、timeout=10、raise_for_status() で失敗を例外化
2. parse(html): 商品カードから 商品名・価格 を辞書のリストで返す
3. main: 1ページだけ取得して件数を表示
まずは1ページ分だけ。複数ページ巡回はこの後で別途指示します。
3-3. 保存はスキーマを決めてから
取得後はCSVやJSON、用途によってはSQLiteに保存します。先に「どのカラムを持つか」を決めておくと、Claude Codeに保存処理を書かせるときもブレません。CSV保存なら標準ライブラリのcsvで十分です。
4. エラー処理と安定化|止まらない・暴走しないスクレイパーにする
スクレイピングは「相手のサーバー次第」なので、エラーが出る前提で組みます。ここを省くと、一時的な通信エラーで全件失敗したり、逆にリトライが暴走して相手に連打を浴びせたりします。
- タイムアウトを必ず設定:
requests.get(..., timeout=10)のように。無指定だと応答がないURLで処理が固まります。 - リトライは回数上限つきで:一時的な5xxやタイムアウトだけ、数回だけ再試行する。無限リトライは禁止です。
- アクセス間隔を空ける:ループ内に
time.sleep()を入れ、相手サーバーに負荷をかけない。件数が多いほど間隔を広げる意識を持つ。 - 失敗を握りつぶさない:どのURLで何が起きたかをログに残す。後から「どこまで取れたか」を追えるようにする。
import time
import requests
def fetch_with_retry(url: str, headers: dict, max_retries: int = 3) -> str | None:
for attempt in range(1, max_retries + 1):
try:
res = requests.get(url, headers=headers, timeout=10)
res.raise_for_status()
return res.text
except requests.exceptions.RequestException as e:
wait = attempt * 2 # 2s, 4s, 6s と間隔を広げる
print(f"[retry {attempt}/{max_retries}] {url} -> {e} ({wait}s 待機)")
time.sleep(wait)
print(f"[failed] {url} は {max_retries} 回試行しても取得できませんでした")
return None
Claude Codeには、安定化を後付けで頼めます。デバッグの考え方はClaude Codeでデバッグ・障害調査を効率化する実践ガイドも参考になります。
このスクレイパーに、次の安定化を追加してください。
- リトライは最大3回まで。待機時間は試行回数に比例させる(2s, 4s, 6s)
- リトライ対象は通信エラーと5xxのみ。4xx(規約違反やNot Found)は即中止
- 各URLの成功/失敗を1行ログに残す
無限ループや指数的に試行回数が増える実装は避けてください。
5. 落とし穴と注意点|負荷・規約・法令・人間レビュー
最後に、現場でやりがちな失敗を❌⭕形式でまとめます。コードの巧拙より、ここを外さないことが本質です。
- ❌ 並列で一気に叩く ⭕ 直列+間隔:速くしたくて並列リクエストを増やすと、相手サーバーへの負荷が跳ね上がり、結果としてアクセス遮断やトラブルにつながります。まずは直列で間隔を空ける。
- ❌ robots.txt・規約を見ずに着手 ⭕ 確認を実装の前提条件にする:「動いたから良し」ではなく、取得可否を先に判定し、NGなら止まる設計にする。
- ❌ 個人情報・著作物を雑に保存/再配布 ⭕ 用途を限定し、配布は権利を確認:社内参照と公開はまったく別。グレーなら専門家に相談する。
- ❌ 生成コードをそのまま本番実行 ⭕ 人がレビューしてから動かす:Claude Codeが書いたコードでも、アクセス頻度・対象URL・保存先を人間が必ず点検する。AIは判断の責任を負いません。
Claude Codeを安全に走らせる設定面(権限・確認プロンプト)は公式のClaude Code Overviewでも触れられています。スクレイパーのようにネットワークアクセスを伴うコードは、いきなり全権限を渡さず、まず読み取り・差分確認を挟む運用が無難です。
まとめ|「確認してから実装」がスクレイピングの近道
Claude Codeを使えば、requests+BeautifulSoupからPlaywrightまで、スクレイピングの実装スピードは確実に上がります。ですが本当の難所はコードではなく、取得してよいかの判断と相手に負荷をかけない配慮です。利用規約・robots.txt・著作権・関連法令を確認し、アクセス間隔とリトライ上限を守り、生成コードは人がレビューする。この順序を守れば、自動化のメリットだけを安全に取りに行けます。
Pythonでの実装をもっと整えたい人はPython開発をClaude Codeで効率化する実践ガイド、定期実行のCLIツール化を考えるならCLIツール・自作コマンドをClaude Codeで作る実践ガイド、全体像はClaude Code 実践テクニック完全ガイドもあわせてどうぞ。
次にやること
- 取得したいサイトの利用規約とrobots.txtを実際に開いて、自動取得の可否を確認する。
- 公式API・CSV・RSS・オープンデータなど、スクレイピング以外の取得手段がないかを先に探す。
- 本記事の最小例をベースに、Claude Codeへ「1ページだけ取得する」指示から始め、安定化を後付けする。