シリーズを書き終えて振り返ると、requestsとPlaywrightのどちらを選ぶかで悩んだ場面が一番多かったように思います。判断に迷わないための早見表として、このシリーズの学びを一枚にまとめました。
シリーズで学んだこと
図1: requestsとPlaywrightのツール選択フロー
| PART | 学んだこと |
|---|---|
| 01 | エンティティ抽出の目的・ユースケース・完成イメージの把握 |
| 02 | Python venv による再現性のある開発環境の構築 |
| 03 | requests + BeautifulSoup のインストールとパーサー選定 |
| 04 | Playwright のインストール・ブラウザバイナリ取得・OS 別注意点 |
| 05 | 抽出対象タグ・属性の整理と Python dataclass エンティティ定義 |
| 06 | 静的ページから label 紐付け・select 選択肢を含む完全な抽出実装 |
| 07 | Playwright を使った動的ページ対応・静的版との差分・使い分け判断 |
| 08 | フォーム仕様書 Markdown 生成・テストケースインプット生成・DB カラム候補推定 |
| 09 | SSL エラー・文字化け・JS 未描画・タイムアウトの対処法 |
| 10 | 全体まとめと次のステップ(本記事) |
ツール比較早見表
| 観点 | requests + BeautifulSoup | Playwright |
|---|---|---|
| 対象 | 静的ページ(SSR・PHP・Java 等) | 動的ページ(React / Vue / SPA) |
| 速度 | 速い(0.5〜2 秒) | 遅い(3〜10 秒) |
| JS 実行 | ❌ | ✅ |
| インストール | pip install requests beautifulsoup4 | pip install playwright + playwright install chromium |
| Linux 依存 | 不要 | 別途 install-deps が必要 |
| 推奨する場面 | まず試すべき第一選択肢 | 静的版で 0 件のとき・SPA 確定のとき |
実装チェックリスト
- Python 3.9+ で仮想環境を作成・有効化した
- requirements.txt に全パッケージを記載した
- BeautifulSoup は
beautifulsoup4(4 あり)でインストールした - Playwright は
pip install playwright後にplaywright install chromiumを実行した - Linux 環境では
playwright install-deps chromiumも実行した - InputEntity dataclass を
extractor/models.pyに定義した - 静的版
extract_static()を先に試し、0 件なら動的版に切り替えた - SSL / 文字化けなどのエラーハンドリングを実装した
- 抽出結果を JSON で保存し、人手でレビューした
次のステップ
📌 さらに発展させるアイデア
| テーマ | 概要 |
|---|---|
| 認証が必要なページへの対応 | requests の Session を使ったフォームログイン、Playwright の storage_state を使ったセッション保存・復元。 |
| XPath による高精度な label 探索 | lxml の XPath を使い、より複雑な DOM 構造でも label を正確に紐付ける。 |
| 複数ページの一括処理 | サイトマップから URL リストを取得し、asyncio + Playwright で並列抽出する。 |
| DB 定義書への自動出力 | InputEntity → DB カラム候補 → DDL(CREATE TABLE 文)を自動生成するパイプライン。 |
| Web UI の作成 | Streamlit や FastAPI で「URL を入力すると一覧が表示されるツール」として仕上げる。 |
"""シリーズを通じて完成した extract_inputs の使い方"""
from extractor import extract_inputs
import json, dataclasses
url = "https://example.com/login"
# 静的ページ
entities = extract_inputs(url)
# 動的ページ(SPA など)
# entities = extract_inputs(url, dynamic=True)
# JSON 出力
result = [dataclasses.asdict(e) for e in entities]
print(json.dumps(result, ensure_ascii=False, indent=2))
✅ シリーズ完走おめでとうございます
PART 01 から PART 10 まで読んでいただきありがとうございました。手作業でフォーム項目を転記していた作業を自動化する第一歩として、ぜひ実際のプロジェクトで活用してください。
エンティティ抽出シリーズ総まとめでよくある誤り
シリーズ全体を通じて学んだスクレイピング技術を実プロジェクトに定着させる際の典型的な失敗を整理します。
| 誤り/失敗パターン | 何が起きるか | 正しい対処/防止策 |
|---|---|---|
| スクレイピングツールを利用規約確認なしに使う | 著作権侵害やサービス規約違反で法的リスクや利用停止になる | 対象サイトの利用規約・robots.txt・スクレイピング許可ポリシーを必ず確認してから実装する |
| 取得したデータを加工せずにそのままシステムに投入する | HTML特殊文字・空白・改行がDBや出力ファイルに混入して後処理が複雑になる | strip()・HTMLエスケープ解除(html.unescape())・正規化処理をデータ取得直後に適用する |
| スクレイピング処理をスケジュール実行せず手動実行だけで運用する | 更新頻度の高いサイトに対して情報が陳腐化して業務判断に使えなくなる | cronやTask Schedulerでスクレイピングジョブを定期実行し最新データを自動収集する |