CAPSOLVER
ブログ
2025年にScrapyとPlaywrightを使ってウェブスクレイピングの課題を解決する方法

2025年にScrapyとPlaywrightを使ってウェブスクレイピングの課題を解決する方法

Logo of CapSolver

Anh Tuan

Data Science Expert

12-Nov-2024

Scrapy-Playwright とは?

Scrapy-Playwright は、Python 用の高速かつ強力な Web スクレイピングフレームワークである Scrapy と、ブラウザ自動化ライブラリである Playwright を統合するミドルウェアです。この組み合わせにより、Scrapy は Playwright の動的コンテンツのレンダリング、Web ページとの対話、ブラウザコンテキストのシームレスな管理機能を活用することで、JavaScript を多用した Web サイトを処理できます。

なぜ Scrapy-Playwright を使うべきなのか?

Scrapy は静的 Web サイトのスクレイピングに優れていますが、今日の多くの Web サイトはコンテンツを動的にレンダリングするために JavaScript に大きく依存しています。従来の Scrapy スパイダーは、これらのサイトを処理するときに苦労することが多く、重要なデータを見逃したり、複雑なページ構造をナビゲートできなかったりします。Scrapy-Playwright は、Scrapy がヘッドレスブラウザを制御できるようにすることで、このギャップを埋めます。これにより、すべての動的コンテンツが完全に読み込まれ、スクレイピングのためにアクセスできるようになります。

Scrapy-Playwright を使う利点

  • JavaScript のレンダリング: JavaScript を使用して動的にコンテンツを読み込む Web サイトを簡単にスクレイピングできます。
  • ヘッドレスブラウジング: 可視ブラウザを使用せずにスクレイピングタスクを実行し、パフォーマンスを最適化できます。
  • 高度な対話: ボタンのクリック、フォームの入力、ページ間のナビゲーションなどの複雑な対話を処理できます。
  • 非同期操作: Playwright の非同期機能を活用して、スクレイピングタスクを高速化できます。

インストール

Scrapy-Playwright を使い始めるには、Scrapy と Playwright の両方をインストールする必要があります。環境をセットアップするには、以下のようにします。

  1. Scrapy をインストールします:

    bash Copy
    pip install scrapy
  2. Scrapy-Playwright をインストールします:

    bash Copy
    pip install scrapy-playwright
  3. Playwright ブラウザをインストールします:

    Playwright をインストールしたら、必要なブラウザバイナリをインストールする必要があります。

    bash Copy
    playwright install

はじめに

新しい Scrapy プロジェクトの設定

まず、まだ行っていない場合は、新しい Scrapy プロジェクトを作成します。

bash Copy
scrapy startproject myproject
cd myproject

Playwright の設定

次に、Scrapy プロジェクトの設定で Playwright を有効にする必要があります。settings.py を開き、次の設定を追加します。

python Copy
# settings.py

# Playwright ダウンローダーミドルウェアを有効にする
DOWNLOADER_MIDDLEWARES = {
    'scrapy_playwright.middleware.ScrapyPlaywrightDownloadHandler': 543,
}

# HTTP と HTTPS のダウンロードハンドラーを指定する
DOWNLOAD_HANDLERS = {
    'http': 'scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler',
    'https': 'scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler',
}

# Playwright 設定を有効にする
TWISTED_REACTOR = 'twisted.internet.asyncioreactor.AsyncioSelectorReactor'

# Playwright 設定(オプション)
PLAYWRIGHT_BROWSER_TYPE = 'chromium'  # 'chromium', 'firefox', または 'webkit' のいずれか
PLAYWRIGHT_LAUNCH_OPTIONS = {
    'headless': True,
}

基本的な使い方

スパイダーの作成

セットアップが完了したら、Playwright を使用して JavaScript でレンダリングされた Web サイトをスクレイピングするシンプルなスパイダーを作成しましょう。ここでは、動的にコンテンツを読み込む架空のサイトをスクレイピングする例として示します。

spiders ディレクトリ内に新しいスパイダーファイル dynamic_spider.py を作成します。

python Copy
# spiders/dynamic_spider.py

import scrapy
from scrapy_playwright.page import PageCoroutine

class DynamicSpider(scrapy.Spider):
    name = "dynamic"
    start_urls = ["https://example.com/dynamic"]

    def start_requests(self):
        for url in self.start_urls:
            yield scrapy.Request(
                url,
                meta={
                    "playwright": True,
                    "playwright_page_coroutines": [
                        PageCoroutine("wait_for_selector", "div.content"),
                    ],
                },
            )

    async def parse(self, response):
        # JavaScript がコンテンツをレンダリングした後にデータを抽出する
        for item in response.css("div.content"):
            yield {
                "title": item.css("h2::text").get(),
                "description": item.css("p::text").get(),
            }

        # 必要に応じてページネーションまたは追加の対話を処理する

JavaScript でレンダリングされたコンテンツの処理

上記の例では、

  • playwright: True: このリクエストに Playwright を使用するように Scrapy に指示します。
  • playwright_page_coroutines: Playwright で実行するアクションを指定します。ここでは、セレクト div.content が読み込まれるのを待って、動的コンテンツが読み込まれた後に解析されます。
  • 非同期 parse メソッド: 非同期機能を活用して、レスポンスを効果的に処理します。

CapSolver を使用した CAPTCHA の解決

Web スクレイピングの大きな課題の 1 つは、自動化されたアクセスを防ぐために設計された CAPTCHA を処理することです。CapSolver は、Playwright などのブラウザ自動化ツールとの統合を含む、さまざまな種類の CAPTCHA を解決するサービスを提供する堅牢なソリューションです。このセクションでは、CapSolver を Scrapy-Playwright に統合して、CAPTCHA をシームレスに処理する方法について説明します。

CapSolver とは?

CapSolver は、captcha や reCAPTCHA を含むさまざまな種類の CAPTCHA を解決するプロセスを自動化する CAPTCHA 解決サービスです。スクレイピングワークフローに CapSolver を統合することで、CAPTCHA の課題を回避し、手動での介入なしにスクレイピングタスクのフローを維持できます。

CapSolver の Scrapy-Playwright への統合

CapSolver を Scrapy-Playwright に統合するには、以下を行う必要があります。

  1. CapSolver ブラウザ拡張機能を入手する: CapSolver は、ブラウザコンテキスト内で CAPTCHA の解決を自動化するブラウザ拡張機能を提供しています。
  2. CapSolver 拡張機能を読み込むように Playwright を設定する: Playwright ブラウザを起動するときに、CapSolver 拡張機能を読み込んで、CAPTCHA の解決を有効にします。
  3. カスタマイズされた Playwright コンテキストを使用するように Scrapy リクエストを変更する: Scrapy リクエストが、CapSolver 拡張機能が読み込まれた Playwright コンテキストを使用するようにしてください。

Python での実装例

以下は、CapSolver を Scrapy-Playwright に統合するためのステップバイステップガイドです。コード例も含まれています。

1. CapSolver ブラウザ拡張機能を入手する

まず、CapSolver ブラウザ拡張機能 をダウンロードし、プロジェクトディレクトリに配置します。拡張機能が CapSolver.Browser.Extension にあるとします。

2. 拡張機能の設定:

  • CapSolver 拡張機能ディレクトリにある構成ファイル ./assets/config.json を見つけます。
  • オプション enabledForcaptchatrue に設定し、自動解決のために captchaModetoken に調整します。

config.json の例:

json Copy
{
  "enabledForcaptcha": true,
  "captchaMode": "token"
  // その他の設定はそのまま
}

3. 拡張機能を読み込むように Scrapy 設定を更新する

settings.py を変更して、CapSolver 拡張機能を読み込むように Playwright を設定します。拡張機能へのパスを指定し、Playwright に必要な引数を渡す必要があります。

python Copy
# settings.py

import os
from pathlib import Path

# 既存の Playwright 設定
PLAYWRIGHT_BROWSER_TYPE = 'chromium'
PLAYWRIGHT_LAUNCH_OPTIONS = {
    'headless': False,  # 拡張機能を読み込むには False である必要があります
    'args': [
        '--disable-extensions-except={}'.format(os.path.abspath('CapSolver.Browser.Extension')),
        '--load-extension={}'.format(os.path.abspath('CapSolver.Browser.Extension')),
    ],
}

# Twisted リアクターが設定されていることを確認する
TWISTED_REACTOR = 'twisted.internet.asyncioreactor.AsyncioSelectorReactor'

注記: ブラウザ拡張機能を読み込むには、ブラウザをヘッドレスモード以外で実行する必要があります。そのため、'headless': False に設定します。

4. CAPTCHA を処理するスパイダーを作成する

CapSolver 拡張機能を使用して CAPTCHA と対話する新しいスパイダーを作成するか、既存のスパイダーを変更します。

python Copy
# spiders/captcha_spider.py

import scrapy
from scrapy_playwright.page import PageCoroutine
import asyncio

class CaptchaSpider(scrapy.Spider):
    name = "captcha_spider"
    start_urls = ["https://site.example/captcha-protected"]

    def start_requests(self):
        for url in self.start_urls:
            yield scrapy.Request(
                url,
                meta={
                    "playwright": True,
                    "playwright_page_coroutines": [
                        PageCoroutine("wait_for_selector", "iframe[src*='captcha']"),
                        PageCoroutine("wait_for_timeout", 1000),  # 拡張機能が処理されるのを待つ
                    ],
                    "playwright_context": "default",
                },
                callback=self.parse_captcha
            )

    async def parse_captcha(self, response):
        page = response.meta["playwright_page"]

        # captcha チェックボックスまたはフレームを見つけて、それに応じて対話する
        try:
            # captcha iframe が利用可能になるまで待つ
            await page.wait_for_selector("iframe[src*='captcha']", timeout=10000)
            frames = page.frames
            captcha_frame = None
            for frame in frames:
                if 'captcha' in frame.url:
                    captcha_frame = frame
                    break

            if captcha_frame:
                # captcha チェックボックスをクリックする
                await captcha_frame.click("div#checkbox")

                # CapSolver が CAPTCHA を解決するのを待つ
                await page.wait_for_selector("div.captcha-success", timeout=60000)  # 必要に応じてセレクターを調整する

                self.logger.info("CAPTCHA は正常に解決されました。")
            else:
                self.logger.warning("captcha iframe が見つかりませんでした。")
        except Exception as e:
            self.logger.error(f"CAPTCHA 処理中のエラー: {e}")

        # CAPTCHA が解決されたら、ページの解析を続行する
        for item in response.css("div.content"):
            yield {
                "title": item.css("h2::text").get(),
                "description": item.css("p::text").get(),
            }

        # 必要に応じてページネーションまたは追加の対話を処理する

5. スパイダーの実行

すべての依存関係がインストールされていることを確認し、次のようにスパイダーを実行します。

bash Copy
scrapy crawl captcha_spider

高度な機能

基本が理解できたら、Scrapy-Playwright には、スクレイピングプロジェクトを強化するためのさまざまな高度な機能が用意されています。

複数のページの処理

Playwright のナビゲーション機能を使用すると、複数のページをスクレイピングしたり、Web サイト内を移動したりするプロセスを合理化できます。

python Copy
# spiders/multi_page_spider.py

import scrapy
from scrapy_playwright.page import PageCoroutine

class MultiPageSpider(scrapy.Spider):
    name = "multipage"
    start_urls = ["https://example.com/start"]

    def start_requests(self):
        for url in self.start_urls:
            yield scrapy.Request(
                url,
                meta={
                    "playwright": True,
                    "playwright_page_coroutines": [
                        PageCoroutine("wait_for_selector", "div.list"),
                        PageCoroutine("evaluate", "window.scrollTo(0, document.body.scrollHeight)"),
                    ],
                },
            )

    async def parse(self, response):
        # 最初のページからデータを抽出する
        for item in response.css("div.list-item"):
            yield {
                "name": item.css("span.name::text").get(),
                "price": item.css("span.price::text").get(),
            }

        # 次のページに移動する
        next_page = response.css("a.next::attr(href)").get()
        if next_page:
            yield scrapy.Request(
                response.urljoin(next_page),
                callback=self.parse,
                meta={
                    "playwright": True,
                    "playwright_page_coroutines": [
                        PageCoroutine("wait_for_selector", "div.list"),
                    ],
                },
            )

Playwright コンテキストの使用

Playwright では、複数のブラウザコンテキストを作成できます。これは、セッション、Cookie、または並列スクレイピングタスクを処理する場合に役立ちます。

python Copy
# settings.py

PLAYWRIGHT_CONTEXTS = {
    "default": {
        "viewport": {"width": 1280, "height": 800},
        "user_agent": "CustomUserAgent/1.0",
    },
    "mobile": {
        "viewport": {"width": 375, "height": 667},
        "user_agent": "MobileUserAgent/1.0",
        "is_mobile": True,
    },
}

スパイダーでは、コンテキストを指定します。

python Copy
# spiders/context_spider.py

import scrapy

class ContextSpider(scrapy.Spider):
    name = "context"
    start_urls = ["https://example.com"]

    def start_requests(self):
        yield scrapy.Request(
            self.start_urls[0],
            meta={
                "playwright": True,
                "playwright_context": "mobile",
            },
        )

    async def parse(self, response):
        # 解析ロジックをここに記述する
        pass

ミドルウェアとの統合

Scrapy-Playwright は、リトライ処理、プロキシ管理、カスタムヘッダー処理などの機能を強化するために、他のミドルウェアと統合できます。

python Copy
# settings.py

DOWNLOADER_MIDDLEWARES.update({
    'scrapy.downloadermiddlewares.retry.RetryMiddleware': 550,
    'scrapy_playwright.middleware.ScrapyPlaywrightDownloadHandler': 543,
})

# カスタムヘッダーを設定する例
DEFAULT_REQUEST_HEADERS = {
    'User-Agent': 'MyCustomAgent/1.0',
    'Accept-Language': 'en-US,en;q=0.9',
}

ベストプラクティス

Scrapy-Playwright と CapSolver を最大限に活用するには、次のベストプラクティスを検討してください。

  1. Playwright の使用を最適化する: JavaScript のレンダリングが必要なリクエストにのみ Playwright を使用して、リソースを節約します。
  2. ブラウザコンテキストを管理する: 可能な限りブラウザコンテキストを再利用して、パフォーマンスを向上させ、オーバーヘッドを削減します。
  3. タイムアウトを適切に処理する: 適切なタイムアウトを設定し、エラー処理を行って、読み込み速度が遅いページを管理します。
  4. robots.txt と利用規約を尊重する: スクレイピングアクティビティが、ターゲット Web サイトのポリシーに準拠していることを常に確認します。
  5. スロットリングと遅延を実装する: 礼儀正しいスクレイピングの慣行を実装して、ターゲットサーバーへの負荷を避けてください。
  6. CapSolver API キーを安全に保護する: API キーなどの機密情報は安全に保管し、スクリプトにハードコーディングしないでください。
  7. スクレイピングアクティビティを監視してログに記録する: スクレイピング操作を追跡して、問題を迅速に特定して解決できるようにします。

ボーナスコード

CapSolver で最高の CAPTCHA ソリューションのボーナスコード を入手してください: scrape. ボーナスコードを適用すると、チャージごとに 5% の追加ボーナスが何回でも適用されます。

CapSolver ボーナス

まとめ

Scrapy-Playwright は、静的コンテンツと動的コンテンツの抽出のギャップを埋める Web スクレイピングのゲームチェンジャーです。Scrapy の堅牢なフレームワークと Playwright の高度なブラウザ自動化機能を活用することで、最も難しいスクレイピングタスクにも簡単に対応できます。さらに、CapSolver を統合することで、CAPTCHA の課題を克服し、最も厳重に保護された Web サイトからでも途切れることなくデータ収集を行うことができます。

e コマースサイト、ソーシャルメディアプラットフォーム、またはその他の JavaScript を多用した Web サイトをスクレイピングする場合でも、Scrapy-Playwright と CapSolver を組み合わせることで、成功するために必要なツールが提供されます。ベストプラクティスに従い、これらの強力な統合を活用することで、特定のニーズに合わせて設計された効率的、信頼性が高く、スケーラブルな Web スクレイピングソリューションを構築できます。

スクレイピングプロジェクトをさらに向上させたいですか?Scrapy-Playwright と CapSolver に挑戦して、データ収集と自動化の可能性を開きましょう。

コンプライアンス免責事項: このブログで提供される情報は、情報提供のみを目的としています。CapSolverは、すべての適用される法律および規制の遵守に努めています。CapSolverネットワークの不法、詐欺、または悪用の目的での使用は厳格に禁止され、調査されます。私たちのキャプチャ解決ソリューションは、公共データのクローリング中にキャプチャの問題を解決する際に100%のコンプライアンスを確保しながら、ユーザーエクスペリエンスを向上させます。私たちは、サービスの責任ある使用を奨励します。詳細については、サービス利用規約およびプライバシーポリシーをご覧ください。

もっと見る

Webスクレイピングに最適なユーザーエージェントと使用方法
Webスクレイピングに最適なユーザーエージェントと使用方法

ウェブスクレイピングにおける最良のユーザーエージェントガイドと、検知回避のための効果的な使用方法。ユーザーエージェントの重要性、種類、シームレスで検知されないウェブスクレイピングのための使用方法を解説します。

Logo of CapSolver

Sora Fujimoto

07-Mar-2025

Webスクレイピングと自動化のためのCloudflare JSチャレンジの解決方法
Webスクレイピングと自動化のためのCloudflare JSチャレンジの解決方法

CloudflareのJavaScriptチャレンジを解決し、シームレスなウェブスクレイピングと自動化を実現する方法を学びましょう。ヘッドレスブラウザ、プロキシローテーション、そしてCapSolverの先進的なCAPTCHA解決機能の活用など、効果的な戦略を発見してください。

Cloudflare
Logo of CapSolver

Sora Fujimoto

05-Mar-2025

Cloudflare TLSフィンガープリンティング:その仕組みと解決策
Cloudflare TLSフィンガープリンティング:概要と解決策

CloudflareのTLSフィンガープリンティングによるセキュリティへの活用、ボットの検出とブロック方法、ならびにWebスクレイピングや自動ブラウジングタスクにおける解決策を学びましょう。

Cloudflare
Logo of CapSolver

Sora Fujimoto

28-Feb-2025

なぜ私は何度もロボットでないことを確認するよう求められるのですか?
なぜ私は何度もロボットでないことの確認を求められるのですか?

Googleがロボットではないことを確認するよう促す理由を学び、CapSolverのAPIを使用してCAPTCHAチャレンジを効率的に解決するなどのソリューションを探ります。

Logo of CapSolver

Sora Fujimoto

25-Feb-2025

Cloudflareで保護されたウェブサイトからデータを取得する方法
Cloudflare保護ウェブサイトからのデータ抽出方法

このガイドでは、Cloudflareで保護されたウェブサイトからデータを抽出するための倫理的で効果的な手法を探ります。

Cloudflare
Logo of CapSolver

Sora Fujimoto

20-Feb-2025

ウェブサイトはなぜ私をボットだと考えるのか?そして、その解決策は?
ウェブサイトはなぜ私をボットだと思うのか?そして解決策は?

ウェブサイトがあなたをボットとフラグ付けする理由と、検出を回避する方法を理解する。主なトリガーには、CAPTCHAチャレンジ、疑わしいIPアドレス、および異常なブラウザの動作が含まれます。

Logo of CapSolver

Sora Fujimoto

20-Feb-2025