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

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

229
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

Comments

Add Comment

Your email won't be published and will only be used for reply notifications.

继续阅读

Get notified of new posts

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

Your email will only be used for new post notifications.