2025 年使用 Scrapy 和 Playwright 解决网页抓取挑战的方案

Emma Foster
Machine Learning Engineer
12-Nov-2024

什么是 Scrapy-Playwright?
Scrapy-Playwright 是一款中间件,它将 Scrapy(一个快速且强大的 Python 网络抓取框架)与 Playwright(一个浏览器自动化库)集成在一起。这种组合使 Scrapy 能够通过利用 Playwright 渲染动态内容、与网页交互以及无缝管理浏览器上下文的能力来处理大量使用 JavaScript 的网站。
为什么使用 Scrapy-Playwright?
虽然 Scrapy 在抓取静态网站方面非常出色,但许多现代网站严重依赖 JavaScript 来动态渲染内容。传统的 Scrapy 爬虫在处理这些网站时可能会遇到困难,经常会丢失关键数据或无法导航复杂的页面结构。Scrapy-Playwright 通过使 Scrapy 能够控制无头浏览器来弥合这一差距,确保所有动态内容都已完全加载并可供抓取。
使用 Scrapy-Playwright 的优势
- JavaScript 渲染: 轻松抓取使用 JavaScript 动态加载内容的网站。
- 无头浏览器: 在没有可见浏览器的情况下执行抓取任务,优化性能。
- 高级交互: 处理复杂的交互,例如点击按钮、填写表单和在页面之间导航。
- 异步操作: 利用 Playwright 的异步功能来加速抓取任务。
安装
要开始使用 Scrapy-Playwright,您需要安装 Scrapy 和 Playwright。以下是设置环境的方法:
-
安装 Scrapy:
bashpip install scrapy -
安装 Scrapy-Playwright:
bashpip install scrapy-playwright -
安装 Playwright 浏览器:
安装 Playwright 后,您需要安装必要的浏览器二进制文件。
bashplaywright install
入门
设置新的 Scrapy 项目
首先,如果您还没有,请创建一个新的 Scrapy 项目:
bash
scrapy startproject myproject
cd myproject
配置 Playwright
接下来,您需要在 Scrapy 项目的设置中启用 Playwright。打开 settings.py 并添加以下配置:
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 设置
TWISTED_REACTOR = 'twisted.internet.asyncioreactor.AsyncioSelectorReactor'
# Playwright 设置(可选)
PLAYWRIGHT_BROWSER_TYPE = 'chromium' # 可以是 'chromium'、'firefox' 或 'webkit'
PLAYWRIGHT_LAUNCH_OPTIONS = {
'headless': True,
}
基本用法
创建爬虫
设置完成后,让我们创建一个使用 Playwright 抓取 JavaScript 渲染网站的简单爬虫。为了说明,我们将抓取一个假设的网站,该网站动态加载内容。
在 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(),
}
# 如果需要,处理分页或其他交互
处理 JavaScript 渲染的内容
在上面的示例中:
playwright: True: 通知 Scrapy 为此请求使用 Playwright。playwright_page_coroutines: 指定要使用 Playwright 执行的操作。在这里,它等待选择器div.content,以确保动态内容在解析之前已加载。- 异步
parse方法: 利用异步功能来有效地处理响应。
使用 CapSolver 解决验证码
网络抓取中的一项重大挑战是处理验证码,验证码旨在防止自动访问。CapSolver 是一款强大的解决方案,它提供验证码解决服务,包括与 Playwright 等浏览器自动化工具的集成。在本节中,我们将探讨如何将 CapSolver 与 Scrapy-Playwright 集成在一起,以无缝处理验证码。
什么是 CapSolver?
CapSolver 是一款验证码解决服务,它可以自动解决各种类型的验证码,包括reCAPTCHA。通过将 CapSolver 与您的抓取工作流程集成,您可以绕过验证码挑战,并在没有人工干预的情况下保持抓取任务的流程。
将 CapSolver 与 Scrapy-Playwright 集成
要将 CapSolver 与 Scrapy-Playwright 集成,您需要:
- 获取 CapSolver 浏览器扩展程序: CapSolver 提供一个浏览器扩展程序,可以在浏览器上下文中自动解决验证码。
- 配置 Playwright 加载 CapSolver 扩展程序: 启动 Playwright 浏览器时,加载 CapSolver 扩展程序以启用验证码解决。
- 修改 Scrapy 请求以使用自定义的 Playwright 上下文: 确保您的 Scrapy 请求利用加载了 CapSolver 扩展程序的 Playwright 上下文。
Python 中的示例实现
以下是将 CapSolver 与 Scrapy-Playwright 集成的逐步指南,以及示例代码。
1. 获取 CapSolver 浏览器扩展程序
首先,下载 CapSolver 浏览器扩展程序,并将其放在您的项目目录中。假设扩展程序位于 CapSolver.Browser.Extension 中。
2. 配置扩展程序:
- 在 CapSolver 扩展程序目录中找到配置文件
./assets/config.json。 - 将选项
enabledForcaptcha设置为true,并将captchaMode调整为token以进行自动解决。
示例 config.json:
json
{
"enabledForcaptcha": true,
"captchaMode": "token"
// 其他设置保持不变
}
3. 更新 Scrapy 设置以加载扩展程序
修改您的 settings.py 以配置 Playwright 加载 CapSolver 扩展程序。您需要指定扩展程序的路径,并将必要的参数传递给 Playwright。
python
# 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。
3. 创建处理验证码的爬虫
创建一个新的爬虫或修改现有的爬虫,以使用 CapSolver 扩展程序与验证码进行交互。
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), # 等待扩展程序处理
],
"playwright_context": "default",
},
callback=self.parse_captcha
)
async def parse_captcha(self, response):
page = response.meta["playwright_page"]
# 找到 captcha 复选框或框架并相应地进行交互
try:
# 等待 captcha 框架可用
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 解决验证码
await page.wait_for_selector("div.captcha-success", timeout=60000) # 根据需要调整选择器
self.logger.info("验证码已成功解决。")
else:
self.logger.warning("未找到 captcha 框架。")
except Exception as e:
self.logger.error(f"处理验证码时出错:{e}")
# 在验证码解决后继续解析页面
for item in response.css("div.content"):
yield {
"title": item.css("h2::text").get(),
"description": item.css("p::text").get(),
}
# 如果需要,处理分页或其他交互
4. 运行爬虫
确保所有依赖项都已安装,并使用以下命令运行您的爬虫:
bash
scrapy crawl captcha_spider
高级功能
当您熟悉基本功能后,Scrapy-Playwright 提供了一些高级功能来增强您的抓取项目。
处理多个页面
使用 Playwright 的导航功能可以简化抓取多个页面或在网站中导航。
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 或并行抓取任务非常有用。
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
与中间件集成
Scrapy-Playwright 可以与其他中间件集成,以增强功能,例如处理重试、代理管理或自定义标头。
python
# 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,请考虑以下最佳实践:
- 优化 Playwright 使用: 仅对需要 JavaScript 渲染的请求使用 Playwright,以节省资源。
- 管理浏览器上下文: 尽可能重复使用浏览器上下文,以提高性能并减少开销。
- 优雅地处理超时: 设置适当的超时和错误处理,以管理加载缓慢的页面。
- 尊重 Robots.txt 和服务条款: 始终确保您的抓取活动符合目标网站的政策。
- 实施节流和延迟: 通过实施礼貌的抓取实践,防止过度加载目标服务器。
- 保护您的 CapSolver API 密钥: 安全地存储敏感信息(例如 API 密钥),并避免在脚本中对其进行硬编码。
- 监控和记录抓取活动: 记录您的抓取操作,以便快速识别和解决问题。
附加代码
在 CapSolver 获取顶级验证码解决方案的奖励代码:scrape。兑换后,您在每次充值后将获得额外 5% 的奖励,无限次。

总结
Scrapy-Playwright 是网络抓取的革命性产品,它弥合了静态内容和动态内容提取之间的差距。通过利用 Scrapy 强大的框架和 Playwright 先进的浏览器自动化的力量,您可以轻松地处理最具挑战性的抓取任务。此外,集成 CapSolver 使您能够克服验证码挑战,确保从最受保护的网站中持续收集数据。
无论您是在抓取电子商务网站、社交媒体平台还是任何大量使用 JavaScript 的网站,Scrapy-Playwright 与 CapSolver 相结合,为您提供了成功所需的工具。通过遵循最佳实践并利用这些强大的集成,您可以构建高效、可靠和可扩展的网络抓取解决方案,以满足您的特定需求。
准备提升您的抓取项目了吗?深入了解 Scrapy-Playwright 和 CapSolver,并解锁数据收集和自动化的全新可能性。
合规声明: 本博客提供的信息仅供参考。CapSolver 致力于遵守所有适用的法律和法规。严禁以非法、欺诈或滥用活动使用 CapSolver 网络,任何此类行为将受到调查。我们的验证码解决方案在确保 100% 合规的同时,帮助解决公共数据爬取过程中的验证码难题。我们鼓励负责任地使用我们的服务。如需更多信息,请访问我们的服务条款和隐私政策。
更多

Cloudflare 错误 1006、1007、1008 解决方法 | 如何修复
遇到 Cloudflare 错误 1006、1007 或 1008?学习解决这些访问被拒绝问题的实用方法,提升您的网络爬虫体验。

Lucas Mitchell
05-Dec-2025

如何使用 Scrapling 和 CapSolver 解决验证码
Scrapling + CapSolver 支持通过 ReCaptcha v2/v3 和 Cloudflare Turnstile 绕过进行自动化抓取。

Ethan Collins
05-Dec-2025

在 Selenium 中更改用户代理 | 步骤 & 最佳实践
在Selenium中更改用户代理是许多网络爬虫任务中的关键步骤。它有助于将自动化脚本伪装成普通浏览器...

Anh Tuan
05-Dec-2025

如何确定`action`是否需要使用CapSolver扩展程序来解决Cloudflare Turnstile
学习识别Cloudflare Turnstile的CAPTCHA操作以实现有效解决。按照我们的分步指南使用Capsolver的工具和技巧。

Nikolai Smirnov
05-Dec-2025

探索9Proxy的力量:全面评测
在本文中,我们将向您展示9proxy是什么以及其提供的服务。

Anh Tuan
04-Dec-2025

使用Selenium和Python进行网络爬虫 | 解决网络爬虫中的验证码
在本文中,您将掌握使用Selenium和Python进行网络爬虫,并学习如何解决过程中遇到的Captcha,以实现高效的数据提取。

Ethan Collins
04-Dec-2025

