Scraplingとは何か?
Scraplingは単なるWebスクレイピングライブラリではありません。ウェブサイトの変更から学習し、それに適応する最初のアダプティブスクレイピングライブラリです 🚀 他のライブラリがウェブサイトの構造変更で動作しなくなる一方で、Scraplingは自動的に要素を再配置し、スクレイパーを稼働し続けます。
現代のWeb向けに構築されたScraplingは、独自の高速パーシングエンジンとフェッチャーを搭載し、あなたが直面する、または将来直面するすべてのWebスクレイピングの課題に対応します。Webスクレイパーによって、Webスクレイパーと一般ユーザーのために開発されており、誰にとっても価値のある機能が揃っています。
from scrapling.fetchers import Fetcher, AsyncFetcher, StealthyFetcher, DynamicFetcher
StealthyFetcher.adaptive = True
# レーダーの下でウェブサイトのソースを取得!
page = StealthyFetcher.fetch('https://example.com', headless=True, network_idle=True)
print(page.status)
# 200
# ウェブサイトのデザイン変更にも耐えられるデータをスクレイピング!
products = page.css('.product', auto_save=True)
# 後でウェブサイトの構造が変更された場合、`adaptive=True`を渡すだけ
products = page.css('.product', adaptive=True) # Scraplingがそれでも要素を見つけます!
主な機能 ✨
セッションサポート付き高度なウェブサイト取得
-
HTTPリクエスト:
Fetcherクラスを使った高速でステルスなHTTPリクエスト。ブラウザのTLSフィンガープリント、ヘッダーの模倣、HTTP3の使用が可能 -
動的読み込み: PlaywrightのChromium、実際のChrome、カスタムステルスモードをサポートする
DynamicFetcherクラスによる完全なブラウザ自動化で動的ウェブサイトを取得 -
アンチボット回避: 改良版Firefoxとフィンガープリントスプーフィングを使用した
StealthyFetcherによる高度なステルス機能。自動化で全種類のCloudflareのTurnstileとInterstitialを簡単にバイパス可能 ⚠️ -
セッション管理:
FetcherSession、StealthySession、DynamicSessionクラスによる永続的なセッションサポートで、リクエスト間でのクッキーと状態の管理 - 非同期サポート: すべてのフェッチャーと専用の非同期セッションクラスで完全な非同期サポート
アダプティブスクレイピングとAI統合 🤖
- 🔄 スマート要素追跡: インテリジェントな類似性アルゴリズムを使用して、ウェブサイト変更後に要素を再配置
- 🎯 スマート柔軟選択: CSSセレクター、XPathセレクター、フィルタベース検索、テキスト検索、正規表現検索など
- 🔍 類似要素の検索: 見つかった要素に類似する要素を自動的に配置
- 🤖 AIで使用するMCPサーバー: AI支援Webスクレイピングとデータ抽出用の組み込みMCPサーバー。MCPサーバーは、Scraplingを活用して対象コンテンツを抽出してからAI(Claude/Cursor等)に渡すカスタムで強力な機能を備えており、操作を高速化し、トークン使用量を最小限に抑えてコストを削減します(デモ動画)
高性能で実戦検証済みのアーキテクチャ 💪
- 🚀 超高速: ほとんどのPythonスクレイピングライブラリを上回る最適化されたパフォーマンス
- 🔋 メモリ効率: 最小限のメモリフットプリントのための最適化されたデータ構造と遅延読み込み
- ⚡ 高速JSONシリアライゼーション: 標準ライブラリの10倍高速
- 🏗️ 実戦検証済み: Scraplingは92%のテストカバレッジと完全な型ヒントカバレッジを持つだけでなく、過去1年間、何百ものWebスクレイパーによって日々使用されています
開発者/Webスクレイパーフレンドリーな体験 📝
- 🎯 インタラクティブWebスクレイピングシェル: Scrapling統合、ショートカット、curlリクエストをScraplingリクエストに変換したり、ブラウザでリクエスト結果を表示したりするなど、Webスクレイピングスクリプト開発を高速化する新しいツールを備えたオプションの組み込みIPythonシェル
- 🚀 ターミナルから直接使用: オプションで、Scraplingを使用して1行もコードを書かずにURLをスクレイピング可能
- 🛠️ リッチナビゲーションAPI: 親、兄弟、子ナビゲーションメソッドによる高度なDOMトラバーサル
- 🧬 強化されたテキスト処理: 組み込みの正規表現、クリーニングメソッド、最適化された文字列操作
- 📝 自動セレクター生成: 任意の要素に対して堅牢なCSS/XPathセレクターを生成
- 🔌 馴染みのあるAPI: Scrapy/BeautifulSoupに似た、Scrapy/Parselで使用されているのと同じ疑似要素を使用
- 📘 完全な型カバレッジ: 優れたIDEサポートとコード補完のための完全な型ヒント
- 🔋 準備済みDockerイメージ: 各リリースで、すべてのブラウザを含むDockerイメージが自動的にビルドされてプッシュされます
基本的な使い方
from scrapling.fetchers import Fetcher, StealthyFetcher, DynamicFetcher
from scrapling.fetchers import FetcherSession, StealthySession, DynamicSession
# セッションサポート付きHTTPリクエスト
with FetcherSession(impersonate='chrome') as session: # ChromeのTLSフィンガープリントの最新バージョンを使用
page = session.get('https://quotes.toscrape.com/', stealthy_headers=True)
quotes = page.css('.quote .text::text')
# または、ワンオフリクエストを使用
page = Fetcher.get('https://quotes.toscrape.com/')
quotes = page.css('.quote .text::text')
# 高度なステルスモード(終了するまでブラウザを開いたままにする)
with StealthySession(headless=True, solve_cloudflare=True) as session:
page = session.fetch('https://nopecha.com/demo/cloudflare', google_search=False)
data = page.css('#padded_content a')
# または、ワンオフリクエストスタイルを使用。このリクエストのためにブラウザを開き、終了後に閉じます
page = StealthyFetcher.fetch('https://nopecha.com/demo/cloudflare')
data = page.css('#padded_content a')
# 完全なブラウザ自動化(終了するまでブラウザを開いたままにする)
with DynamicSession(headless=True, disable_resources=False, network_idle=True) as session:
page = session.fetch('https://quotes.toscrape.com/', load_dom=False)
data = page.xpath('//span[@class="text"]/text()') # お好みであればXPathセレクターも使用可能
# または、ワンオフリクエストスタイルを使用
page = DynamicFetcher.fetch('https://quotes.toscrape.com/')
data = page.css('.quote .text::text')
💡 注記: The Web Scraping Clubによって書かれた、スクレイピングを素早く始めるための素晴らしいガイドがあります。ドキュメントウェブサイトよりも始めやすいと感じるかもしれません。
高度なパーシングとナビゲーション
from scrapling.fetchers import Fetcher
# リッチな要素選択とナビゲーション
page = Fetcher.get('https://quotes.toscrape.com/')
# 複数の選択メソッドで引用を取得
quotes = page.css('.quote') # CSSセレクター
quotes = page.xpath('//div[@class="quote"]') # XPath
quotes = page.find_all('div', {'class': 'quote'}) # BeautifulSoupスタイル
# 以下と同じ
quotes = page.find_all('div', class_='quote')
quotes = page.find_all(['div'], class_='quote')
quotes = page.find_all(class_='quote') # など...
# テキストコンテンツで要素を検索
quotes = page.find_by_text('quote', tag='div')
# 高度なナビゲーション
first_quote = page.css_first('.quote')
quote_text = first_quote.css('.text::text')
quote_text = page.css('.quote').css_first('.text::text') # チェーンセレクター
quote_text = page.css_first('.quote .text').text # 最初の要素が必要な場合は`css`より`css_first`の方が高速
author = first_quote.next_sibling.css('.author::text')
parent_container = first_quote.parent
# 要素の関係性と類似性
similar_elements = first_quote.find_similar()
below_elements = first_quote.below_elements()
ウェブサイトを取得したくない場合は、以下のようにパーサーをすぐに使用できます:
from scrapling.parser import Selector
page = Selector("...")
これは全く同じように動作します!
非同期セッション管理の例
import asyncio
from scrapling.fetchers import FetcherSession, AsyncStealthySession, AsyncDynamicSession
# `FetcherSession`はコンテキスト対応で、同期/非同期パターンの両方で動作可能
async with FetcherSession(http3=True) as session:
page1 = session.get('https://quotes.toscrape.com/')
page2 = session.get('https://quotes.toscrape.com/', impersonate='firefox135')
# 非同期セッションの使用
async with AsyncStealthySession(max_pages=2) as session:
tasks = []
urls = ['https://example.com/page1', 'https://example.com/page2']
for url in urls:
task = session.fetch(url)
tasks.append(task)
print(session.get_pool_stats()) # オプション - ブラウザタブプールのステータス(busy/free/error)
results = await asyncio.gather(*tasks)
print(session.get_pool_stats())
CLIとインタラクティブシェル 🔧
Scrapling v0.3には強力なコマンドラインインターフェースが含まれています:
# インタラクティブWebスクレイピングシェルを起動
scrapling shell
# プログラミングなしでページを直接ファイルに抽出(デフォルトで`body`タグ内のコンテンツを抽出)
# 出力ファイルが`.txt`で終わる場合、ターゲットのテキストコンテンツが抽出されます
# `.md`で終わる場合はHTMLコンテンツのMarkdown表現、`.html`の場合はHTMLコンテンツそのままです
scrapling extract get 'https://example.com' content.md
scrapling extract get 'https://example.com' content.txt --css-selector '#fromSkipToProducts' --impersonate 'chrome'
# CSSセレクター'#fromSkipToProducts'に一致するすべての要素
scrapling extract fetch 'https://example.com' content.md --css-selector '#fromSkipToProducts' --no-headless
scrapling extract stealthy-fetch 'https://nopecha.com/demo/cloudflare' captchas.html --css-selector '#padded_content a' --solve-cloudflare
💡 注記: MCPサーバーやインタラクティブWebスクレイピングシェルなど、他にも多くの追加機能がありますが、このページを簡潔に保ちたいと考えています。完全なドキュメントはこちらをご覧ください。
パフォーマンスベンチマーク
Scraplingは単に強力なだけでなく、非常に高速です。バージョン0.3以降の更新により、すべての操作で優れたパフォーマンスの向上が実現されています。
テキスト抽出速度テスト(5000のネストされた要素)
| # | ライブラリ | 時間(ms) | Scraplingとの比較 |
|---|---|---|---|
| 1 | Scrapling | 1.92 | 1.0x |
| 2 | Parsel/Scrapy | 1.99 | 1.036x |
| 3 | Raw Lxml | 2.33 | 1.214x |
| 4 | PyQuery | 20.61 | ~11x |
| 5 | Selectolax | 80.65 | ~42x |
| 6 | BS4 with Lxml | 1283.21 | ~698x |
| 7 | MechanicalSoup | 1304.57 | ~679x |
| 8 | BS4 with html5lib | 3331.96 | ~1735x |
要素の類似性とテキスト検索のパフォーマンス
Scraplingのアダプティブ要素検索機能は、代替手段を大幅に上回ります:
| ライブラリ | 時間(ms) | Scraplingとの比較 |
|---|---|---|
| Scrapling | 1.87 | 1.0x |
| AutoScraper | 10.24 | 5.476x |
すべてのベンチマークは100回以上の実行の平均を表しています。方法論についてはbenchmarks.pyを参照してください。
インストール方法
# ScraplingにはPython 3.10以上が必要です
pip install scrapling
v0.3.2以降、このインストールにはパーサーエンジンとその依存関係のみが含まれ、フェッチャーやコマンドライン依存関係は含まれていません。
オプションの依存関係
以下の追加機能、フェッチャー、またはそのクラスを使用する場合は、フェッチャーの依存関係をインストールし、その後ブラウザの依存関係をインストールする必要があります:
pip install "scrapling[fetchers]"
scrapling install
これにより、すべてのブラウザとそのシステム依存関係、フィンガープリント操作の依存関係がダウンロードされます。
追加機能
# MCPサーバー機能をインストール
pip install "scrapling[ai]"
# シェル機能をインストール(Webスクレイピングシェルとextractコマンド)
pip install "scrapling[shell]"
# すべてをインストール
pip install "scrapling[all]"
これらのextraのいずれかの後、ブラウザの依存関係をscrapling installでインストールする必要があります(まだインストールしていない場合)。
Docker
すべてのextraとブラウザを含むDockerイメージを、DockerHubから次のコマンドでインストールすることもできます:
docker pull pyd4vinci/scrapling
# または、GitHubレジストリからダウンロード
docker pull ghcr.io/d4vinci/scrapling:latest
このイメージは、リポジトリのメインブランチでGitHub actionsを通じて自動的にビルドおよびプッシュされます。
コントリビューション
コントリビューションを歓迎します!始める前に、コントリビューティングガイドラインをお読みください。
免責事項 ⚠️
注意事項
このライブラリは教育および研究目的でのみ提供されています。このライブラリを使用することにより、地域および国際的なデータスクレイピングおよびプライバシー法に従うことに同意したものとみなされます。著者および貢献者は、このソフトウェアの誤用について一切の責任を負いません。常にウェブサイトの利用規約とrobots.txtファイルを尊重してください。
