WebスクレイピングはAIエージェントの目として欠かせない技術になっている。しかしセレクタが壊れるたびにコードを直し、Cloudflareに弾かれるたびに手を焼く—その繰り返しに疲れた開発者向けに、Pythonの新世代スクレイピングOSSが急速に支持を集めている。

Scraplingは、ボット検知の回避・要素の自動追尾・大規模クロール・MCPサーバー連携を一つのライブラリで提供するオープンソースのWebスクレイピングフレームワークだ。2024年10月の公開から約1年半でGitHubスターが43,000を超え、最新版のv0.4.7(2026年4月リリース)ではAIエージェント向けのスクリーンショットMCPツールも追加されている。

この記事でわかること:

  • Scraplingが解決する3つの課題
  • アダプティブ追尾・ステルス取得・Spiderフレームワークの仕組み
  • インストール方法と基本的なコード例
  • BeautifulSoup・Scrapyとのパフォーマンス比較
  • AIエージェントとのMCP連携の使い方

https://github.com/D4Vinci/Scrapling

スクレイパーが抱える3つの課題

Webスクレイピングの実務で繰り返し起こる問題は主に3つある。

セレクタの維持コスト。XPathやCSSセレクタはサイトのレイアウトが変わるたびに壊れる。ターゲットサイトのデザインリニューアルのたびにスクリプトを修正するのは保守コストとして馬鹿にならない。

ボット検知による遮断。Cloudflare TurnstileやAkamaiといったアンチボットシステムは年々精度が上がり、シンプルなリクエストはもちろん、Playwrightを使った自動化も検知されるケースが増えている。

規模拡張の複雑さ。単発のスクレイピングから大規模な定期クロールに移行しようとすると、並行処理・プロキシ管理・障害回復といった仕組みを別途組む必要がある。

Scraplingはこれら3つの課題をそれぞれ専用のモジュールで解決する設計になっている。

アダプティブ要素追尾でセレクタを自動補正する

Scraplingの最もユニークな機能が「アダプティブ追尾」だ。通常のスクレイパーは保存したセレクタでDOM要素を探すが、Scraplingは要素の位置・テキスト・属性を類似度アルゴリズムで記憶し、サイトのリニューアル後も自動で目的の要素を見つけ直せる。

from scrapling.fetchers import StealthyFetcher

StealthyFetcher.adaptive = True
p = StealthyFetcher.fetch('https://example.com', headless=True)

# 初回は通常通り取得して保存
products = p.css('.product', auto_save=True)

# サイト構造が変わっても adaptive=True で自動追尾
products = p.css('.product', adaptive=True)

auto_save=Trueで要素情報を記録しておくと、次回からadaptive=Trueを渡すだけで変化後の要素位置を再検出する。手動でセレクタを修正する作業が大幅に減る。

Cloudflare Turnstileを突破するStealthyFetcher

Scraplingには3種類のフェッチャーが用意されている。

FetcherはHTTPリクエストに特化したクラスで、ブラウザのTLS指紋やHTTPヘッダを偽装してCloudflareの基本的なチェックをパスする。HTTP/3にも対応しており、通常のサイトに対しては最速の選択肢だ。

StealthyFetcherは高度なボット検知を突破するクラスで、Cloudflare TurnstileやInterstitialページを自動で通過できる。ブラウザの指紋全体をスプーフィングすることで人間のブラウジングと区別しにくい挙動を再現する。

DynamicFetcherはPlaywright経由のフルブラウザ自動化で、JavaScriptを大量に使う動的なサイトに対応する。

いずれも非同期版クラスが用意されており、AsyncFetcherStealthyAsyncFetcherとして利用できる。

Spiderフレームワークで大規模クロールを管理する

ScraplingはScrapyに近いSpider APIを持ち、小規模なスクリプトから本格的なクロールシステムへの移行がスムーズだ。

from scrapling.spiders import Spider, Response

class QuotesSpider(Spider):
    name = "quotes"
    start_urls = ["https://quotes.toscrape.com/"]

    async def parse(self, response: Response):
        for item in response.css('.quote'):
            yield {
                "text": item.css('.text::text').get(),
                "author": item.css('.author::text').get(),
            }

result = QuotesSpider().start()
result.items.to_json('quotes.json')

主要な機能は以下の通りだ。並行クロールはドメイン単位でのスロットリングに対応し、Ctrl+Cで安全に一時停止してチェックポイントから再開できる。async for item in spider.stream()のストリーミングモードではスクレイプしたアイテムをリアルタイムでパイプラインに流せる。robots.txtの遵守設定(robots_txt_obey)も標準で備わっている。

MCPサーバーでAIエージェントと連携する

v0.4.7で追加されたMCPサーバー機能により、ClaudeやCursorなどのAIエージェントからScraplingを直接操作できるようになっている。エージェントにURLを渡すだけでスクレイピングを実行させられるほか、スクリーンショットを撮影してモデルに画像として渡すscreenshotツールも追加された。

MCPサーバーは取得した本文から必要な情報だけをAIに渡す設計になっているため、Webページ全体をトークンとして流す方式と比べてコストと処理速度の両方で有利だ。

インストールは専用の extras で行う。

pip install "scrapling[ai]"

BeautifulSoupやScrapyとの速度比較

READMEに掲載されているベンチマーク(5,000ネスト要素のテキスト抽出、100回以上の平均)では、Scraplingのパーサーがlxmlと同等の速度を保ちながら、BeautifulSoup(lxml backend)比で約784倍速いという結果が出ている(参考)。

ライブラリ 処理時間(ms) Scrapling比
Scrapling 2.02 1.0x
Parsel/Scrapy 2.04 1.01x
Raw lxml 2.54 1.26x
PyQuery 24.17 約12x
BeautifulSoup (lxml) 1,584 約784x
BeautifulSoup (html5lib) 3,392 約1,679x

アダプティブ要素検索では、AutoScraperと比較して約5倍の速度差がある。

インストール方法

Python 3.10以上が必要だ。

# パーサーのみ(フェッチャーなし)
pip install scrapling

# フェッチャー込みでインストール
pip install "scrapling[fetchers]"
scrapling install  # ブラウザバイナリをインストール

# 全機能(MCP・シェル含む)
pip install "scrapling[all]"
scrapling install

Dockerイメージも提供されており、すべてのブラウザを含んだ状態でそのまま使える。

docker pull d4vinci/scrapling:latest

BeautifulSoupやScrapyからの移行

Scraplingのセレクタ記法はScrapy/Parselと互換性を持つように設計されており、既存のコードを大幅に書き換えずに移行できる。BeautifulSoup的なDOM探索(親・兄弟・子要素のナビゲーション)にも対応している。

Scrapyとの主な違いは3点だ。アダプティブ追尾機能、ボット検知回避機能、そしてMCPサーバー対応がScraplingに追加されている一方、Scrapyが持つミドルウェアの豊富なエコシステムはまだ発展途上だ。単一ページの取得から大規模クロールまでを1ライブラリで完結させたい場合に有力な選択肢となる。

ライセンスはMITで、商用利用を含む自由な利用が可能だ。