Playwright 爬虫完全指南 2026 — 从安装到反爬虫机制绕过

整理了Playwright安装、爬虫代码和反爬虫机制绕过等内容。包含Python和Node.js实际示例。请查看Selenium和Puppeteer的速度和稳定性比较表。

23,687
Playwright 爬虫完全指南 2026 — 从安装到反爬虫机制绕过
目录

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

评论

发表评论

您的邮箱不会公开,仅用于回复通知。

继续阅读

Get notified of new posts

We'll email you when 해시스크래퍼 기술 블로그 publishes new content.

Your email will only be used for new post notifications.