コラム Claude Code入門 更新:

Claude CodeでWebスクレイピングをする方法!PlaywrightとBeautifulSoupを使った自動収集

Claude CodeでWebスクレイピングをする方法!PlaywrightとBeautifulSoupを使った自動収集
目次 (22項目)
  1. 1. はじめに
  2. 2. 目次
  3. 3. 1. スクレイピングツールの選択
  4. ツール選択の基準
  5. ツール比較
  6. 4. 2. BeautifulSoupによる静的ページのスクレイピング
  7. 基本的なスクレイピング
  8. CSSセレクターの自動解析
  9. 5. 3. Playwrightによる動的ページのスクレイピング
  10. SPAのスクレイピング
  11. ログインが必要なページのスクレイピング
  12. APIリクエストの傍受
  13. 6. 4. データの抽出・クリーニング・保存
  14. 構造化データの抽出
  15. 7. 5. エラーハンドリングと再試行の実装
  16. 堅牢なスクレイピングの実装
  17. 8. 6. 定期実行スクリプトの構築
  18. cronによる定期実行
  19. 9. 7. スクレイピングのベストプラクティス
  20. 守るべきルール
  21. 10. 8. まとめ
  22. 11. よくある質問(FAQ)

はじめに

「特定のサイトからデータを定期的に収集したい」

「JavaScriptで動的に生成されるページのスクレイピングがうまくいかない」

「スクレイピングコードを書いたが、サイト改修のたびに壊れる」

Webスクレイピングはデータ収集の強力な手段ですが、動的ページへの対応・エラーハンドリング・サイト変更への追従など、維持管理が大変です。Claude Codeを使えば、スクレイピングコードの生成から保守まで効率的に進められます。

重要: スクレイピングを行う際は対象サイトの利用規約・robots.txtを必ず確認し、過度な負荷をかけないようにしてください。

目次

  1. スクレイピングツールの選択
  2. BeautifulSoupによる静的ページのスクレイピング
  3. Playwrightによる動的ページのスクレイピング
  4. データの抽出・クリーニング・保存
  5. エラーハンドリングと再試行の実装
  6. 定期実行スクリプトの構築
  7. スクレイピングのベストプラクティス
  8. まとめ

1. スクレイピングツールの選択

ツール選択の基準

> スクレイピングしたいサイトのURLを伝えます。
  最適なツールと実装方針を提案してください。

  URL:[対象URLを入力]

  確認してほしいこと:
  - 静的ページかJavaScriptで動的生成されるページか
  - ログインが必要か
  - robots.txtで許可されているか
  - APIが公開されていないか(APIの方が安定する場合が多い)

ツール比較

ツール 向いているケース 言語
BeautifulSoup 静的HTML・シンプルな構造 Python
Playwright SPA・ログイン必須・ブラウザ操作 Python・JS・TS
Scrapy 大規模・複数サイト Python
Puppeteer Node.jsプロジェクト・Chrome自動操作 JavaScript

2. BeautifulSoupによる静的ページのスクレイピング

基本的なスクレイピング

> 以下のWebページから商品情報をスクレイピングするコードを作成してください。

  対象URL:[URLを入力]
  取得する情報:商品名・価格・在庫状況・商品URL

  要件:
  - requestsとBeautifulSoupを使用
  - User-Agentを設定する
  - リクエスト間に1〜3秒のランダムな待機時間を設ける
  - 取得結果をCSVとJSONの両方で保存
  - ページネーションに対応(最大10ページ)

CSSセレクターの自動解析

> このHTMLから必要なデータを抽出するコードを書いてください。
  適切なCSSセレクターまたはXPathを自動で判断してください。

  取得したいデータ:タイトル・著者・日付・本文の最初の段落

  [HTMLを貼り付け]

3. Playwrightによる動的ページのスクレイピング

SPAのスクレイピング

> Playwrightを使って、Reactで作られたSPAのデータを
  スクレイピングするコードを作成してください。

  要件:
  - ページが完全に読み込まれるまで待機
  - 無限スクロールのページを最後まで取得
  - スクリーンショットをデバッグ用に保存
  - ヘッドレスモードで実行

  取得するデータ:[取得したいデータを記述]

ログインが必要なページのスクレイピング

> ログインが必要なページのスクレイピングをPlaywrightで実装してください。

  ログインフロー:
  1. ログインページにアクセス
  2. メールアドレス・パスワードを入力
  3. 2段階認証(TOTPコード)を入力
  4. ログイン後のダッシュボードにアクセス

  認証情報は環境変数から取得してください。
  セッションを保存して再利用できるようにしてください。

APIリクエストの傍受

> Playwrightのネットワーク傍受機能を使って、
  ページが内部的に呼び出しているAPIのレスポンスを取得してください。

  ブラウザ操作よりもAPIから直接取得した方が
  効率的な場合は、その方法も提案してください。

4. データの抽出・クリーニング・保存

構造化データの抽出

> スクレイピングで取得したHTMLから構造化データを抽出してください。

  抽出後の処理:
  - 不要なHTMLタグの除去
  - 文字列の正規化(前後空白・改行・全角半角)
  - 日付フォーマットの統一(ISO 8601形式)
  - 価格のパース(「¥1,234」→1234)
  - 欠損値の処理

  結果をPandasのDataFrameで管理して、
  CSVとSQLiteの両方に保存してください。

5. エラーハンドリングと再試行の実装

堅牢なスクレイピングの実装

> このスクレイピングコードにエラーハンドリングと
  再試行機能を追加してください。

  対応するエラー:
  - ネットワークエラー(3回まで指数バックオフで再試行)
  - タイムアウト(30秒でタイムアウト・再試行)
  - 503エラー(5分待機後に再試行)
  - ページ構造の変更(アラートを送信して停止)
  - レート制限(429エラー:待機時間に従って再試行)

  エラーログはJSONL形式でファイルに保存してください。

6. 定期実行スクリプトの構築

cronによる定期実行

> このスクレイピングスクリプトを定期実行する仕組みを構築してください。

  実行スケジュール:
  - 毎日9:00・12:00・18:00(JST)に実行
  - 前回との差分のみ保存(重複排除)
  - 新しいデータが取得できた場合はSlackに通知
  - 実行ログをデータベースに記録

  cron・GitHub Actions・どちらで実装するか提案してください。

7. スクレイピングのベストプラクティス

守るべきルール

> このスクレイピングコードが以下のマナーを守っているか確認してください:

  - robots.txtの確認・遵守
  - リクエスト間の適切な待機時間(1〜3秒以上)
  - User-Agentの適切な設定(ボットであることを明示)
  - 同時接続数の制限(1〜2接続以下)
  - キャッシュの活用(同じページを何度も取得しない)
  - 利用規約の遵守確認

8. まとめ

Claude CodeでのWebスクレイピングの効率化ポイント:

  • HTMLの構造を分析して最適なCSSセレクターを自動生成
  • 動的ページ・ログイン必須ページへのPlaywright対応を自動実装
  • エラーハンドリング・再試行ロジックを確実に実装
  • 定期実行・差分取得・通知の仕組みを一括構築

ツール選択の基本原則:

  • 静的HTML → requests + BeautifulSoup
  • JavaScript動的ページ → Playwright
  • 大規模クローリング → Scrapy
  • まずAPIがないか確認する

次回の第34回:GraphQL APIを開発する方法では、スキーマ設計からリゾルバ実装まで解説します。

よくある質問(FAQ)

Q. IPブロックされた場合はどうすればいいですか?

A. まず適切なリクエスト間隔・User-Agentの設定を見直すことをお勧めします。Claude Codeに「このスクレイピングコードでIPブロックを回避するベストプラクティスを実装してください」と相談できます。ただし、利用規約に反するスクレイピングは行わないでください。

Q. JavaScriptが実行されないとデータが取得できないページは?

A. Playwrightを使ってClaude Codeに依頼することで対応できます。また、ブラウザの開発者ツールでネットワークタブを確認すると、内部APIが使われている場合があり、そちらを直接叩く方が効率的なケースもあります。

この記事はClaude Code入門シリーズ(第4部)の第33回です。← 第32回:IaC・Terraform第34回:GraphQL API開発 →

ご質問はお問い合わせページからお気軽にどうぞ。

著者:R-LLM 開発者

フォロー

Webエンジニアとして10年以上のキャリアがあり、現在はWordPressとLLM(大規模言語モデル)の連携、および生成AIを活用した課題解決のための開発に日々取り組んでいます。

私の信条は、クライアントに寄り添った伴走支援と、最後まで責任を持ってやり遂げる「遂行力」です。これまでの膨大なトライ&エラーの蓄積により、自身の領域内であれば不具合も迅速に解決できる現場の知見を積み上げてきました。

このブログでは、一人のエンジニアとして私自身がAI技術に抱いている純粋な興味をベースに、日々の探求プロセスを発信しています。

生成AILLMをどのように実務に組み込み、価値へ繋げていくか。自身の検証結果だけでなく、実務者としての視点に基づいた「考察や推察」も含めて共有することで、同じように試行錯誤を続ける方々と知見を繋げていければと考えています。

関連記事

SHARE Xでシェア
← 前の投稿
投稿一覧に戻る
次の投稿 →