2025定にScrapyとPlaywrightを聞ってウェブスクレイピングのn}を盾Qする圭隈

Anh Tuan
Data Science Expert
12-Nov-2024

Scrapy-Playwright とは
Scrapy-Playwright は、Python 喘の互堀かつ薦な Web スクレイピングフレ`ムワ`クである Scrapy と、ブラウザ徭啝ライブラリである Playwright をy栽するミドルウェアです。このMみ栽わせにより、Scrapy は Playwright の啜張灰鵐謄鵐弔離譽鵐瀬螢鵐亜Web ペ`ジとの、ブラウザコンテキストのシ`ムレスな砿尖C嬬を試喘することで、JavaScript を謹喘した Web サイトをI尖できます。
なぜ Scrapy-Playwright を聞うべきなのか
Scrapy は床議 Web サイトのスクレイピングにれていますが、書晩の謹くの Web サイトはコンテンツを啜弔縫譽鵐瀬螢鵐阿垢襪燭瓩 JavaScript に寄きく卆贋しています。愔瓦 Scrapy スパイダ`は、これらのサイトをI尖するときに逗困垢襪海箸謹く、嶷勣なデ`タを毛したり、}jなペ`ジ夛をナビゲ`トできなかったりします。Scrapy-Playwright は、Scrapy がヘッドレスブラウザを崙囮できるようにすることで、このギャップを托めます。これにより、すべての啜張灰鵐謄鵐弔頼畠にiみzまれ、スクレイピングのためにアクセスできるようになります。
Scrapy-Playwright を聞う旋泣
- JavaScript のレンダリング: JavaScript を聞喘して啜弔縫灰鵐謄鵐弔鰌iみzむ Web サイトをgにスクレイピングできます。
- ヘッドレスブラウジング: 辛ブラウザを聞喘せずにスクレイピングタスクをg佩し、パフォ`マンスを恷m晒できます。
- 互業な: ボタンのクリック、フォ`ムの秘薦、ペ`ジgのナビゲ`ションなどの}jなをI尖できます。
- 掲揖豚荷恬: Playwright の掲揖豚C嬬を試喘して、スクレイピングタスクを互堀晒できます。
インスト`ル
Scrapy-Playwright を聞い兵めるには、Scrapy と Playwright のI圭をインスト`ルする駅勣があります。h廠をセットアップするには、參和のようにします。
-
Scrapy をインスト`ルします:
bashpip install scrapy
-
Scrapy-Playwright をインスト`ルします:
bashpip install scrapy-playwright
-
Playwright ブラウザをインスト`ルします:
Playwright をインスト`ルしたら、駅勣なブラウザバイナリをインスト`ルする駅勣があります。
bashplaywright install
はじめに
仟しい Scrapy プロジェクトのO協
まず、まだ佩っていない栽は、仟しい Scrapy プロジェクトを恬撹します。
bash
scrapy startproject myproject
cd myproject
Playwright のO協
肝に、Scrapy プロジェクトのO協で Playwright を嗤燭砲垢覬慴があります。settings.py
を_き、肝のO協を弖紗します。
python
# 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 O協を嗤燭砲垢
TWISTED_REACTOR = 'twisted.internet.asyncioreactor.AsyncioSelectorReactor'
# Playwright O協┘プション
PLAYWRIGHT_BROWSER_TYPE = 'chromium' # 'chromium', 'firefox', または 'webkit' のいずれか
PLAYWRIGHT_LAUNCH_OPTIONS = {
'headless': True,
}
児云議な聞い圭
スパイダ`の恬撹
セットアップが頼阻したら、Playwright を聞喘して JavaScript でレンダリングされた Web サイトをスクレイピングするシンプルなスパイダ`を恬撹しましょう。ここでは、啜弔縫灰鵐謄鵐弔鰌iみzむ尺腎のサイトをスクレイピングする箭として幣します。
spiders
ディレクトリ箸撲造靴ぅ好僖ぅ制`ファイル dynamic_spider.py
を恬撹します。
python
# 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(),
}
# 駅勣に鬉犬謄擧`ジネ`ションまたは弖紗のをI尖する
JavaScript でレンダリングされたコンテンツのI尖
貧の箭では、
playwright: True
: このリクエストに Playwright を聞喘するように Scrapy に峺幣します。playwright_page_coroutines
: Playwright でg佩するアクションを峺協します。ここでは、セレクトdiv.content
がiみzまれるのを棋って、啜張灰鵐謄鵐弔iみzまれた瘁に盾裂されます。- 掲揖豚
parse
メソッド: 掲揖豚C嬬を試喘して、レスポンスを森議にI尖します。
CapSolver を聞喘した CAPTCHA の盾Q
Web スクレイピングの寄きなn}の 1 つは、徭啝されたアクセスを契ぐためにOされた CAPTCHA をI尖することです。CapSolver は、Playwright などのブラウザ徭啝ツ`ルとのy栽を根む、さまざまなNの CAPTCHA を盾Qするサ`ビスを戻工する埓里淵愁螢紿`ションです。このセクションでは、CapSolver を Scrapy-Playwright にy栽して、CAPTCHA をシ`ムレスにI尖する圭隈についてh苧します。
CapSolver とは
CapSolver は、captcha や reCAPTCHA を根むさまざまなNの CAPTCHA を盾Qするプロセスを徭啝する CAPTCHA 盾Qサ`ビスです。スクレイピングワ`クフロ`に CapSolver をy栽することで、CAPTCHA のn}を指閲し、返咾任僚虍襪覆靴縫好レイピングタスクのフロ`をS隔できます。
CapSolver の Scrapy-Playwright へのy栽
CapSolver を Scrapy-Playwright にy栽するには、參和を佩う駅勣があります。
- CapSolver ブラウザC嬬を秘返する: CapSolver は、ブラウザコンテキスト坪で CAPTCHA の盾Qを徭啝するブラウザC嬬を戻工しています。
- CapSolver C嬬をiみzむように Playwright をO協する: Playwright ブラウザを軟咾垢襪箸に、CapSolver C嬬をiみzんで、CAPTCHA の盾Qを嗤燭砲靴泙后
- カスタマイズされた Playwright コンテキストを聞喘するように Scrapy リクエストを筝する: Scrapy リクエストが、CapSolver C嬬がiみzまれた Playwright コンテキストを聞喘するようにしてください。
Python でのg廾箭
參和は、CapSolver を Scrapy-Playwright にy栽するためのステップバイステップガイドです。コ`ド箭も根まれています。
1. CapSolver ブラウザC嬬を秘返する
まず、CapSolver ブラウザC嬬 をダウンロ`ドし、プロジェクトディレクトリに塘崔します。C嬬が CapSolver.Browser.Extension
にあるとします。
2. C嬬のO協:
- CapSolver C嬬ディレクトリにある撹ファイル
./assets/config.json
をつけます。 - オプション
enabledForcaptcha
をtrue
にO協し、徭喀QのためにcaptchaMode
をtoken
に{屁します。
config.json
の箭:
json
{
"enabledForcaptcha": true,
"captchaMode": "token"
// その麿のO協はそのまま
}
3. C嬬をiみzむように Scrapy O協を厚仟する
settings.py
を筝して、CapSolver C嬬をiみzむように Playwright をO協します。C嬬へのパスを峺協し、Playwright に駅勣な哈方を局す駅勣があります。
python
# settings.py
import os
from pathlib import Path
# 屡贋の Playwright O協
PLAYWRIGHT_BROWSER_TYPE = 'chromium'
PLAYWRIGHT_LAUNCH_OPTIONS = {
'headless': False, # C嬬をiみzむには False である駅勣があります
'args': [
'--disable-extensions-except={}'.format(os.path.abspath('CapSolver.Browser.Extension')),
'--load-extension={}'.format(os.path.abspath('CapSolver.Browser.Extension')),
],
}
# Twisted リアクタ`がO協されていることを_Jする
TWISTED_REACTOR = 'twisted.internet.asyncioreactor.AsyncioSelectorReactor'
廣: ブラウザC嬬をiみzむには、ブラウザをヘッドレスモ`ド參翌でg佩する駅勣があります。そのため、'headless': False
にO協します。
4. CAPTCHA をI尖するスパイダ`を恬撹する
CapSolver C嬬を聞喘して CAPTCHA とする仟しいスパイダ`を恬撹するか、屡贋のスパイダ`を筝します。
python
# 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), # C嬬がI尖されるのを棋つ
],
"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 を盾Qするのを棋つ
await page.wait_for_selector("div.captcha-success", timeout=60000) # 駅勣に鬉犬謄札譽タ`を{屁する
self.logger.info("CAPTCHA は屎械に盾Qされました。")
else:
self.logger.warning("captcha iframe がつかりませんでした。")
except Exception as e:
self.logger.error(f"CAPTCHA I尖嶄のエラ`: {e}")
# CAPTCHA が盾Qされたら、ペ`ジの盾裂をA佩する
for item in response.css("div.content"):
yield {
"title": item.css("h2::text").get(),
"description": item.css("p::text").get(),
}
# 駅勣に鬉犬謄擧`ジネ`ションまたは弖紗のをI尖する
5. スパイダ`のg佩
すべての卆贋vSがインスト`ルされていることを_Jし、肝のようにスパイダ`をg佩します。
bash
scrapy crawl captcha_spider
互業なC嬬
児云が尖盾できたら、Scrapy-Playwright には、スクレイピングプロジェクトを晒するためのさまざまな互業なC嬬が喘吭されています。
}気離擧`ジのI尖
Playwright のナビゲ`ションC嬬を聞喘すると、}方のペ`ジをスクレイピングしたり、Web サイト坪を卞咾靴燭蠅垢襯廛蹈札垢鮑論躬できます。
python
# 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、またはK双スクレイピングタスクをI尖する栽に叨羨ちます。
python
# 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
# 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
ミドルウェアとのy栽
Scrapy-Playwright は、リトライI尖、プロキシ砿尖、カスタムヘッダ`I尖などのC嬬を晒するために、麿のミドルウェアとy栽できます。
python
# settings.py
DOWNLOADER_MIDDLEWARES.update({
'scrapy.downloadermiddlewares.retry.RetryMiddleware': 550,
'scrapy_playwright.middleware.ScrapyPlaywrightDownloadHandler': 543,
})
# カスタムヘッダ`をO協する箭
DEFAULT_REQUEST_HEADERS = {
'User-Agent': 'MyCustomAgent/1.0',
'Accept-Language': 'en-US,en;q=0.9',
}
ベストプラクティス
Scrapy-Playwright と CapSolver を恷寄泙忙醵辰垢襪砲蓮肝のベストプラクティスを篇してください。
- Playwright の聞喘を恷m晒する: JavaScript のレンダリングが駅勣なリクエストにのみ Playwright を聞喘して、リソ`スをsします。
- ブラウザコンテキストを砿尖する: 辛嬬な泙螢屮薀Ε競灰鵐謄ストを壅旋喘して、パフォ`マンスを鯢呂気察▲`バ`ヘッドをpします。
- タイムアウトをm俳にI尖する: m俳なタイムアウトをO協し、エラ`I尖を佩って、iみzみ堀業がWいペ`ジを砿尖します。
- robots.txt と旋喘シsを恊嶷する: スクレイピングアクティビティが、タ`ゲット Web サイトのポリシ`にしていることを械に_Jします。
- スロットリングとW决をgbする: 撰x屎しいスクレイピングのT佩をg廾して、タ`ゲットサ`バ`への塞を閲けてください。
- CapSolver API キ`を芦畠に隠oする: API キ`などのC畜秤鵑楼家に隠砿し、スクリプトにハ`ドコ`ディングしないでください。
- スクレイピングアクティビティをOしてログにhする: スクレイピング荷恬を弖Eして、}を儻堀に蒙協して盾Qできるようにします。
ボ`ナスコ`ド
CapSolver で恷互の CAPTCHA ソリュ`ションのボ`ナスコ`ド を秘返してください: scrape. ボ`ナスコ`ドをm喘すると、チャ`ジごとに 5% の弖紗ボ`ナスが採指でもm喘されます。

まとめ
Scrapy-Playwright は、床議コンテンツと啜張灰鵐謄鵐弔粒薐のギャップを托める Web スクレイピングのゲ`ムチェンジャ`です。Scrapy の埓里淵侫讒`ムワ`クと Playwright の互業なブラウザ徭啝C嬬を試喘することで、恷もyしいスクレイピングタスクにもgに鬉任ます。さらに、CapSolver をy栽することで、CAPTCHA のn}を針捲し、恷も嶷に隠oされた Web サイトからでも余俳れることなくデ`タЪを佩うことができます。
e コマ`スサイト、ソ`シャルメディアプラットフォ`ム、またはその麿の JavaScript を謹喘した Web サイトをスクレイピングする栽でも、Scrapy-Playwright と CapSolver をMみ栽わせることで、撹孔するために駅勣なツ`ルが戻工されます。ベストプラクティスに惄ぁ△海譴蕕薦なy栽を試喘することで、蒙協のニ`ズに栽わせてOされた紳糞帖∃梼m來が互く、スケ`ラブルな Web スクレイピングソリュ`ションをBできます。
スクレイピングプロジェクトをさらに鯢呂気擦燭い任垢Scrapy-Playwright と CapSolver に薬蕕靴董▲禰`タЪと徭啝の辛嬬來を_きましょう。
コンプライアンス窒並 このブログで戻工される秤鵑蓮秤麑畊のみを朕議としています。CapSolverは、すべてのm喘される隈舵およびヨ討臨駟悗謀めています。CapSolverネットワ`クの音隈、p遁、または喘の朕議での聞喘は鯉に鋤峭され、{砲気譴泙后K修燭舛離ャプチャ盾Qソリュ`ションは、巷慌デ`タのクロ`リング嶄にキャプチャの}を盾QするHに100%のコンプライアンスを_隠しながら、ユ`ザ`エクスペリエンスを鯢呂気擦泙后K修燭舛蓮▲稀`ビスの販ある聞喘をX遒靴泙后Tについては、サ`ビス旋喘シsおよびプライバシ`ポリシ`をごEください。
もっとる

reCAPTCHA Enterprise v2、v2インビジブル、v3、v3エンタ`プライズ 0.9スコアのあらゆるバ`ジョンをどう盾Qするか
CapSolverでreCaptchaのあらゆるバ`ジョンを盾くスキルをマスタ`: このガイドは、reCaptchaを森議に盾Qするためのステップバイステップのチュ`トリアルを戻工し、械に屎_なY惚をgFします。

Sora Fujimoto
11-Oct-2025

颯ャプチャの盾き圭
このブログ並は、CAPTCHAを盾くための淫凄議なガイドを戻工します。CapSolverはそのプロセスを徭啝するツ`ルであり、CAPTCHAとは採かのh苧から兵まり、CapSolverのAPIを聞喘してこれらのCAPTCHAを盾くためのなステップバイステップの返がh苧されています。このガイドには、プロセスにvcするリクエストとレスポンスの箭が根まれています。並は、CAPTCHAを盾くためにCapSolverを聞喘する紳偏圓叛宴來についての廣吭cでめくくられ、CAPTCHAの盾Qを根むタスクを徭啝したい繁にとって、△襯螢秋`スとなっています。

Sora Fujimoto
11-Oct-2025

reCaptcha v2 インビジブルの盾Q圭隈
このブログは、Capsolverを聞喘してreCaptcha v2の掲燕幣を盾Qするための淫凄議なガイドです。駅勣な秤鵑Capsolverに戻竃し、Y惚を編^するまでのステップバイステップのウォ`クスル`を戻工しています。このブログは、尖盾しやすく、g佩しやすいようにOされており、ウェブサイトでreCaptcha v2の掲燕幣をg廾および盾Qするプロセスを儻堀かつ紳糞弔砲靴泙后これは鏡徭でされたガイドであり、广恬愬嶌Δ覆靴釦i宀がプロセスを頼畠に尖盾できるようにしています。

Nikolai Smirnov
11-Oct-2025

リキャプチャバ`ジョン3を融篤する
CapSolverを聞喘してreCaptcha V3を盾Qする圭隈を僥ぶ唆なタスクのN、シンプルなAPIB亊、およびオ`トメ`ションおよびテストのための森議なソリュ`ション

Sora Fujimoto
10-Oct-2025

2025定におけるウェブスクリ`ピングrのAWS WAFの恷mなソルバ`は採か
2025定におけるAWS WAF CAPTCHAを紳糞弔暴發圭隈をCapSolverで僥ぶ。ステップバイステップのガイド、Pythony栽、徭啝ワ`クフロ`を紳併するAIl咾離愁襯乂`。ダイナミックなト`クン、佩喀睥、}jなCAPTCHAチャレンジをgに\り埆える。

Lucas Mitchell
26-Sep-2025

reCaptchaのコ`ルバックv気量修祁
reCAPTCHAのコ`ルバックをつけるには、reCAPTCHAが屎械に盾Qされた瘁にg佩されるJavaScriptv気鯡惷┐靴泙后J幎の古勣を參和に幣します。

Sora Fujimoto
23-Sep-2025