Playwright是截至2026年在动态网站爬取中最广泛使用的开源浏览器自动化工具。由Microsoft开发,可以控制Chromium、Firefox、WebKit三种浏览器,并支持Python和Node.js。在处理JavaScript渲染页面、需要登录的服务、以及无限滚动等无法用Requests或BeautifulSoup处理的环境中,可以启动实际浏览器来提取数据。
TL;DR
- Playwright比Selenium更快,支持自动等待、网络拦截和并行处理
- 用两行Python代码(pip install playwright+playwright install)即可完成安装
- 2025年推出的Cloudflare AI Labyrinth等反爬虫技术不断升级,playwright-stealth的应用存在局限性
- 通过MCP(Model Context Protocol)集成,AI代理直接控制浏览器的时代已经到来
- 每月超过30万次生产级爬取的自建成本(每月59~1030万韩币)与托管服务(每月30万韩币起)进行比较
本文总结了Playwright的安装、基础和中级爬取代码、与Selenium、Puppeteer的比较表、反爬虫策略、MCP生态系统以及成本分析等内容。
1. Playwright是什么?为什么用于爬取?
Playwright是Microsoft于2020年发布的开源浏览器自动化框架。可以控制Chromium、Firefox、WebKit(Safari引擎)三种浏览器,并支持Python、Node.js、Java、C#等多种语言。
从爬取的角度来看,Playwright受到关注有三个原因。
自动等待(auto-wait):通过page.locator()选择元素时,会自动等待元素出现在屏幕上。不需要像传统方式那样使用time.sleep()来等待时机。
网络拦截:可以拦截页面加载过程中的所有HTTP请求并进行修改。通过直接调用内部API而无需Web UI,可以大大提高数据收集速度。
多重上下文:在一个浏览器实例中可以同时运行多个独立会话,从而实现有效的并行爬取。
2. Playwright、Selenium、Puppeteer中应该选择哪个?
在开始新项目时,经常会问到应该使用哪种工具。以下是三种工具的核心区别总结表。
| 项目 | Playwright | Selenium | Puppeteer |
|---|---|---|---|
| 发布 | 2020年 | 2004年 | 2018年 |
| 浏览器支持 | Chromium、Firefox、WebKit | 所有浏览器 | 仅Chromium |
| 语言支持 | Python、JS/TS、Java、C# | 7种语言 | 仅Node.js |
| 自动等待 | 内置默认支持 | 需手动设置 | 需手动设置 |
| 执行速度 | 最快 | 最慢 | 较快 |
| 并行处理 | 默认提供BrowserContext | 需要单独实现 | 需要单独实现 |
| 隐身模式支持 | playwright-stealth | selenium-wire | puppeteer-extra |
| 维护 | Microsoft积极改进 | 社区维护 | Google改进 |
| 社区 | 迅速增长中 | 成熟,有很多遗留问题 | 中等 |
2026年推荐选择:
- Playwright:新项目、动态网站、需要多浏览器支持的情况下
- Selenium:与旧系统兼容、需要支持IE等旧版浏览器的情况
- Puppeteer:仅需要Chrome支持且熟悉Node.js生态系统的情况
3. 如何安装Playwright?
Python环境
# Playwright 설치
pip install playwright
# 브라우저 바이너리 설치 (Chromium, Firefox, WebKit 세 가지 모두)
playwright install
# Chromium만 설치하려면
playwright install chromium
Node.js环境
# 새 프로젝트 초기화 (대화형 설정)
npm init playwright@latest
# 또는 직접 설치
npm install playwright
npx playwright install
Docker环境
如果在服务器上运行而不是本地开发环境,则使用Microsoft提供的官方Docker镜像是最简单的方法。
FROM mcr.microsoft.com/playwright/python:v1.58.0-noble
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "crawler.py"]
4. 基本爬取 — 5分钟内提取第一批数据
Python示例:收集新闻头条
from playwright.sync_api import sync_playwright
def scrape_headlines():
with sync_playwright() as p:
# headless=True 로 설정하면 브라우저 창 없이 실행
browser = p.chromium.launch(headless=True)
page = browser.new_page()
page.goto("https://news.ycombinator.com")
# 모든 뉴스 제목 선택
items = page.locator(".titleline > a").all()
headlines = [item.inner_text() for item in items]
for i, title in enumerate(headlines[:10], 1):
print(f"{i}. {title}")
browser.close()
return headlines
if __name__ == "__main__":
scrape_headlines()
Node.js示例:相同操作
const { chromium } = require('playwright');
async function scrapeHeadlines() {
const browser = await chromium.launch({ headless: true });
const page = await browser.newPage();
await page.goto('https://news.ycombinator.com');
const headlines = await page.locator('.titleline > a').allInnerTexts();
headlines.slice(0, 10).forEach((title, i) => {
console.log(`${i + 1}. ${title}`);
});
await browser.close();
return headlines;
}
scrapeHeadlines();
还可以一行代码保存屏幕截图和生成PDF。
# 스크린샷 저장
page.screenshot(path="screenshot.png", full_page=True)
# PDF 저장 (Chromium만 지원)
page.pdf(path="page.pdf")
5. 高级爬取技巧
自动处理分页
from playwright.sync_api import sync_playwright
def scrape_paginated(base_url, max_pages=5):
results = []
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page()
for page_num in range(1, max_pages + 1):
page.goto(f"{base_url}?page={page_num}")
# 요소가 로드될 때까지 대기
page.wait_for_selector(".product-item")
items = page.locator(".product-item").all()
for item in items:
results.append(item.inner_text())
# 다음 페이지 버튼이 없으면 종료
if not page.locator(".next-page").count():
break
browser.close()
return results
无限滚动支持
def scrape_infinite_scroll(url, scroll_count=10):
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page()
page.goto(url)
prev_count = 0
for _ in range(scroll_count):
# 페이지 맨 아래까지 스크롤
page.evaluate("window.scrollTo(0, document.body.scrollHeight)")
# 새 콘텐츠 로딩 대기
page.wait_for_timeout(1500)
current_count = page.locator(".item").count()
if current_count == prev_count:
break # 더 이상 로딩되지 않으면 종료
prev_count = current_count
items = page.locator(".item").all_inner_texts()
browser.close()
return items
网络拦截 — 直接提取API
在JavaScript渲染页面中,直接捕获内部API响应,无需HTML解析即可获得干净的JSON数据。
import json
def intercept_api(url):
captured_data = []
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page()
# API 응답을 가로채는 핸들러 등록
def handle_response(response):
if "api/products" in response.url and response.status == 200:
try:
data = response.json()
captured_data.extend(data.get("items", []))
except Exception:
pass
page.on("response", handle_response)
page.goto(url)
page.wait_for_load_state("networkidle")
browser.close()
return captured_data
多页面并行处理
from playwright.sync_api import sync_playwright
def scrape_parallel(urls):
results = {}
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
# BrowserContext로 독립 세션 생성
context = browser.new_context()
pages = [context.new_page() for _ in urls]
for page, url in zip(pages, urls):
page.goto(url, wait_until="domcontentloaded")
for page, url in zip(pages, urls):
results[url] = page.title()
browser.close()
return results
相关指南:Coupang爬取完全指南 | Instagram爬取完全指南
6. 如何绕过反爬虫系统?(2026年最新技术)
主要平台如Coupang、Naver、Instagram等都运行着Cloudflare Turnstile、DataDome、Akamai Bot Manager等精密的反爬虫系统。根据2026年的情况,总结了常用的应对方法。
应用playwright-stealth
playwright-stealth修补了检测无头浏览器的主要信号。自动处理navigator.webdriver属性、修改User-Agent、伪装WebGL渲染器等。
pip install playwright-stealth
from playwright.sync_api import sync_playwright
from playwright_stealth import stealth_sync
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page()
stealth_sync(page) # 스텔스 적용
page.goto("https://target-site.com")
User-Agent轮换
import random
USER_AGENTS = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36",
]
context = browser.new_context(
user_agent=random.choice(USER_AGENTS)
)
代理设置
context = browser.new_context(
proxy={
"server": "http://proxy-server:8080",
"username": "user",
"password": "password"
}
)
模拟人类行为
import random
# 마우스 움직임 추가
page.mouse.move(
random.randint(100, 800),
random.randint(100, 600)
)
# 자연스러운 타이핑 딜레이
page.locator("#search").type("검색어", delay=random.randint(80, 150))
# 스크롤 후 짧은 대기
page.evaluate("window.scrollBy(0, 300)")
page.wait_for_timeout(random.randint(800, 2000))
2026年主要反爬虫趋势
Cloudflare AI Labyrinth:Cloudflare于2025年3月发布的新防御方式。不是阻止机器人,而是引导到由AI生成的伪造页面的迷宫中。如果客户端深入浏览超过4个级别,就会自动被识别为机器人并记录指纹。目的不是简单地阻止,而是识别和追踪。
Canvas/WebGL指纹:反爬虫系统通过组合Canvas渲染结果、WebGL渲染器信息、AudioContext处理结果生成浏览器独特指纹。仅凭playwright-stealth很难完全规避,需要与类似browserforge的额外指纹伪装库一起使用。
局限性:正如playwright-stealth官方文档所述,该库仅规避简单检测。对于类似DataDome、Akamai这样的企业级反爬虫系统,单独的规避技术效果有限。
相关指南:爬取合法性完全指南
7. 2026年Playwright生态系统 — MCP和AI自动化
Playwright MCP服务器
2026年,Playwright生态系统中最引人注目的变化是与MCP(Model Context Protocol)的集成。使用Microsoft官方发布的playwright-mcp包,AI代理如Claude、GPT、Cursor可以通过自然语言命令直接控制浏览器。
# Claude Desktop에 Playwright MCP 연동
npx @playwright/mcp@latest
当AI代理发出“获取此页面的产品列表”命令时,MCP服务器将其转换为Playwright命令并执行,然后返回结果。这种方式使得无需编写代码即可实现浏览器自动化。
但需要注意的是在令牌消耗方面要谨慎。根据Microsoft的基准测试,相同任务下,Playwright MCP消耗约114,000令牌,Playwright CLI消耗约27,000令牌。对于大规模重复任务,CLI方式更具成本效益。
Stagehand / Browser Use
Stagehand(Browserbase)和Browser Use是在Playwright之上添加AI层的框架。通过自然语言指令如“点击下一页按钮”,AI会分析DOM并执行相应操作。即使站点结构发生变化,也无需重新编码,这是其核心优势。
Hashscraper MCP服务器
如果需要专门的爬取MCP服务器,可以参考Hashscraper提供的@scrapi.ai/mcp-server。无需直接构建Playwright基础设施,只需一行MCP命令即可获取爬取结果。
相关指南:AI代理爬取完全指南
8. Playwright是否足够?局限性和现实替代方案
Playwright本身的局限性
Playwright是强大的工具,但在生产环境中持续运行时会遇到多个现实限制。
- IP封锁:来自相同IP的重复请求会被封锁。必须管理代理池,而且获取国内IP可能有困难。
- 反爬虫更新:Cloudflare、DataDome等持续更新检测逻辑。今天有效的规避代码明天可能失效。
- 基础设施运营负担:需要构建爬取调度器、错误恢复、数据管道、监控系统等。
自建vs托管服务成本比较
以每月30万次数据收集为基准,成本比较如下。
| 项目 | 自建Playwright基础设施 | Hashscraper订阅 |
|---|---|---|
| 开发人员薪资(高级) | 每月500~700万韩币 | 包含 |
| 代理/IP成本 | 每月50~200万韩币 | 包含 |
| 服务器基础设施(AWS等) | 每月20~80万韩币 | 包含 |
| 反爬虫更新应对 | 每月20~50万韩币(人力成本) | 包含 |
| 总月费用 | 每月590~1,030万韩币 | 每月30万韩币起 |
| 初始构建时间 | 1~3个月 | 1~2周 |
| IP封锁发生时 | 自行处理 | 自动处理 |
“编写可运行的代码”与“在生产环境中稳定运行”是不同层面的问题。对于内部工具或小型项目,自建Playwright基础设施是最佳选择。但如果需要长期稳定的数据收集用于商业目的,需要综合考虑基础设施运营成本和风险。
通过Hashscraper免费咨询预约,分享当前收集规模和要求,我们将为您提供最佳方案。
相关指南:网页爬取服务比较指南 | 爬取外包成本完全指南
9. 常见问题
Q1. Playwright爬取合法吗?
收集公开数据本身在大多数国家都是合法的。但忽视网站的robots.txt指南、绕过登录、未经授权复制受版权保护的内容、导致服务器超负荷等可能构成法律问题。在韩国,2024年的Baemin爬取案中,服务条款违规和干扰业务成为争议焦点。根据收集目的和方式的不同,法律判断也会有所不同,因此建议对于商业规模的爬取进行法律审查。详细内容请参考爬取合法性指南。
Q2. Playwright和Selenium,应该选择哪个?
根据2026年的情况,对于新项目,推荐使用Playwright。在自动等待、多浏览器支持、并行处理、快速执行速度等方面都具有优势。Selenium适用于与旧系统兼容或需要特定浏览器的情况。
Q3. 无头模式和有头模式有什么区别?
headless=True是在后台运行而不显示浏览器窗口的模式。在服务器环境中通常是默认模式。headless=False(有头模式)会显示实际浏览器窗口,便于调试。一些反爬虫系统更容易检测到无头浏览器,因此在需要规避时,尝试有头模式也是一种方法。
Q4. 是否可以爬取Cloudflare保护的网站?
应用了Cloudflare Turnstile或Bot Management的网站很难通过playwright-stealth单独规避。使用家用IP代理、指纹伪装、模拟人类行为的组合,成功率也不稳定。2025年推出的AI Labyrinth通过引导到由AI生成的伪造页面的迷宫来防止机器人,更难被检测。商业规模的Cloudflare应对最好借助专业服务。
Q5. 如何提高Playwright爬取速度?
提高爬取速度的关键方法有三个。首先,通过网络拦截阻止不必要的资源如图片、字体、CSS等。其次,使用BrowserContext并行执行多个页面。第三,尽可能直接捕获内部API响应而不是解析HTML。仅应用这三种方法,通常可以将速度提高3~5倍。
Q6. Playwright适合大规模爬取吗?
在单个服务器上运行Playwright适用于每月数千到数十万次的情况。如果超过这个规模,需要建立分布式队列(Celery、RQ等)、多台服务器、代理池管理、错误恢复系统等。如果每月超过30万次规模,应该考虑自建还是比较托管服务。
Q7. Python和Node.js哪个更好?
如果需要与数据科学、分析、机器学习管道连接,则Python更有优势。如果需要与现有Node.js后端集成或需要TypeScript类型安全性,则选择Node.js。Playwright本身的功能差异几乎没有。选择团队更熟悉的语言是最现实的选择。
结论
截至2026年,Playwright




