Skip to content
Published on

Webスクレイピング・クローリングツール 2026 — Scrapy / Playwright / Puppeteer / Crawlee (Apify) / Firecrawl / Jina Reader / Stagehand AI 徹底ガイド

Authors

プロローグ — 2026年、スクレイピングはLLM学習データの問題になった

Webスクレイピングは、かつて「マーケティングチームが競合価格を監視する」グレーゾーンの作業でした。2026年は違います。すべてのLLM学習がWebデータを必要とし、スクレイピングはAIインフラの一次入力になりました。Common Crawlの1ダンプではもう足りません。

この記事は、2026年5月時点で生きているWebスクレイピングのツール・サービス・戦略を一気にレビューします。Pythonから始まり、ヘッドレスブラウザを経て、クラウドプロキシ・APIサービスを通り、最後にLLMフレンドリーなAPIとAIエージェントブラウザへ — どこで何を選ぶか決められるように整理します。


1. 2026年のWebスクレイピング地図 — 4分類で見る

スクレイピングツールは大きく4層に分かれます。

[Layer 1: ライブラリ / フレームワーク — 自分でコーディング]
   Scrapy / Playwright / Puppeteer / Selenium / Crawlee
   Cheerio / Beautiful Soup 4 / lxml / jsoup / Goutte

[Layer 2: クラウド / マネージド — SaaS]
   Apify / Bright Data / Oxylabs / Smartproxy / SOAX

[Layer 3: APIサービス — HTTP一回で完結]
   ScrapingBee / Browserless / ZenRows / ScrapingAnt / ScraperAPI

[Layer 4: AI / LLMフレンドリー — Markdown出力、エージェント]
   Firecrawl / Jina AI Reader / Diffbot
   Stagehand / Browser Use / AnchorBrowser

選択基準はシンプルです。

  • 学習 / 小規模プロジェクト → Scrapy / Playwright / Cheerio を直接
  • 数十サイト、ボット回避が必要 → Crawlee + プロキシ
  • 数百サイト、運用負荷を最小化 → Apify / ScrapingBee
  • LLM学習 / RAGインデックス → Firecrawl / Jina Reader
  • AIエージェントがWebを操る → Stagehand / Browser Use

ここから各ツールを順番に見ていきます。


2. Scrapy — Pythonクラシック (2008年から生きている)

Scrapyは2008年に最初にリリースされたPythonスクレイピングフレームワークです。2026年5月時点でバージョン2.13、今でも最もダウンロードされているスクレイピングライブラリです。PyPIで月間1,400万ダウンロード超。

核となるアーキテクチャは、非同期イベントループ(Twisted → asyncio移行中) + スパイダー + パイプライン。スパイダーがURLをキューに入れ、レスポンスをパース関数で受け、抽出されたアイテムがパイプラインを通って保存されます。

import scrapy

class HackerNewsSpider(scrapy.Spider):
    name = "hn"
    start_urls = ["https://news.ycombinator.com/"]

    def parse(self, response):
        for item in response.css("tr.athing"):
            yield {
                "title": item.css("span.titleline > a::text").get(),
                "url": item.css("span.titleline > a::attr(href)").get(),
                "rank": item.css("span.rank::text").get(),
            }
        next_page = response.css("a.morelink::attr(href)").get()
        if next_page:
            yield response.follow(next_page, self.parse)

scrapy crawl hn -o items.jsonl 一行でページネーション追跡・アイテム抽出・JSONL保存まで終わります。

Scrapyの強みは、チューニング可能なキュー(Bloom filter dupefilter、優先度キュー)、自動リトライ / バックオフAutoThrottleミドルウェアチェーンItems + Item Loaders + ItemAdapter、そしてscrapy-playwright / scrapy-splash統合です。弱点はJavaScriptレンダリングが標準でできない点。そのため scrapy-playwright 統合が事実上の標準になりました。

2024〜2025年にかけてScrapyは大規模リファクタを経て asyncioネイティブサポート(twisted.internet.asyncioreactor)が入り、Python 3.13のno-GILビルドにも対応しています。2026年もデータエンジニアリングパイプラインの「デフォルト」であり続けるでしょう。


3. Playwright (Microsoft) — ヘッドレスブラウザ標準

PlaywrightはMicrosoftが2020年に公開したヘッドレスブラウザ自動化ツールです。2026年5月時点でバージョン1.50、ヘッドレスブラウザ分野の事実上の標準になりました。GitHubスター71,000+、Puppeteerを追い越して久しいです。

最大の差別化は Chrome・Firefox・WebKitの3エンジンを1つのAPIで制御する点。PuppeteerがChromium中心なのに対し、Playwrightは最初からマルチブラウザ設計です。

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(headless=True)
    context = browser.new_context(
        user_agent="Mozilla/5.0 ...",
        viewport={"width": 1920, "height": 1080},
        locale="ja-JP",
    )
    page = context.new_page()
    page.goto("https://example.com/list")
    page.wait_for_selector("article.post")

    items = page.eval_on_selector_all(
        "article.post",
        "elements => elements.map(e => ({title: e.querySelector('h2').innerText, link: e.querySelector('a').href}))"
    )
    print(items)
    browser.close()

Python / Node / Java / .NETのバインディングが提供されています。そのうちPython版がデータチームで最もよく使われます。

Playwrightの2026年の主要機能は以下の通り。

  • Auto-waitpage.click("button") だけでクリック可能になるまで自動待機。time.sleep地獄から解放されます。
  • Trace Viewer — すべてのクリック・ネットワーク・DOM状態をタイムラインで再生。デバッグツールとしてはほぼ最強。
  • MCP統合 — 2025年に出たPlaywright MCPサーバーを通じて、Claude・Cursor等のAIエージェントが直接ブラウザを制御できます。
  • Codegen — ユーザー操作を録画してコードで出力。スクレイパーのブートストラップに有用。
  • Component Testing(別ライブラリ) — React・Vueコンポーネントを本物のブラウザでテスト。

スクレイピング用途では、playwright-extra + puppeteer-extra-plugin-stealth(Node)あるいは playwright-stealth(Python)が標準の組み合わせです。


4. Puppeteer (Google) — Chromiumの元祖自動化

PuppeteerはGoogle Chromeチームが2017年に公開したNode.jsライブラリです。一時はヘッドレスブラウザの代名詞でしたが、2020年代に入りPlaywrightに席を譲った感があります。2026年5月時点でv23、いまも活発にメンテナンスされています。

import puppeteer from 'puppeteer'

const browser = await puppeteer.launch({ headless: 'new' })
const page = await browser.newPage()
await page.goto('https://example.com/list')
await page.waitForSelector('article.post')

const items = await page.$$eval('article.post', (nodes) =>
  nodes.map((n) => ({
    title: n.querySelector('h2')?.innerText ?? '',
    link: (n.querySelector('a') as HTMLAnchorElement)?.href ?? '',
  }))
)
console.log(items)
await browser.close()

PlaywrightとPuppeteerのポジショニングは明確です。

  • 強み: Chrome DevTools Protocolに最も密着。Lighthouse・web-vitals・PDF生成のようなChrome専用機能との統合が最もスムーズ。
  • 弱み: マルチブラウザサポートが弱い。APIデザインがPlaywrightと比べてやや古い。
  • エコシステム資産: puppeteer-extra + puppeteer-extra-plugin-stealth — ステルス分野の標準プラグイン。Playwright側でもこれを移植して使います。

新規プロジェクトならPlaywrightを推奨しますが、Chrome専用PDF生成・レンダリング検証が主目的ならPuppeteerは今でも綺麗な選択肢です。


5. Selenium — まだ生きている (レガシー + WebDriver BiDi)

Seleniumは2004年に始まった最古のブラウザ自動化プロジェクトです。2026年時点でSelenium 4.xが安定版、5.0がW3C WebDriver BiDi標準を一級市民として迎えて開発中。

Seleniumはモダンツール(Playwright / Puppeteer)に比べて遅く重いと言われがちですが、以下の分野では今でもトップです。

  • QA / テスト自動化 — エンタープライズで最もよく使われるテストツール。
  • Grid + Selenoid / Moon — コンテナベースの分散実行インフラが最も成熟。
  • レガシーコードベース — 2010年代に書かれたSeleniumスイートが今も動いています。
  • WebDriver BiDi(双方向プロトコル)標準作業の中心 — 2026年にはChrome・Firefox・Edgeすべてが BiDiを実装し、かつてはPlaywrightだけの利点だった双方向イベントストリーミングをSeleniumも提供しています。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
driver.get("https://example.com/list")

WebDriverWait(driver, 10).until(
    EC.presence_of_all_elements_located((By.CSS_SELECTOR, "article.post"))
)

posts = driver.find_elements(By.CSS_SELECTOR, "article.post")
for p in posts:
    title = p.find_element(By.CSS_SELECTOR, "h2").text
    link = p.find_element(By.CSS_SELECTOR, "a").get_attribute("href")
    print(title, link)
driver.quit()

スクレイピングの観点では、undetected-chromedriver の組み合わせが核心的な資産です。ボット検出回避のためにChrome WebDriverのフィンガープリントを整えたフォークで、第14章で扱います。


6. Crawlee (Apify) — モダンスクレイピングフレームワーク

CrawleeはApifyが2022年に公開したオープンソースフレームワークです。ScrapyのモダンNode / Python代替を標榜しています。2024年のCrawlee for Python安定版リリースで、Pythonからも使えるようになりました。

設計哲学は明確 — 「スクレイパーに必要なすべてが箱に入っている」。

  • 自動キュー / リトライRequestQueue がURLを永続保存。クラッシュ後の再開可能。
  • 自動プロキシローテーションProxyConfiguration にURLプールを登録するだけ。
  • 自動セッション管理SessionPool がCookie・UA・プロキシの組み合わせを管理。
  • 自動同時実行調整AutoscaledPool がCPU・メモリ・応答時間をもとに同時実行数を決定。
  • 複数クローラーHttpCrawler(高速、JS無し)、CheerioCrawlerPlaywrightCrawlerPuppeteerCrawler を同一APIで。
import { PlaywrightCrawler, Dataset } from 'crawlee'

const crawler = new PlaywrightCrawler({
  maxRequestsPerCrawl: 1000,
  async requestHandler({ page, request, enqueueLinks }) {
    await page.waitForSelector('article.post')
    const items = await page.$$eval('article.post', (nodes) =>
      nodes.map((n) => ({
        title: n.querySelector('h2')?.textContent ?? '',
        link: (n.querySelector('a') as HTMLAnchorElement)?.href ?? '',
      }))
    )
    await Dataset.pushData(items)
    await enqueueLinks({ selector: 'a.next-page' })
  },
})

await crawler.run(['https://example.com/list'])

このコードだけでページネーション追跡・自動リトライ・セッションプール・同時実行自動調整がすべて動きます。ScrapyをNodeで使いたいならCrawleeが答えです。


7. Apify — マネージドスクレイピングクラウド

ApifyはCrawleeを作った会社が運営するマネージドスクレイピングプラットフォームです。「Actor」 と呼ぶコンテナ単位のジョブをクラウドで実行してくれて、入力定義・ストレージ・プロキシ・スケジューラまでマネージドで提供します。

Apifyの魅力は Actorマーケットプレース。2026年5月時点で5,000を超える既製Actorが登録されています — Google検索結果スクレイピング、Instagramプロフィール、Amazon商品、LinkedIn企業、TikTok動画、その他多数。マーケットプレースのActorは通常、結果1,000件あたり 11〜5 の従量課金です。

import { Actor } from 'apify'
import { PlaywrightCrawler } from 'crawlee'

await Actor.init()
const input = await Actor.getInput()

const crawler = new PlaywrightCrawler({
  proxyConfiguration: await Actor.createProxyConfiguration(),
  async requestHandler({ page, request }) {
    const data = await page.evaluate(() => ({
      title: document.querySelector('h1')?.textContent,
      content: document.querySelector('article')?.innerText,
    }))
    await Actor.pushData(data)
  },
})

await crawler.run(input.startUrls)
await Actor.exit()

このActorを apify push でデプロイすれば、Web UIで入力値を受けて実行され、結果はApify Datasetに保存されます。CLIなしでcronスケジューラで毎日回すこともできます。

料金はコンピュートタイム(例: 1 CU ≒ メモリ1GB × 時間1h)で計測され、無料プラン $5/月 クレジットから始められます。プロキシは別料金。Apify Proxyはデータセンター・住宅・SERP・Google SERPなどカテゴリ別に定価があります。


8. Bright Data / Oxylabs / Smartproxy — プロキシ + スクレイピングクラウド

ボット検出最大の武器は IPベースのブロックです。1つのIPから毎秒10件以上のリクエストが来ると疑いが始まります。だからプロキシ会社が登場しました。

Bright Data(旧Luminati)は業界最大の住宅プロキシネットワークを持つ会社です。1.5億+の住宅IP、7,200万+のISPプロキシ、300万+のデータセンタープロキシ、70万+のモバイルプロキシを公表しています。2026年には Web Unlocker(自動キャプチャ / ボット回避API)、SERP API(Google・Bing検索結果)、Web Scraper IDE(ブラウザ内でコードを書く)、Scraping Browser(リモートヘッドレスブラウザ)といったフルスタック製品を揃えています。

価格はGB単位の従量課金が基本。住宅プロキシはGBあたり 55〜15、データセンターはGBあたり 0.500.50〜1 レベル。

Oxylabsはリトアニア本社のプロキシ会社。Bright Dataと類似のラインナップ(住宅・データセンター・ISP・モバイル)に Real-Time CrawlerE-Commerce Scraper APIWeb Unblocker のようなマネージドAPIを提供します。価格帯はBright Dataとほぼ同等か若干低め。

Smartproxy(現在はDecodoにリブランド)はもう少しリーズナブルな価格帯を狙います。住宅プロキシGBあたり 33〜8 程度、初心者にやさしいUIが強みです。Apify Proxyのようなモデルより自由度が高いです。

スクレイピングからのプロキシ選択基準は次の通り。

  • データセンタープロキシ — 安いがブロック危険大。ボット検出の弱いサイト向け。
  • 住宅プロキシ — 高いがほとんどブロックされない。大手EC・SNS向け。
  • モバイルプロキシ — 最も高価だがモバイルアプリトラフィックを偽装可能。TikTok・Instagramに効果的。
  • ISPプロキシ — 静的住宅IP。セッション維持が重要なケース向け。

9. ScrapingBee / Browserless / ZenRows — APIスクレイピングサービス

プロキシ + ヘッドレスブラウザ + キャプチャ回避をすべて束ねて 「HTTP一回呼び出しで完結」 にしてくれるサービス群です。

ScrapingBeeはフランスの会社が作った最も知られたAPI。URLを投げればレンダリング済みHTMLが返ってきます。

curl "https://app.scrapingbee.com/api/v1/?api_key=YOUR_KEY&url=https://example.com&render_js=true&premium_proxy=true"

価格はクレジット従量制。JSレンダリングなしで1クレジット、JSレンダリングありで5クレジット、プレミアムプロキシは25クレジット、キャプチャ回避は100クレジット程度かかります。1,000クレジットパッケージで $9 ほど。小規模プロジェクトには最安オプション。

Browserlessはもっと開発者にやさしいです。Puppeteer / PlaywrightをWebSocketでリモート接続できるサービスで、コードを変えずにクラウドのChromeを使えます。

import puppeteer from 'puppeteer-core'

const browser = await puppeteer.connect({
  browserWSEndpoint: 'wss://chrome.browserless.io?token=YOUR_TOKEN',
})
const page = await browser.newPage()
await page.goto('https://example.com')
const html = await page.content()
await browser.disconnect()

セッション単位 + 時間単位の混合料金で、月 $50 から。自前インフラ + Chromeコンテナ運用の負担がなくなります。

ZenRowsはボット検出回避に特化した後発組です。JavaScriptレンダリング + プレミアムプロキシ + AntiBot bypass + CSSセレクタ抽出を単一APIで束ねて販売。ScrapingBeeと直接競合します。2026年に入ってZenRowsは Universal Scraper API というLLMフレンドリーな出力モードを追加し、Markdown / JSON-LD / メインコンテンツ抽出まで自動化しています。

ScrapingAnt / ScraperAPI / Apify Web Scraperは同カテゴリの競合です。


10. AI / LLMフレンドリー — Firecrawl / Jina AI Reader / Diffbot

2024年から登場した新カテゴリです。「LLMが読みやすいMarkdownに変換されたWebコンテンツ」 を返してくれるサービス群。RAGインデックスとLLM学習データ収集に特化しています。

Firecrawlは2024年リリースのYC企業です。URLを投げると HTMLではなくLLMフレンドリーなMarkdown が返ってきます。JSレンダリング・自動ページネーション・サイト全体クロール・Web検索が単一APIで提供されます。

curl -X POST https://api.firecrawl.dev/v1/scrape \
  -H "Authorization: Bearer YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com/article",
    "formats": ["markdown", "html"]
  }'

レスポンスには markdown フィールドと metadata(title・description・sourceURL等)が含まれます。RAGデータセットを作るときにCheerioで広告・ナビゲーション・フッターを手で剥がす必要がなくなります。

価格は1,000ページあたり $0.83(Standard)から。crawl APIはサイト全体を再帰的に取得して pages 配列で返します。2026年に extract APIが追加され、LLMに抽出スキーマを渡すと構造化JSONが返ってきます。

Jina AI Readerは最も魅力的な無料オプションです。https://r.jina.ai/{URL} 形式でURLにプレフィックスを付けるだけ。

curl https://r.jina.ai/https://example.com/article

レスポンスはLLMフレンドリーなMarkdownで、認証キーなしで呼び出せます(レート制限あり)。APIキー登録でより高い上限と追加機能が得られます。

Jinaの強みは、自社学習の Reader-LM(HTML→Markdown専用小型モデル) をバックエンドに使う点です(次章で説明)。LLM学習データセット作成、AIエージェントのWeb検索・読み取りステップ、RAGインデックス、すべてに即使えます。

Diffbotは2008年から運営されているベテランです。AIベースの自動抽出 — どんなページを投げてもページタイプ(article / product / discussion / event等)を自動検出し、構造化されたJSONを返します。価格は高め(月 $299 から)ですが、数千サイトの抽出ロジックを手で書く必要がなくなります。2024年にはLLMフレンドリーな出力モードも追加しました。


11. Reader-LM (Jina, 2024年5月) — HTML → Markdown専用小型モデル

Jina AIは2024年5月、Reader-LM という小型モデル2種(0.5B / 1.5Bパラメータ)を公開しました。入力は巨大なHTML文書、出力はLLMフレンドリーなMarkdown — その1タスクだけを実行します。

なぜ専用モデルが必要か? regexreadability.js のようなルールベース抽出は広告・SPAマークアップ・動的コンテンツに弱く、汎用LLM(GPT-4 / Claude)に任せるにはコンテキスト256kも足りずコストが爆発します。Reader-LMはこの隙間を埋めるために作られた タスク特化型SLM です。

from transformers import AutoTokenizer, AutoModelForCausalLM

tokenizer = AutoTokenizer.from_pretrained("jinaai/reader-lm-1.5b")
model = AutoModelForCausalLM.from_pretrained("jinaai/reader-lm-1.5b")

html = open("page.html").read()
prompt = f"Convert the following HTML to clean Markdown:\n\n{html}"

inputs = tokenizer(prompt, return_tensors="pt")
outputs = model.generate(**inputs, max_new_tokens=4096)
markdown = tokenizer.decode(outputs[0], skip_special_tokens=True)

2026年には後継のReader-LM-v2がリリースされ、256kコンテキストとよりクリーンな表・コードブロック抽出をサポートします。Hugging Faceモデルカードで無料ダウンロードできます。

このモデルはJina AI Reader APIのバックエンドでもあります。つまり r.jina.ai を1回呼ぶごとにReader-LMが1回推論を回します。セルフホストすれば同じ結果を無料で得られますが、GPUコストと運用負荷を考慮する価値があるかが判断基準です。


12. AI Playwright — Stagehand / Browser Use / AnchorBrowser

2025年後半から新カテゴリが浮上しました。「AIが自然言語でブラウザを操る」 ツール群 — Playwrightの上にLLMレイヤーを乗せて、セレクタを書かずに操作できます。

StagehandはBrowserbaseが作ったオープンソースライブラリ。Playwright APIに actextractobserve の3つのAIメソッドを追加します。

import { Stagehand } from '@browserbasehq/stagehand'

const stagehand = new Stagehand({ env: 'LOCAL' })
await stagehand.init()
const page = stagehand.page

await page.goto('https://amazon.com')
await page.act({ action: 'search for headphones' })
await page.act({ action: 'click the first result' })

const product = await page.extract({
  instruction: 'extract product title, price, and rating',
  schema: z.object({
    title: z.string(),
    price: z.string(),
    rating: z.number(),
  }),
})

await stagehand.close()

内部では、StagehandがページのDOMをLLMに送り、「このボタンは検索ボタンですか?」のような判断を委ねます。セレクタが変わっても意図が同じなら動きます。Browserbaseは同じ会社が運営するマネージドクラウドブラウザサービスで、Stagehandをローカル / クラウドで同じコードで動かせます。

Browser UseはPythonベースの競合ツールです。エージェントループ + LLM + Playwright の組み合わせで、ユーザーが自然言語のゴール(例: 「IndeedからPythonバックエンドの求人10件を取ってきて」)を渡すだけでLLMが自分でクリック・スクロール・抽出を繰り返します。

from browser_use import Agent
from langchain_openai import ChatOpenAI

agent = Agent(
    task="IndeedからPythonバックエンドの求人10件のタイトルとURLを取ってきて",
    llm=ChatOpenAI(model="gpt-4o"),
)
result = await agent.run()
print(result)

AnchorBrowserはもっとインフラ寄りのサービスです。Stagehand・Browser Use・既存のPlaywrightコードを全部受け入れて、クラウドブラウザで実行するマネージドプラットフォームです。Browserbaseの直接の競合。

このカテゴリは2026年に最も急速に成長しています。AIエージェント(Claude・GPT)がWebを「見て」作業する時代が来ることで、セレクタベースのスクレイピングは徐々にLLM判断 + ビジュアルグラウンディングに置き換えられています。


13. パース — Cheerio / Beautiful Soup 4 / lxml / jsoup / Goutte

HTMLを取得したら次はパースです。言語ごとに事実上の標準が決まっています。

Cheerio (Node) — jQueryのようなAPIでHTMLを扱う。速くて軽い。

import * as cheerio from 'cheerio'

const html = await fetch('https://example.com').then((r) => r.text())
const $ = cheerio.load(html)
$('article.post').each((_i, el) => {
  console.log($(el).find('h2').text(), $(el).find('a').attr('href'))
})

Beautiful Soup 4 (Python) — 最もお馴染みのPython HTMLパーサー。

from bs4 import BeautifulSoup
import requests

soup = BeautifulSoup(requests.get("https://example.com").text, "lxml")
for post in soup.select("article.post"):
    print(post.h2.text, post.a["href"])

bs4は内部パーサーとして lxml / html.parser / html5lib を選択できます。速度が重要なら lxml、標準準拠が重要なら html5lib を選びます。

lxml (Python) — libxml2 のCバインディング。bs4より5〜10倍速く、XPath 1.0をサポート。大量処理・XML作業に適しています。

from lxml import html

tree = html.fromstring(open("page.html").read())
titles = tree.xpath("//article[@class='post']/h2/text()")

jsoup (Java) — JVM陣営の標準。CheerioのようなjQueryセレクタを提供します。

Document doc = Jsoup.connect("https://example.com").get();
for (Element post : doc.select("article.post")) {
  System.out.println(post.select("h2").text());
}

Goutte (PHP) — Symfonyが作ったスクレイパー + パーサーの組み合わせ。Symfony BrowserKit + DomCrawlerを束ねたもの。2023年あたりにSymfony BrowserKit・HttpClientを直接使う方向に統合されましたが、Goutteの名前は今も通用しています。

Mechanize (Python / Ruby) — フォーム送信・Cookie管理に特化した「プログラム可能なブラウザ」。JSは扱えませんが、フォームベースのサイト(裁判所 / 図書館 / 政府)では今でも有用です。

選択基準はシンプル — 言語陣営の標準に従えばOK。ただし Pythonで大量処理 ならbs4ではなくlxmlを直接使うことを推奨します。


14. ステルス — puppeteer-extra-stealth / undetected-chromedriver / Camoufox

ボット検出は2020年代に本格的な軍拡競争になりました。Cloudflare・DataDome・Akamai Bot Manager・PerimeterXのようなボット検出サービスは以下を検査します。

  • navigator.webdriver === true(ヘッドレスブラウザの目印)
  • WebGL・Canvas・AudioContextのフィンガープリント
  • TLSフィンガープリント (JA3 / JA4)
  • HTTP/2フィンガープリント
  • マウス / キーボードイベントパターン(人間のように動くか)
  • CDP(Chrome DevTools Protocol)使用痕跡

これを回避するツール群です。

puppeteer-extra-plugin-stealth — Puppeteer / Playwright両方で最も使われるステルスプラグイン。navigator.webdriver削除、偽プラグイン登録、WebGLフィンガープリント偽装、Chrome ランタイムmock等、20以上の回避テクニックを束ねています。

import puppeteer from 'puppeteer-extra'
import StealthPlugin from 'puppeteer-extra-plugin-stealth'

puppeteer.use(StealthPlugin())
const browser = await puppeteer.launch({ headless: false })

undetected-chromedriver (Python) — Selenium側の標準。Chrome WebDriverのバイナリを再コンパイルしてCDP検出シグナルを除去します。Cloudflare保護サイトに最も効果的なツールの一つとして知られています。

import undetected_chromedriver as uc
driver = uc.Chrome(headless=False)
driver.get("https://cloudflare-protected-site.com")

Camoufox — Firefoxフォークベースの新しいステルスブラウザ。2024年リリース。Puppeteer / Playwrightと同じインターフェースを使いますが、ブラウザエンジン自体がボット検出シグナルを除去したカスタムビルドです。Mullvad Browser相当のフィンガープリント耐性を持ち、最も強力な回避オプションの一つと評価されています。

from camoufox.sync_api import Camoufox

with Camoufox(headless=False) as browser:
    page = browser.new_page()
    page.goto("https://example.com")

プロキシ + ステルス + 人間らしいタイミングは別軸です。3つすべて揃えてボット検出の8割を通過できます。だからこそZenRows・Bright Data Web Unlockerのようなマネージドサービスが登場するのです — これを全部自前運用するコストよりGB料金のほうが安いから。


15. robots.txt + sitemap.xml + クロール倫理

ツールを使う前に 何が許されるか を知る必要があります。

robots.txt — サイトルートの /robots.txt に書かれたクローラーポリシー。すべてのクローラーが従うべき社会的合意(法律ではない)です。

User-agent: *
Disallow: /admin/
Disallow: /api/internal/
Crawl-delay: 10

User-agent: GPTBot
Disallow: /

User-agent: ClaudeBot
Disallow: /

Sitemap: https://example.com/sitemap.xml

Crawl-delay はリクエスト間の最小間隔(秒)を勧告します。User-agent: GPTBot のような明示的なLLMブロックは2023〜2024年に急増し、2026年にはほとんどのメジャーサイトがLLM学習用クローラーをrobots.txtでブロックしています。

sitemap.xml — サイトが自分のページ一覧を明示的に伝えるファイル。URL・lastmod・changefreq・priorityを含みます。サイトマップに沿ったクロールはBFSでページを見つけるよりずっと効率的で、サイトへの負担も少ないです。

2022年のIETF標準化(Robots Exclusion Protocol)以降、robots.txtは「勧告」から「準拠すべき標準」へと格上げされました。米国・EUの一部判例はrobots.txt無視のクロールを不正アクセスと判断した事例があります。

クロール倫理チェックリスト:

  1. robots.txtを確認しブロックパスを除外。
  2. Crawl-delay を尊重(なければ1秒以上を推奨)。
  3. 識別可能なUA(Mozilla/5.0 (compatible; YourBotName/1.0; +https://your-site.com/bot))を設定。
  4. 同じドメインへの同時リクエストは1〜4以下に。
  5. キャッシュヘッダー(If-Modified-SinceETag)を尊重。
  6. 個人情報 / 著作権コンテンツ収集時は法務 / DPOレビュー。
  7. 収集データに出典を保存(LLM学習用ならなおさら)。

このチェックリストを守るボットはブロックされにくいです。ブロックされるボットはたいてい 速度が速すぎ、UAが怪しく、robots.txtを無視 しています。


16. 韓国 / 日本 — トス、カカオ、メルカリのスクレイピングポリシー

スクレイピングポリシーは地域ごとに異なります。日韓の事例を見ましょう。

韓国 — Toss / TossPayments: Tossは自社サービスへの自動化アクセスを利用規約で明示的に禁止しています。2023年にTossはあるフィンテック比較サービスがTossページをクロールしたことに対して法的対応した事例があります。韓国大法院は2017年のサラミン vs ジョブコリア判決で 「公開された情報でも自動化された大量収集はデータベース権侵害の可能性」 という判例を残しました。つまり公開されていても自動収集には法的リスクがあります。

韓国 — Kakao / Daum: Daum SearchはKakaoが運営し、韓国サイトのメタ検索結果をインデックスする検索ボットを動かしています。Kakaoの発表によれば、DaumボットはUser-agent Daum を使用し、robots.txtを厳格に尊重します。韓国でSEOをするならNaverボット(Yeti)・Daumボット(Daum)・Googleボット(Googlebot)の3つを考慮する必要があります。

日本 — メルカリ: メルカリは利用規約7.1条で「API・自動化ツールを通じたデータアクセス」を明示的に禁止しています。2019年、メルカリは価格比較サービスが自社データをスクレイピングしたことに対して日本の裁判所に仮処分を申請して認められたことがあります。日本の著作権法は2018年改正で 「情報解析目的の複製」 を広く認めました(第30条の4)が、サイト利用規約とは別に解釈されます。

日本 — キュレーションサイトとNAVERまとめ事件: NAVERまとめ(2020年サービス終了)はユーザーが他サイトのコンテンツを集めて作るキュレーションでした。多数の著作権紛争を経てNAVER側がサービスを終了しました。自動スクレイピングではなくユーザーキュレーションだったにもかかわらず、出典表記の欠如と大量利用が問題になりました。

3つの事例の教訓: 公開されている ≠ 収集してよい。サイト利用規約・robots.txt・該当国のデータベース権 / 著作権法をすべて確認する必要があります。LLM学習データに使うときはなおさらです。


17. 誰が何を選ぶべきか — 5つのシナリオ

ツール地図を全部見たので、決定マトリクスです。

シナリオ1: 学生 / サイドプロジェクト — 1サイト、100〜1,000ページ → Python + Scrapy または Playwright。自分でコーディング。無料。学習効果最大。

シナリオ2: インディーハッカー / SaaSデータ — 10〜50サイト、毎日更新 → Crawlee (Node) または Scrapy + scrapy-playwright。Apifyにデプロイしてcronで回すか自前VPS。プロキシはSmartproxy / Bright DataデータセンターGBパッケージで十分。

シナリオ3: モニタリング / 価格比較 — ボット検出強いサイト → Crawlee + puppeteer-extra-stealth + Bright Data 住宅プロキシ。あるいはZenRows / ScrapingBee API。自前運用 vs SaaSコストを比較して決定。

シナリオ4: LLM学習データ / RAG — 数千サイト、Markdown出力 → Firecrawl の crawl API または Jina AI Reader。両方ともLLMフレンドリーなMarkdownを返します。コスト重視ならJina、オプションを多く欲しいならFirecrawl。

シナリオ5: AIエージェントが直接Webを扱う — セレクタを書きたくない → Stagehand (TypeScript) + Browserbase。あるいは Browser Use (Python)。LLM APIコストが別途かかる点に注意。

コスト感覚 (1,000ページあたり):

  • 自前運用 (サーバー + プロキシGB): 11〜10
  • Apify Actor (マーケットプレース): 11〜5
  • ScrapingBee / ZenRows API: 55〜20
  • Bright Data Web Unlocker: 33〜10
  • Firecrawl: 0.830.83〜3
  • Jina AI Reader 有料: 約 $0.5
  • Jina AI Reader 無料枠: 毎分20〜200リクエスト
  • Stagehand + Browserbase: 1010〜50 (LLM APIコスト込み)

価格は運用負荷の逆数です。自前運用は安いが時間がかかります。


18. 参考 / References

  • Scrapy documentation — https://docs.scrapy.org/
  • Scrapy GitHub — https://github.com/scrapy/scrapy
  • Playwright Python — https://playwright.dev/python/
  • Playwright Node — https://playwright.dev/
  • Playwright MCP — https://github.com/microsoft/playwright-mcp
  • Puppeteer documentation — https://pptr.dev/
  • puppeteer-extra-plugin-stealth — https://github.com/berstend/puppeteer-extra/tree/master/packages/puppeteer-extra-plugin-stealth
  • Selenium documentation — https://www.selenium.dev/documentation/
  • WebDriver BiDi specification — https://w3c.github.io/webdriver-bidi/
  • undetected-chromedriver — https://github.com/ultrafunkamsterdam/undetected-chromedriver
  • Crawlee for Node — https://crawlee.dev/
  • Crawlee for Python — https://crawlee.dev/python/
  • Apify platform — https://apify.com/
  • Apify Store — https://apify.com/store
  • Bright Data — https://brightdata.com/
  • Oxylabs — https://oxylabs.io/
  • Smartproxy / Decodo — https://decodo.com/
  • ScrapingBee — https://www.scrapingbee.com/
  • Browserless — https://www.browserless.io/
  • ZenRows — https://www.zenrows.com/
  • ScrapingAnt — https://scrapingant.com/
  • Firecrawl — https://www.firecrawl.dev/
  • Firecrawl GitHub — https://github.com/mendableai/firecrawl
  • Jina AI Reader — https://jina.ai/reader/
  • Reader-LM model card — https://huggingface.co/jinaai/reader-lm-1.5b
  • Diffbot — https://www.diffbot.com/
  • Stagehand — https://www.stagehand.dev/
  • Stagehand GitHub — https://github.com/browserbase/stagehand
  • Browserbase — https://www.browserbase.com/
  • Browser Use — https://github.com/browser-use/browser-use
  • AnchorBrowser — https://anchorbrowser.io/
  • Camoufox — https://github.com/daijro/camoufox
  • Cheerio — https://cheerio.js.org/
  • Beautiful Soup — https://www.crummy.com/software/BeautifulSoup/
  • lxml — https://lxml.de/
  • jsoup — https://jsoup.org/
  • Goutte — https://github.com/FriendsOfPHP/Goutte
  • Mechanize (Python) — https://github.com/python-mechanize/mechanize
  • Robots Exclusion Protocol (RFC 9309) — https://www.rfc-editor.org/rfc/rfc9309.html
  • Sitemaps XML format — https://www.sitemaps.org/protocol.html
  • Common Crawl — https://commoncrawl.org/
  • TossPayments 利用規約 — https://docs.tosspayments.com/
  • 日本著作権法第30条の4(情報解析) — https://www.bunka.go.jp/seisaku/chosakuken/
  • メルカリ利用規約 — https://www.mercari.com/jp/tos/