
Anh Tuan
Data Science Expert

Scrapy-Playwright は、Python 用の高速かつ強力な Web スクレイピングフレームワークである Scrapy と、ブラウザ自動化ライブラリである Playwright を統合するミドルウェアです。この組み合わせにより、Scrapy は Playwright の動的コンテンツのレンダリング、Web ページとの対話、ブラウザコンテキストのシームレスな管理機能を活用することで、JavaScript を多用した Web サイトを処理できます。
Scrapy は静的 Web サイトのスクレイピングに優れていますが、今日の多くの Web サイトはコンテンツを動的にレンダリングするために JavaScript に大きく依存しています。従来の Scrapy スパイダーは、これらのサイトを処理するときに苦労することが多く、重要なデータを見逃したり、複雑なページ構造をナビゲートできなかったりします。Scrapy-Playwright は、Scrapy がヘッドレスブラウザを制御できるようにすることで、このギャップを埋めます。これにより、すべての動的コンテンツが完全に読み込まれ、スクレイピングのためにアクセスできるようになります。
Scrapy-Playwright を使い始めるには、Scrapy と Playwright の両方をインストールする必要があります。環境をセットアップするには、以下のようにします。
Scrapy をインストールします:
pip install scrapy
Scrapy-Playwright をインストールします:
pip install scrapy-playwright
Playwright ブラウザをインストールします:
Playwright をインストールしたら、必要なブラウザバイナリをインストールする必要があります。
playwright install
まず、まだ行っていない場合は、新しい Scrapy プロジェクトを作成します。
scrapy startproject myproject
cd myproject
次に、Scrapy プロジェクトの設定で Playwright を有効にする必要があります。settings.py を開き、次の設定を追加します。
# 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 を作成します。
# 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(),
}
# 必要に応じてページネーションまたは追加の対話を処理する
上記の例では、
playwright: True: このリクエストに Playwright を使用するように Scrapy に指示します。playwright_page_coroutines: Playwright で実行するアクションを指定します。ここでは、セレクト div.content が読み込まれるのを待って、動的コンテンツが読み込まれた後に解析されます。parse メソッド: 非同期機能を活用して、レスポンスを効果的に処理します。Web スクレイピングの大きな課題の 1 つは、自動化されたアクセスを防ぐために設計された CAPTCHA を処理することです。CapSolver は、Playwright などのブラウザ自動化ツールとの統合を含む、さまざまな種類の CAPTCHA を解決するサービスを提供する堅牢なソリューションです。このセクションでは、CapSolver を Scrapy-Playwright に統合して、CAPTCHA をシームレスに処理する方法について説明します。
CapSolver は、captcha や reCAPTCHA を含むさまざまな種類の CAPTCHA を解決するプロセスを自動化する CAPTCHA 解決サービスです。スクレイピングワークフローに CapSolver を統合することで、CAPTCHA の課題を回避し、手動での介入なしにスクレイピングタスクのフローを維持できます。
CapSolver を Scrapy-Playwright に統合するには、以下を行う必要があります。
以下は、CapSolver を Scrapy-Playwright に統合するためのステップバイステップガイドです。コード例も含まれています。
まず、CapSolver ブラウザ拡張機能 をダウンロードし、プロジェクトディレクトリに配置します。拡張機能が CapSolver.Browser.Extension にあるとします。
./assets/config.json を見つけます。enabledForcaptcha を true に設定し、自動解決のために captchaMode を token に調整します。config.json の例:
{
"enabledForcaptcha": true,
"captchaMode": "token"
// その他の設定はそのまま
}
settings.py を変更して、CapSolver 拡張機能を読み込むように Playwright を設定します。拡張機能へのパスを指定し、Playwright に必要な引数を渡す必要があります。
# 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 に設定します。
CapSolver 拡張機能を使用して CAPTCHA と対話する新しいスパイダーを作成するか、既存のスパイダーを変更します。
# 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(),
}
# 必要に応じてページネーションまたは追加の対話を処理する
すべての依存関係がインストールされていることを確認し、次のようにスパイダーを実行します。
scrapy crawl captcha_spider
基本が理解できたら、Scrapy-Playwright には、スクレイピングプロジェクトを強化するためのさまざまな高度な機能が用意されています。
Playwright のナビゲーション機能を使用すると、複数のページをスクレイピングしたり、Web サイト内を移動したりするプロセスを合理化できます。
# 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 では、複数のブラウザコンテキストを作成できます。これは、セッション、Cookie、または並列スクレイピングタスクを処理する場合に役立ちます。
# 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,
},
}
スパイダーでは、コンテキストを指定します。
# 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 は、リトライ処理、プロキシ管理、カスタムヘッダー処理などの機能を強化するために、他のミドルウェアと統合できます。
# 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 を最大限に活用するには、次のベストプラクティスを検討してください。
CapSolver で最高の CAPTCHA ソリューションのボーナスコード を入手してください: scrape. ボーナスコードを適用すると、チャージごとに 5% の追加ボーナスが何回でも適用されます。

Scrapy-Playwright は、静的コンテンツと動的コンテンツの抽出のギャップを埋める Web スクレイピングのゲームチェンジャーです。Scrapy の堅牢なフレームワークと Playwright の高度なブラウザ自動化機能を活用することで、最も難しいスクレイピングタスクにも簡単に対応できます。さらに、CapSolver を統合することで、CAPTCHA の課題を克服し、最も厳重に保護された Web サイトからでも途切れることなくデータ収集を行うことができます。
e コマースサイト、ソーシャルメディアプラットフォーム、またはその他の JavaScript を多用した Web サイトをスクレイピングする場合でも、Scrapy-Playwright と CapSolver を組み合わせることで、成功するために必要なツールが提供されます。ベストプラクティスに従い、これらの強力な統合を活用することで、特定のニーズに合わせて設計された効率的、信頼性が高く、スケーラブルな Web スクレイピングソリューションを構築できます。
スクレイピングプロジェクトをさらに向上させたいですか?Scrapy-Playwright と CapSolver に挑戦して、データ収集と自動化の可能性を開きましょう。
CapSolver n8nテンプレートを使用して、AWS WAFで保護された製品ページをモニタリングし、チャレンジを解決し、価格を抽出し、変化を比較し、自動でアラートをトリガーする方法を学びましょう。

SEOにおけるAIエージェントがキーワードリサーチ、競合分析、データ収集を自動化する方法を学びましょう — そして、CapSolverを使ってあなたのパイプラインでCAPTCHAのチャレンジを処理する方法を学びましょう。

開発者向けの包括的なAPIドキュメンテーションで、CAPTCHAの解決をマスターしましょう。CapSolverを統合して、reCAPTCHA、AWS WAFなどに対応する方法を学びましょう。
