基于 Playwright 封装反爬网页爬虫,自动隐藏自动化特征
在实际数据采集场景中,单纯使用 requests 往往难以应对复杂的动态页面和反爬机制。Playwright 虽然强大,但默认配置下浏览器指纹极易被识别为自动化脚本。今天分享一套经过验证的封装方案,重点在于隐藏 navigator.webdriver 等特征,模拟真实用户行为。
核心对抗思路
这套方案的核心不在于暴力破解,而在于'伪装'。我们主要在以下几个维度进行优化:
- 移除自动化标志:通过注入脚本修改
navigator.webdriver属性,将其设为undefined。 - 伪造设备指纹:设置合理的 viewport、User-Agent 及 Accept-Language,避免默认值暴露身份。
- 清理 cdc_ 对象:Chrome DevTools Protocol 留下的
cdc_前缀变量是检测重灾区,需手动清除。 - 模拟人类延迟:在关键操作间加入随机等待,避免请求过于规律。
- 非 Headless 模式:如果环境允许,直接运行可见窗口;若必须无头,则需配合更严格的伪装参数。
依赖安装
确保你的环境中已安装 Python 3.8+,并执行以下命令安装 Playwright 及其浏览器驱动:
pip install playwright
playwright install
核心封装代码
下面是一个完整的封装类,我把它设计成单例模式方便复用。注意看 launch_options 里的配置,那是防检测的关键。
import asyncio
from playwright.sync_api import sync_playwright, Page
from typing import Optional
import random
class AntiDetectCrawler:
def __init__(self):
self.playwright = None
self.browser = None
self.page: Optional[Page] = None
async def start(self):
# 启动时禁用部分自动化检测选项
self.playwright = await sync_playwright().start()
.browser = .playwright.chromium.launch(
headless=,
args=[
,
,
]
)
context = .browser.new_context(
user_agent=,
viewport={: , : },
locale=,
permissions=[]
)
.page = context.new_page()
.page.add_init_script()
() -> :
:
.page.goto(url, wait_until=, timeout=)
asyncio.sleep(random.uniform(, ))
.page.content()
Exception e:
()
():
.browser:
.browser.close()
.playwright:
.playwright.stop()

