别再迷信 Playwright 了,真正决定成败的不是浏览器

41 阅读3分钟

我以前也以为,只要页面是 JS 渲染的,上 Playwright 或 Selenium,问题基本就解决了。
后来在一个真实项目里,我用同一个目标站点做了三组对比实验,结论非常清楚:

浏览器自动化解决的是页面执行问题,而不是反爬识别问题。

下面是完整过程。

一、为什么很多人会迷信浏览器自动化?

这其实是一条很自然的推理链:

  • requests 抓不到数据
  • 页面是前端渲染
  • 那就“像人一样”打开浏览器

在功能层面,这个逻辑没问题。
但在反爬层面,它恰恰是最容易出错的地方。

网站真正判断的从来不是:

你是不是 Chrome
你能不能跑 JavaScript

而是:

你是不是一个可信、正常、长期存在的访问者。

二、我做了一个非常简单的对比实验

实验目标很明确:
抓取一个不需要登录,但存在反爬的动态页面。

为了避免干扰,我严格控制了变量:

  • 相同的 URL
  • 相同的请求频率
  • 相同的运行时间(30 分钟)

只对比三种常见方案:

  1. requests + 代理 IP
  2. Playwright(不使用代理)
  3. Playwright + 代理 IP(亿牛云代理)

三、方案一:requests + 代理 IP

这是最朴素的一种方式,很多人反而会低估它。

import requests

proxy_host = "proxy.16yun.cn"
proxy_port = "8000"
proxy_user = "你的用户名"
proxy_pass = "你的密码"

proxies = {
    "http": f"http://{proxy_user}:{proxy_pass}@{proxy_host}:{proxy_port}",
    "https": f"http://{proxy_user}:{proxy_pass}@{proxy_host}:{proxy_port}",
}

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
}

resp = requests.get(
    "https://example.com/data",
    headers=headers,
    proxies=proxies,
    timeout=10
)

print(resp.status_code)

实验结果出乎意料地稳定:

  • 成功率在 90% 以上
  • 很少出现封 IP
  • 资源占用极低

前提只有一个:
这个站点的数据本身能通过接口或半静态方式拿到。


四、方案二:Playwright,但不使用代理

这是很多人眼中的“终极方案”。

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(headless=True)
    page = browser.new_page()
    page.goto("https://example.com/data")
    print(page.title())
    browser.close()

结果却非常典型:

  • 刚开始一切正常
  • 很快开始出现 403
  • IP 被限频
  • CPU 和内存占用明显升高

页面确实能打开,但访问身份并不被信任。

这也是很多爬虫项目“看起来能跑,但跑不久”的根本原因。

五、方案三:Playwright + 代理 IP(完整形态)

from playwright.sync_api import sync_playwright

proxy_config = {
    "server": "http://proxy.16yun.cn:8000",
    "username": "你的用户名",
    "password": "你的密码"
}

with sync_playwright() as p:
    browser = p.chromium.launch(
        headless=True,
        proxy=proxy_config
    )
    page = browser.new_page(
        user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
    )
    page.goto("https://example.com/data")
    print(page.title())
    browser.close()

这一次结果非常稳定:

  • 成功率最高
  • 可以长时间持续运行
  • 没有明显封禁
  • 成本在可控范围内

六、三种方案放在一起,结论非常直观

方案成功率被封风险成本
requests + 代理 IP
浏览器无代理
浏览器 + 代理 IP最高最低

七、问题的本质到底在哪里?

这次实验让我彻底改掉了一个认知误区:

反爬防的不是 JavaScript,防的是异常身份。

浏览器自动化只能解决这些问题:

  • JavaScript 执行
  • DOM 渲染
  • 前端逻辑

但解决不了这些问题:

  • IP 信誉
  • 访问历史
  • 请求节奏是否异常

八、什么时候该用浏览器自动化?

适合用的场景:

  • 数据必须通过 JS 才能生成
  • 接口无法直接访问
  • 页面交互复杂

不适合滥用的场景:

  • 接口结构清晰
  • 数据本身稳定
  • 只是为了“图省事”

九、最后一句话

浏览器自动化不是万能钥匙。
它只负责执行页面,而真正决定爬虫生死的,是你的网络身份。

如果你只升级工具,却不设计网络层,
那迟早会发现一个现实问题:

跑得越像人,反而死得越快。