Scraper_hub / Scrapling /docs /README_JP.md
AUXteam's picture
Upload folder using huggingface_hub
e840680 verified

Scrapling Poster
Effortless Web Scraping for the Modern Web

Tests PyPI version PyPI Downloads
Discord X (formerly Twitter) Follow
Supported Python versions

選択メソッド · Fetcherの選び方 · スパイダー · プロキシローテーション · CLI · MCPモード

Scraplingは、単一のリクエストから本格的なクロールまですべてを処理する適応型Web Scrapingフレームワークです。

そのパーサーはウェブサイトの変更から学習し、ページが更新されたときに要素を自動的に再配置します。Fetcherはすぐに使えるCloudflare Turnstileなどのアンチボットシステムを回避します。そしてSpiderフレームワークにより、Pause & Resumeや自動Proxy回転機能を備えた並行マルチSessionクロールへとスケールアップできます — すべてわずか数行のPythonで。1つのライブラリ、妥協なし。

リアルタイム統計とStreamingによる超高速クロール。Web Scraperによって、Web Scraperと一般ユーザーのために構築され、誰にでも何かがあります。

from scrapling.fetchers import Fetcher, AsyncFetcher, StealthyFetcher, DynamicFetcher
StealthyFetcher.adaptive = True
p = StealthyFetcher.fetch('https://example.com', headless=True, network_idle=True)  # レーダーの下でウェブサイトを取得!
products = p.css('.product', auto_save=True)                                        # ウェブサイトのデザイン変更に耐えるデータをスクレイプ!
products = p.css('.product', adaptive=True)                                         # 後でウェブサイトの構造が変わったら、`adaptive=True`を渡して見つける!

または本格的なクロールへスケールアップ

from scrapling.spiders import Spider, Response

class MySpider(Spider):
  name = "demo"
  start_urls = ["https://example.com/"]

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

MySpider().start()

プラチナスポンサー

スポンサー

ここに広告を表示したいですか?こちらをクリックして、あなたに合ったティアを選択してください!


主な機能

Spider — 本格的なクロールフレームワーク

  • 🕷️ Scrapy風のSpider APIstart_urls、async parse callback、Request/ResponseオブジェクトでSpiderを定義。
  • 並行クロール:設定可能な並行数制限、ドメインごとのスロットリング、ダウンロード遅延。
  • 🔄 マルチSessionサポート:HTTPリクエストとステルスヘッドレスブラウザの統一インターフェース — IDによって異なるSessionにリクエストをルーティング。
  • 💾 Pause & Resume:Checkpointベースのクロール永続化。Ctrl+Cで正常にシャットダウン;再起動すると中断したところから再開。
  • 📡 Streamingモードasync for item in spider.stream()でリアルタイム統計とともにスクレイプされたアイテムをStreamingで受信 — UI、パイプライン、長時間実行クロールに最適。
  • 🛡️ ブロックされたリクエストの検出:カスタマイズ可能なロジックによるブロックされたリクエストの自動検出とリトライ。
  • 📦 組み込みエクスポート:フックや独自のパイプライン、または組み込みのJSON/JSONLで結果をエクスポート。それぞれresult.items.to_json() / result.items.to_jsonl()を使用。

Sessionサポート付き高度なウェブサイト取得

  • HTTPリクエストFetcherクラスで高速かつステルスなHTTPリクエスト。ブラウザのTLS fingerprint、ヘッダーを模倣し、HTTP/3を使用可能。
  • 動的読み込み:PlaywrightのChromiumとGoogle ChromeをサポートするDynamicFetcherクラスによる完全なブラウザ自動化で動的ウェブサイトを取得。
  • アンチボット回避StealthyFetcherとfingerprint偽装による高度なステルス機能。自動化でCloudflareのTurnstile/Interstitialのすべてのタイプを簡単に回避。
  • Session管理:リクエスト間でCookieと状態を管理するためのFetcherSessionStealthySessionDynamicSessionクラスによる永続的なSessionサポート。
  • Proxy回転:すべてのSessionタイプに対応したラウンドロビンまたはカスタム戦略の組み込みProxyRotator、さらにリクエストごとのProxyオーバーライド。
  • ドメインブロック:ブラウザベースのFetcherで特定のドメイン(およびそのサブドメイン)へのリクエストをブロック。
  • asyncサポート:すべてのFetcherおよび専用asyncSessionクラス全体での完全なasyncサポート。

適応型スクレイピングとAI統合

  • 🔄 スマート要素追跡:インテリジェントな類似性アルゴリズムを使用してウェブサイトの変更後に要素を再配置。
  • 🎯 スマート柔軟選択:CSSセレクタ、XPathセレクタ、フィルタベース検索、テキスト検索、正規表現検索など。
  • 🔍 類似要素の検出:見つかった要素に類似した要素を自動的に特定。
  • 🤖 AIと使用するMCPサーバー:AI支援Web Scrapingとデータ抽出のための組み込みMCPサーバー。MCPサーバーは、AI(Claude/Cursorなど)に渡す前にScraplingを活用してターゲットコンテンツを抽出する強力でカスタムな機能を備えており、操作を高速化し、トークン使用量を最小限に抑えることでコストを削減します。(デモ動画

高性能で実戦テスト済みのアーキテクチャ

  • 🚀 超高速:ほとんどのPythonスクレイピングライブラリを上回る最適化されたパフォーマンス。
  • 🔋 メモリ効率:最小のメモリフットプリントのための最適化されたデータ構造と遅延読み込み。
  • 高速JSONシリアル化:標準ライブラリの10倍の速度。
  • 🏗️ 実戦テスト済み:Scraplingは92%のテストカバレッジと完全な型ヒントカバレッジを備えているだけでなく、過去1年間に数百人のWeb Scraperによって毎日使用されてきました。

開発者/Web Scraperにやさしい体験

  • 🎯 インタラクティブWeb Scraping Shell:Scrapling統合、ショートカット、curlリクエストをScraplingリクエストに変換したり、ブラウザでリクエスト結果を表示したりするなどの新しいツールを備えたオプションの組み込みIPython Shellで、Web Scrapingスクリプトの開発を加速。
  • 🚀 ターミナルから直接使用:オプションで、コードを一行も書かずにScraplingを使用してURLをスクレイプできます!
  • 🛠️ 豊富なナビゲーションAPI:親、兄弟、子のナビゲーションメソッドによる高度なDOMトラバーサル。
  • 🧬 強化されたテキスト処理:組み込みの正規表現、クリーニングメソッド、最適化された文字列操作。
  • 📝 自動セレクタ生成:任意の要素に対して堅牢なCSS/XPathセレクタを生成。
  • 🔌 馴染みのあるAPI:Scrapy/Parselで使用されている同じ疑似要素を持つScrapy/BeautifulSoupに似た設計。
  • 📘 完全な型カバレッジ:優れたIDEサポートとコード補完のための完全な型ヒント。コードベース全体が変更のたびにPyRightMyPyで自動的にスキャンされます。
  • 🔋 すぐに使えるDockerイメージ:各リリースで、すべてのブラウザを含むDockerイメージが自動的にビルドおよびプッシュされます。

はじめに

深く掘り下げずに、Scraplingにできることの簡単な概要をお見せしましょう。

基本的な使い方

Sessionサポート付きHTTPリクエスト

from scrapling.fetchers import Fetcher, FetcherSession

with FetcherSession(impersonate='chrome') as session:  # ChromeのTLS fingerprintの最新バージョンを使用
    page = session.get('https://quotes.toscrape.com/', stealthy_headers=True)
    quotes = page.css('.quote .text::text').getall()

# または一回限りのリクエストを使用
page = Fetcher.get('https://quotes.toscrape.com/')
quotes = page.css('.quote .text::text').getall()

高度なステルスモード

from scrapling.fetchers import StealthyFetcher, StealthySession

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').getall()

# または一回限りのリクエストスタイル、このリクエストのためにブラウザを開き、完了後に閉じる
page = StealthyFetcher.fetch('https://nopecha.com/demo/cloudflare')
data = page.css('#padded_content a').getall()

完全なブラウザ自動化

from scrapling.fetchers import DynamicFetcher, DynamicSession

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()').getall()  # お好みであればXPathセレクタを使用

# または一回限りのリクエストスタイル、このリクエストのためにブラウザを開き、完了後に閉じる
page = DynamicFetcher.fetch('https://quotes.toscrape.com/')
data = page.css('.quote .text::text').getall()

Spider

並行リクエスト、複数のSessionタイプ、Pause & Resumeを備えた本格的なクローラーを構築:

from scrapling.spiders import Spider, Request, Response

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

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

        next_page = response.css('.next a')
        if next_page:
            yield response.follow(next_page[0].attrib['href'])

result = QuotesSpider().start()
print(f"{len(result.items)}件の引用をスクレイプしました")
result.items.to_json("quotes.json")

単一のSpiderで複数のSessionタイプを使用:

from scrapling.spiders import Spider, Request, Response
from scrapling.fetchers import FetcherSession, AsyncStealthySession

class MultiSessionSpider(Spider):
    name = "multi"
    start_urls = ["https://example.com/"]

    def configure_sessions(self, manager):
        manager.add("fast", FetcherSession(impersonate="chrome"))
        manager.add("stealth", AsyncStealthySession(headless=True), lazy=True)

    async def parse(self, response: Response):
        for link in response.css('a::attr(href)').getall():
            # 保護されたページはステルスSessionを通してルーティング
            if "protected" in link:
                yield Request(link, sid="stealth")
            else:
                yield Request(link, sid="fast", callback=self.parse)  # 明示的なcallback

Checkpointを使用して長時間のクロールをPause & Resume:

QuotesSpider(crawldir="./crawl_data").start()

Ctrl+Cを押すと正常に一時停止し、進捗は自動的に保存されます。後でSpiderを再度起動する際に同じcrawldirを渡すと、中断したところから再開します。

高度なパースとナビゲーション

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')

# 高度なナビゲーション
quote_text = page.css('.quote')[0].css('.text::text').get()
quote_text = page.css('.quote').css('.text::text').getall()  # チェーンセレクタ
first_quote = page.css('.quote')[0]
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("<html>...</html>")

まったく同じ方法で動作します!

非同期Session管理の例

import asyncio
from scrapling.fetchers import FetcherSession, AsyncStealthySession, AsyncDynamicSession

async with FetcherSession(http3=True) as session:  # `FetcherSession`はコンテキストアウェアで、同期/非同期両方のパターンで動作可能
    page1 = session.get('https://quotes.toscrape.com/')
    page2 = session.get('https://quotes.toscrape.com/', impersonate='firefox135')

# 非同期Sessionの使用
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())  # オプション - ブラウザタブプールのステータス(ビジー/フリー/エラー)
    results = await asyncio.gather(*tasks)
    print(session.get_pool_stats())

CLIとインタラクティブShell

Scraplingには強力なコマンドラインインターフェースが含まれています:

asciicast

インタラクティブWeb Scraping Shellを起動

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 Scraping Shellなど、他にも多くの追加機能がありますが、このページは簡潔に保ちたいと思います。完全なドキュメントはこちらをご覧ください

パフォーマンスベンチマーク

Scraplingは強力であるだけでなく、超高速です。以下のベンチマークは、Scraplingのパーサーを他の人気ライブラリの最新バージョンと比較しています。

テキスト抽出速度テスト(5000個のネストされた要素)

# ライブラリ 時間(ms) vs Scrapling
1 Scrapling 2.02 1.0x
2 Parsel/Scrapy 2.04 1.01
3 Raw Lxml 2.54 1.257
4 PyQuery 24.17 ~12x
5 Selectolax 82.63 ~41x
6 MechanicalSoup 1549.71 ~767.1x
7 BS4 with Lxml 1584.31 ~784.3x
8 BS4 with html5lib 3391.91 ~1679.1x

要素類似性とテキスト検索のパフォーマンス

Scraplingの適応型要素検索機能は代替手段を大幅に上回ります:

ライブラリ 時間(ms) vs Scrapling
Scrapling 2.39 1.0x
AutoScraper 12.45 5.209x

すべてのベンチマークは100回以上の実行の平均を表します。方法論についてはbenchmarks.pyを参照してください。

インストール

ScraplingにはPython 3.10以上が必要です:

pip install scrapling

このインストールにはパーサーエンジンとその依存関係のみが含まれており、Fetcherやコマンドライン依存関係は含まれていません。

オプションの依存関係

  1. 以下の追加機能、Fetcher、またはそれらのクラスのいずれかを使用する場合は、Fetcherの依存関係とブラウザの依存関係を次のようにインストールする必要があります:

    pip install "scrapling[fetchers]"
    
    scrapling install
    

    これにより、すべてのブラウザ、およびそれらのシステム依存関係とfingerprint操作依存関係がダウンロードされます。

  2. 追加機能:

    • MCPサーバー機能をインストール:
      pip install "scrapling[ai]"
      
    • Shell機能(Web Scraping Shellとextractコマンド)をインストール:
      pip install "scrapling[shell]"
      
    • すべてをインストール:
      pip install "scrapling[all]"
      
      これらの追加機能のいずれかの後(まだインストールしていない場合)、scrapling installでブラウザの依存関係をインストールする必要があることを忘れないでください

Docker

DockerHubから次のコマンドですべての追加機能とブラウザを含むDockerイメージをインストールすることもできます:

docker pull pyd4vinci/scrapling

またはGitHubレジストリからダウンロード:

docker pull ghcr.io/d4vinci/scrapling:latest

このイメージは、GitHub Actionsとリポジトリのメインブランチを使用して自動的にビルドおよびプッシュされます。

貢献

貢献を歓迎します!始める前に貢献ガイドラインをお読みください。

免責事項

このライブラリは教育および研究目的のみで提供されています。このライブラリを使用することにより、地域および国際的なデータスクレイピングおよびプライバシー法に準拠することに同意したものとみなされます。著者および貢献者は、このソフトウェアの誤用について責任を負いません。常にウェブサイトの利用規約とrobots.txtファイルを尊重してください。

ライセンス

この作品はBSD-3-Clauseライセンスの下でライセンスされています。

謝辞

このプロジェクトには次から適応されたコードが含まれています:

  • Parsel(BSDライセンス)— translatorサブモジュールに使用

Karim Shoairによって❤️でデザインおよび作成されました。