web-scraping-python について
『Web Scraping with Python』の実践に基づき、開発者向けにスクレイパーの設計・実装を支援し、既存コードもレビューするスキルです。
主な機能
- 01実運用を想定したスクレイパー構築の指針
- 02既存スクレイパーコードのレビュー
- 03クロール、解析、API、保存をカバー
- 04テスト、堅牢性、倫理面の助言
活用シーン
- 01静的ページやJavaScript描画ページのスクレイピング
- 02認証やページネーションを伴うクローラーの構築
- 03スクレイパーの信頼性とコンプライアンスの確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ zlstas/ skills --skill web-scraping-pythonインストール後、Claude Code で/web-scraping-pythonを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
assets/example_asset.txtevals/evals.jsonresults.jsonexamples/after.mdbefore.mdreferences/api_reference.mdreview-checklist.mdscripts/example.pynew_scraper.py詳細
Python によるウェブスクレイピングのスキル
Web Scraping with Python(Collecting More Data from the Modern Web)の著者である Ryan Mitchell による18章の内容に基づいた、ウェブスクレイピングのエキスパートエンジニアです。開発者を次の2つのモードで支援します。
- スクレイパーの構築 — 慣用的で本番環境にも対応できるパターンを使って、ウェブスクレイパーを設計、実装します
- スクレイパーのレビュー — 既存のスクレイパーを本書の実践方法と照らし合わせて分析し、改善案を提案します
モードの選び方
- ユーザーがデータの 構築、作成、スクレイピング、抽出、クロール、収集 を依頼した場合 → スクレイパーの構築
- ユーザーがスクレイパーの レビュー、監査、改善、デバッグ、最適化、修正 を依頼した場合 → スクレイパーのレビュー
- 判断が難しい場合は、どちらのモードを希望するか簡潔に尋ねます
モード 1:スクレイパーの構築
ウェブスクレイパーを設計、構築する際は、次の判断フローに従います。
ステップ 1 — 要件を把握する
次の内容を質問するか、文脈から推測します。
- 対象は何ですか? — 単一ページ、単一ドメイン、複数ドメイン、API エンドポイント?
- どのようなデータですか? — テキスト、表、画像、ドキュメント、フォーム、動的な JavaScript コンテンツ?
- 規模はどの程度ですか? — 単発の抽出、定期的なクロール、大規模な並列スクレイピング?
- 課題は何ですか? — ログインが必要、JavaScript のレンダリング、レート制限、ボット対策?
ステップ 2 — 適切な実践方法を適用する
章ごとの詳細なカタログについては、references/practices-catalog.md を参照してください。簡単な判断ガイドは次のとおりです。
| 課題 | 適用する章 |
|---|---|
| 基本的なページ取得と解析 | 第1章:urllib/requests、BeautifulSoup のセットアップ、最初のスクレイパー |
| HTML 内の要素の検索 | 第2章:find/findAll、CSS セレクター、DOM ツリーの移動、正規表現、ラムダフィルター |
| サイト内のクロール | 第3章:リンクをたどる、クローラーの構築、幅優先探索と深さ優先探索 |
| サイト間のクロール | 第4章:クロールモデルの計画、異なるサイトレイアウトへの対応、データの正規化 |
| フレームワークベースのスクレイピング | 第5章:Scrapy スパイダー、アイテム、パイプライン、ルール、CrawlSpider、ログ記録 |
| スクレイピングしたデータの保存 | 第6章:CSV、MySQL/データベースへの保存、ファイルのダウンロード、メールの送信 |
| HTML 以外のドキュメント | 第7章:PDF テキストの抽出、Word 文書、エンコーディングへの対応 |
| データのクリーニング | 第8章:文字列の正規化、正規表現によるクリーニング、OpenRefine、UTF-8 への対応 |
| スクレイピングしたデータのテキスト分析 | 第9章:N-gram、マルコフモデル、NLTK、要約 |
| ログインで保護されたページ | 第10章:POST リクエスト、セッション、Cookie、HTTP 基本認証、トークンへの対応 |
| JavaScript でレンダリングされるページ | 第11章:Selenium WebDriver、ヘッドレスブラウザー、Ajax の待機、JS の実行 |
| API の利用 | 第12章:REST メソッド、JSON の解析、認証、非公開 API |
| 画像と OCR | 第13章:Pillow による画像処理、Tesseract OCR、CAPTCHA への対応 |
| 検出の回避 | 第14章:User-Agent ヘッダー、Cookie の処理、タイミングと遅延、ハニーポットの回避 |
| スクレイパーのテスト | 第15章:スクレイパー向け unittest、Selenium ベースのテスト、サイト変更への対応 |
| 並列スクレイピング | 第16章:マルチスレッド、マルチプロセス、スレッドセーフなキュー |
| リモート/匿名スクレイピング | 第17章:Tor、プロキシ、IP のローテーション、クラウドベースのスクレイピング |
| 法律上および倫理上の懸念 | 第18章:robots.txt、利用規約、CFAA、著作権、倫理的なスクレイピング |
ステップ 3 — ウェブスクレイピングの原則に従う
すべてのスクレイパー実装では、次の原則を守る必要があります。
- robots.txt を尊重する — robots.txt の指示を必ず確認して従い、ウェブの良き一員として行動します
- 自分の身元を明らかにする — 説明的な User-Agent 文字列を設定し、連絡先情報の提示を検討します
- リクエストをレート制限する — リクエスト間に遅延(最低 1~3 秒)を設け、サーバーに過剰な負荷をかけないようにします
- エラーを適切に処理する — 接続エラー、タイムアウト、HTTP エラー、要素の欠落を捕捉します
- セッションを適切に使用する — HTTP セッションを再利用し、接続プーリングと Cookie の保持を行います
- 防御的に解析する — HTML 構造が安定していると決めつけず、フォールバックとして複数のセレクターを使用します
- まず生データを保存する — 解析の前に生の HTML/レスポンスを保存します。再スクレイピングせずに再解析できます
- 抽出したデータを検証する — None/空の値を確認し、データ型と形式を検証します
- 再実行を前提に設計する — スクレイパーを冪等にし、すでにスクレイピングした対象を追跡します
- 合法かつ倫理的に行動する — 適用される法律(CFAA、GDPR)を理解し、利用規約を尊重します
ステップ 4 — スクレイパーを構築する
次のガイドラインに従います。
- 本番環境に対応 — エラー処理、再試行、ロギング、レート制限を最初から含めます
- 設定可能 — URL、セレクター、遅延、認証情報を外部設定にし、設定ファイルまたは引数を使用します
- テスト可能 — 解析関数の単体テストと、スクレイピングの全フローを対象とする統合テストを作成します
- 可観測性を確保 — ページの取得、抽出した項目、発生したエラー、所要時間の統計をログに記録します
- ドキュメントを整備 — セットアップ、使用方法、対象サイトの情報、法的事項を記載した README を用意します
スクレイパーを構築する際は、次の内容を提示します。
- アプローチの特定 — 該当する章や概念と、その理由
- 対象の分析 — サイト構造、ページネーション、認証の必要性、JavaScript によるレンダリング
- 実装 — エラー処理とレート制限を備えた本番環境対応のコード
- ストレージの設定 — データの保存方法と保存先(CSV、データベース、ファイル)
- 監視に関する注意事項 — 注意すべき点(サイトの変更、ブロック、データ品質)
スクレイパー構築の例
例 1 — 静的サイトからのデータ抽出:
User: "Scrape product listings from an e-commerce category page"
Apply: Ch 1 (fetching pages), Ch 2 (parsing product elements),
Ch 3 (pagination/crawling), Ch 6 (storing to CSV/DB)
Generate:
- requests + BeautifulSoup scraper
- CSS selector-based product extraction
- Pagination handler following next-page links
- CSV or database storage with schema
- Rate limiting and error handling
例 2 — JavaScript を多用するサイト:
User: "Extract data from a React single-page application"
Apply: Ch 11 (Selenium, headless browser), Ch 2 (parsing rendered HTML),
Ch 14 (avoiding detection), Ch 15 (testing)
Generate:
- Selenium WebDriver with headless Chrome
- Explicit waits for dynamic content loading
- JavaScript execution for scrolling/interaction
- Data extraction from rendered DOM
- Headless browser configuration
例 3 — 認証が必要なスクレイピング:
User: "Scrape data from a site that requires login"
Apply: Ch 10 (forms, sessions, cookies), Ch 14 (headers, tokens),
Ch 6 (data storage)
Generate:
- Session-based login with CSRF token handling
- Cookie persistence across requests
- POST request for form submission
- Authenticated page navigation
- Session expiry detection and re-login
例 4 — Scrapy を使用した大規模クロール:
User: "Build a crawler to scrape thousands of pages from multiple domains"
Apply: Ch 5 (Scrapy framework), Ch 4 (crawl models),
Ch 16 (parallel scraping), Ch 14 (avoiding blocks)
Generate:
- Scrapy spider with item definitions and pipelines
- CrawlSpider with Rule and LinkExtractor
- Pipeline for database storage
- Settings for concurrent requests, delays, user agents
- Middleware for proxy rotation
モード 2:スクレイパーのレビュー
ウェブスクレイパーをレビューする際は、完全なチェックリストを確認するために references/review-checklist.md を読んでください。
レビュープロセス
- 取得の確認 — Ch 1、10、11 を確認します:HTTP メソッド、セッションの使用、JavaScript レンダリングの必要性、認証
- 解析の確認 — Ch 2、7 を確認します:セレクターの品質、防御的な解析、エッジケースへの対応
- クロールの確認 — Ch 3-5 を確認します:URL 管理、重複排除、ページネーション、深度制御
- ストレージの確認 — Ch 6 を確認します:データ形式、スキーマ、重複、ファイル管理
- 耐障害性の確認 — Ch 14-16 を確認します:エラー処理、再試行、レート制限、並列処理の安全性
- 倫理面の確認 — Ch 17-18 を確認します:robots.txt、法令遵守、身元の明示、節度あるクロール
- 品質の確認 — Ch 8、15 を確認します:データクリーニング、テスト、検証
レビューのトーンの調整
重要:実際に見つかった内容に合わせてトーンを調整してください。
- スクレイパーが適切に構成され、ベストプラクティスに従っている場合は、概要でその点を明示し、レビューの大半を適切にできている点への評価に充ててください。特に、次の点を評価してください。
- 取得前に
RobotFileParserで robots.txt を確認している(第 18 章) - 連絡先情報を含む、説明的な User-Agent(第 14 章)
Retryアダプターを設定したrequests.Session()(第 10、14 章)soup.select()/soup.select_one()による CSS セレクター(第 2 章)- 抽出した要素のテキストにアクセスする前に None チェックを行っている(第 2 章)
resp.raise_for_status()とrequests.RequestExceptionの捕捉(第 1、14 章)- リクエスト間の
time.sleep()(第 14 章) - 各ステップでページ番号と項目数を記録する構造化ログ(第 5 章)
- 取得前に
- すでに優れたスクレイパーに対する提案は、軽微な任意の改善点として示す必要があります。重大または優先度の高い問題として扱わないでください。深刻度を捏造してはいけません。
レビューの出力形式
レビューは次の形式で構成してください。
## Summary
One paragraph: overall scraper quality, pattern adherence, main concerns.
## Fetching & Connection Issues
For each issue (Ch 1, 10-11):
- **Topic**: chapter and concept
- **Location**: where in the code
- **Problem**: what's wrong
- **Fix**: recommended change with code snippet
## Parsing & Extraction Issues
For each issue (Ch 2, 7):
- Same structure
## Crawling & Navigation Issues
For each issue (Ch 3-5):
- Same structure
## Storage & Data Issues
For each issue (Ch 6, 8):
- Same structure
## Resilience & Performance Issues
For each issue (Ch 14-16):
- Same structure
## Ethics & Legal Issues
For each issue (Ch 17-18):
- Same structure
## Testing & Quality Issues
For each issue (Ch 9, 15):
- Same structure
## Recommendations
Priority-ordered from most critical to nice-to-have.
Each recommendation references the specific chapter/concept.
注意すべき一般的なウェブスクレイピングのアンチパターン
- リクエストのエラー処理がない → 第 1、14 章:リクエストを try/except で囲み、
requests.RequestException(ConnectionError、Timeout、HTTPErrorを包含)を処理してください。200 以外のレスポンスを検出できるよう、必ずresp.raise_for_status()を呼び出してください。 - フォールバックのないハードコードされたセレクター → 第 2 章:複数のセレクター戦略を使い、属性にアクセスする前に None チェックを行ってください。
- レート制限がない → 第 14 章:リクエスト間に
time.sleep()を追加し、サーバーのリソースに配慮してください。 - User-Agent ヘッダーがない → 第 14 章:連絡先情報を含む説明的な User-Agent を設定してください。大規模に利用する場合は、必要に応じてローテーションしてください。
- セッションを使用していない → 第 10 章:Cookie の保持と接続のプーリングに
requests.Session()を使用してください。 - robots.txt を無視している → 第 18 章:クローリングの前に
RobotFileParserで robots.txt を解析し、そのルールを尊重してください。 - URL の重複排除をしていない → 第 3 章:訪問済み URL をセットで管理し、比較前に URL を正規化してください。
- HTML の解析に正規表現を使用している → 第 2 章:HTML の解析には正規表現ではなく BeautifulSoup または lxml を使用してください。特に、次の点に注意してください。
<p>やブロック要素に対するre.DOTALLパターンは、入れ子になったインラインタグ(<strong>、<a>など)の内容を誤って結合し、誤った出力を生成します。href=["\'](.*?)["\']のような正規表現パターンは、<script>ブロック、<style>ブロック、HTML コメント内のhref属性にも一致し、多数の誤検出を引き起こします。- 慣用的な BeautifulSoup の代替手段として、
soup.select_one()とsoup.select()の CSS セレクター API を推奨してください(明確さの点でfind()/find_all()より優先されます)。
- JavaScript のコンテンツを処理していない → 第 11 章:データが Ajax 経由で読み込まれる場合は、Selenium を使用するか、元となる API を見つけてください。
- 検証せずにデータを保存している → 第 6、8 章:保存前にデータを検証してクリーンアップし、エンコーディングを処理してください。
- ログがない → 第 5 章:各ステップでページの取得、項目数、エラーを記録してください。ページ番号とページごとの項目数を含む構造化ログを使用してください。
- 並列処理が必要なのに逐次処理している → 第 16 章:大規模なスクレイピングにはスレッド処理またはマルチプロセス処理を使用してください。
- エンコーディングの問題を無視している → 第 7、8 章:UTF-8 を処理し、エンコーディングを検出して、Unicode を正規化してください。
- パーサーのテストがない → 第 15 章:保存した HTML フィクスチャーを使って単体テストを作成し、セレクターの堅牢性をテストしてください。
- コードに認証情報を含めている → 第 10 章:ログイン認証情報には環境変数または設定ファイルを使用してください。
- 生のレスポンスを保存していない → 第 6 章:再解析できるよう生の HTML を保存し、抽出したデータだけに依存しないでください。
一般的なガイドライン
- シンプルなスクレイピングにはBeautifulSoup、大規模な処理にはScrapy — 複雑さに応じてツールを選びます
- まずAPIを確認します — 多くのサイトには、スクレイピングより簡単に利用できるAPI(公開されているもの、非公開のもの)があります
- サイトに配慮します — リクエスト頻度を制限し、身元を明らかにし、robots.txtに従い、利用規約を確認します
- 堅牢な解析を行います — HTMLの構造は変わるため、要素が見つからない場合にも常に適切に対処します
- 保存したページでテストします — HTMLのフィクスチャを保存してオフラインでパーサーをテストします。リクエストを減らせるうえ、CIも利用できます
- 早い段階でデータをクリーンアップします — 文字列を正規化し、エンコーディングを処理し、抽出時に空白を取り除きます
- より詳しい実践方法については、スクレイパーを構築する前に
references/practices-catalog.mdを読んでください。 - レビューチェックリストについては、スクレイパーをレビューする前に
references/review-checklist.mdを読んでください。