Webスクレイピングを本番運用したことのあるエンジニアなら、誰もが一度は経験する 「深夜のセレクター崩れ」。
サイトのデザイン改修やCSSクラスの難読化(TailwindやCSS Modulesによる ._3xP9z のようなクラス名変更)のたびにスクレイパーが停止し、セレクターを書き直す作業に追われていませんか?
本記事では、従来のDOMトラバース型スクレイピングの課題と、LLMを活用した 「意図ベース抽出(ゼロ・セレクター)」 へのパラダイムシフトについて解説します。
従来のスクレイピングが抱える「保守税(Maintenance Tax)」
スクレイピングの自作自体は簡単ですが、運用フェーズの保守コストが膨大になります。
┌─────────────────────────────────────────────────────────────┐
│ 自作スクレイパーの運用コスト推移 │
├─────────────────────────────────────────────────────────────┤
│ 1ヶ月目: スクリプト初期構築 (4時間) │
│ 2ヶ月目: クラス名変更に伴うセレクター修正 (2時間) │
│ 3ヶ月目: サイトレイアウト全面刷新への追従 (6時間) │
│ 4ヶ月目: JS動的レンダリング(SPA)のタイムアウト対応 (3時間) │
│ 5ヶ月目: Cloudflare・アンチボット対策とプロキシ調整 (8時間) │
├─────────────────────────────────────────────────────────────┤
│ 合計: 5ヶ月間で 約23時間のエンジニア工数が消失 │
└─────────────────────────────────────────────────────────────┘
BeautifulSoupやPlaywrightは学習用途には素晴らしいツールですが、ビジネスのデータ収集ラインにおいて、セレクターの定期修正は大きな負担です。
パラダイムシフト:HTML構造から「意味(Semantic)」での抽出へ
LLM(GPT-4o / Gemini等)を活用したデータ抽出では、**「どのようにDOMを巡回するか」ではなく、「何が欲しいか」**を定義します。
例えば、次のような指示です。
このページから商品名、税込価格(数値)、在庫状況をJSON形式で抽出して
従来のスクレイピングでは、HTML構造を解析して特定の要素を指定する必要がありました。
一方、LLMベースのスクレイピングでは、以下のような流れでデータを取得できます。
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 1. HTML取得 │ ─────▶│ 2. Markdown変換 │ ─────▶│ 3. LLMスキーマ │
│ (httpx/Headless)│ │ (ノイズ削減) │ │ 照合・推論 │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│
▼
┌─────────────────┐
│ 4. 検証済み │
│ 構造化JSON出力 │
└─────────────────┘
サイトのデザインがテーブル形式からフレックスボックスに変わっても、クラス名がランダムな文字列に変化しても、LLMがページの文脈を解釈することで、DOMセレクターに依存しないデータ抽出を実現できます。
実装:3行のPythonコード(scraping-ai SDK)
公式PyPIパッケージ scraping-ai を使用した実装例です。
まずはパッケージをインストールします。
pip install scraping-ai
同期処理(基本)
URLと欲しいデータのスキーマを渡すだけで、構造化されたJSONデータを取得できます。
from scraping_ai import ScrapingAIClient
# クライアント初期化
client = ScrapingAIClient(api_key="YOUR_API_KEY")
# URLと欲しいスキーマを渡すだけでJSONを取得
# セレクターの記述は不要
data = client.extract(
url="https://example.com/products/headphones",
schema={
"title": "string",
"price": "number",
"in_stock": "boolean",
"rating": "number"
}
)
print(data.results)
出力されるJSON
{
"results": [
{
"data": {
"title": "ワイヤレス ノイズキャンセリング ヘッドホン",
"price": 24800,
"in_stock": true,
"rating": 4.7
},
"target_url": "https://example.com/products/headphones"
}
]
}
非同期処理(AsyncIO対応)
大量のURLを処理する場合は、AsyncIOを利用した非同期処理も可能です。
import asyncio
from scraping_ai import AsyncScrapingAIClient
async def main():
async with AsyncScrapingAIClient(api_key="YOUR_API_KEY") as client:
data = await client.extract(
url="https://example.com/products/headphones",
schema={
"title": "string",
"price": "number"
}
)
print(data.results)
asyncio.run(main())
比較:自作 vs Scraping AI API
| 項目 | BeautifulSoup + Playwright(自作) | Scraping AI(API) |
|---|---|---|
| 導入時間 | サイトごとに2〜4時間 | 約60秒(APIコールのみ) |
| セレクター保守 | 高(サイトのHTML変更時に破損) | ゼロ(LLMによる意図抽出) |
| JS動的描画(SPA) | ヘッドレスブラウザ環境の自前構築 | 自動検出・自動フォールバック |
| スキーマ検証 | Pydantic等の自前バリデータ実装 | JSON Schema標準準拠 |
| 年間想定コスト | ライブラリ$0 + エンジニア工数 $3,000+ | 年間 約$60〜$360(トークン従量制) |
制約事項と使い分け
技術的な誠実さとして、Scraping AIにも制約事項があります。
自作BeautifulSoupが適しているケース
- 個人ブログの単発クローリング
- プログラミング学習
- 完全無料で運用したい場合
- HTML構造が安定しているサイト
- 高速かつ大量のデータを低コストで処理したい場合
Scraping AIが適しているケース
- 複数ECサイトの価格監視
- AIモデルへの定期データ連携
- サイトごとのセレクター管理を減らしたい場合
- データの意味や内容を基準に抽出したい場合
- スクレイピング基盤の開発・保守工数を削減したい場合
非対応・制約事項
SNS(X / Instagram等)のスクレイピングは規約上非対応です。
また、極めて厳格なCAPTCHA(Cloudflare Turnstile等)に対する自動ステルス回避には制約があり、すべてのサイトで安定した取得を保証できるわけではありません。
スクレイピングを実際のサービスで利用する場合は、対象サイトの利用規約やrobots.txt、関連する法令・ポリシーなども確認した上で利用してください。
無料で試す(200トークン付与)
Scraping AIは無料アカウントから試すことができます。
-
無料アカウント登録(クレジットカード不要)
https://pig-data.jp/service/scraping-ai/ -
PyPIパッケージ
https://pypi.org/project/scraping-ai/
運営企業・チームについて
Scraping AI は、株式会社SMSデータテックのAIベンチャー子会社である indigodata株式会社 が開発・運営しています。
国内500件以上の受託データ収集実績を持つ「PigData」の知見をベースに、開発者向けセルフサーブ型LLMスクレイピングAPIを提供しています。
まとめ
従来のスクレイピングでは、
「HTMLのどこにデータがあるか」
をセレクターとして定義する必要がありました。
LLMを活用した意図ベース抽出では、
「どんなデータが欲しいか」
をスキーマとして定義するだけで、ページの文脈をもとにデータを抽出できます。
もちろん、すべてのスクレイピングをLLMに置き換える必要はありません。
HTML構造が安定していて大量・高速処理が必要なら従来型、サイト変更への追従やデータの意味理解が重要ならLLMベース。
このように用途に応じて使い分けることで、スクレイピング基盤の開発・運用コストを大きく削減できる可能性があります。