如果你是一名 Python 开发者,需要自动化网页浏览器、抓取动态页面,或在多个平台上管理多个账户,那么你很可能已经注意到 Pyppeteer。这个 Google Puppeteer 库的非官方 Python 移植版,将 Chrome DevTools Protocol 自动化能力带到了 Python 中,让你无需切换到 Node.js,就能使用 async/await 语法控制 Chromium 浏览器。
到了 2026 年,Pyppeteer 处于一个颇有意思的位置。该项目大约在 2022 年进入维护模式,而社区分支则让它继续支持 Python 3.12 兼容性和 ARM64 支持。尽管已有 Playwright 这样的新替代方案,许多 Python 开发者仍然依赖 Pyppeteer,因为它轻量且 API 熟悉——尤其是在需要将浏览器自动化集成进现有 Python 数据管道时。
本篇 pyppeteer 教程涵盖你高效上手所需的一切:在现代系统上安装 pyppeteer、导航和表单填写等核心操作、截图与 PDF、处理 cookies 和 iFrames、使用代理,以及理解浏览器指纹限制。对于进行多账户操作的用户,我们还会探讨将 Pyppeteer 与 Undetectable.io 这样的反检测浏览器结合使用,如何通过隔离配置文件和真实指纹创建更安全的工作流。
本文涵盖内容:
- Python 3.10–3.12 的安装与设置
- 第一个脚本与核心浏览器操作
- 截图、PDF、cookies 和动态内容
- 代理配置与基础防封锁技巧
- 浏览器指纹限制与反检测策略
- 用于营销自动化的多账户工作流
- 故障排查、最佳实践以及何时考虑替代方案
什么是 Pyppeteer?
Pyppeteer 大约在 2017-2018 年出现,最初是一个社区驱动的项目,旨在将 Puppeteer 的能力带到 Python 语言中。它通过 chrome devtools protocol 暴露高层 api 来控制 Chromium 浏览器,让你能够以编程方式访问从页面导航到网络拦截的一切功能。
pyppeteer 库几乎一比一地映射了 puppeteer api。你可以启动浏览器、创建页面、访问 URL、与 DOM 元素交互、截取屏幕截图和 PDF,以及拦截网络请求——全部使用 Python 的 asyncio/await 模式,而不是 JavaScript Promises。
核心特性与环境支持:
- 需要 Python 3.8+(2026 年常见为 3.10–3.12)
- 适用于 Windows 10/11、Ubuntu 20.04+/Debian、macOS 12+
- Apple Silicon(M1/M2/M3)上的 ARM 问题可能需要使用系统 Chrome
- 首次运行时会下载约 150-170MB 的捆绑 Chromium
- MIT 许可证,可免费用于商业用途
当前限制:
- 自大约 2022 年起基本处于维护模式
- 捆绑/下载的 Chromium 版本可能落后于当前稳定版 Chrome,并可能导致兼容性问题。
- 不支持原生多浏览器(仅支持 Chrome/Chromium)
- 一些社区分支解决了 Chromium 新鲜度和 Python 3.12 兼容性问题
- 前沿 CDP 功能在不手动更新的情况下可能无法使用
对于需要长期稳定性的生产用户,请评估过时的 Chromium 构建影响 TLS 或 WebGL 兼容性的风险,是否能被你的使用场景所接受。
为什么使用 Pyppeteer?关键使用场景
与 requests + BeautifulSoup 这样的简单 HTTP 工具不同,Pyppeteer 会在 JavaScript 执行完成后渲染完整 DOM。这一点很重要,因为许多现代网站使用 React、Vue、Next.js 或 SvelteKit 等框架在客户端构建内容。
Pyppeteer 擅长的具体场景:
- 抓取电商网站上的无限滚动商品列表,这些商品通过 IntersectionObserver 加载
- 自动化注册和登录流程,包括 2FA 滑块或动态表单验证
- 捕获仪表盘的整页截图,用于 A/B 测试文档记录
- 从已认证门户中生成发票或报告 PDF
- 运行包含浏览、点赞和评论操作的社交媒体预热流程
- 在轮换账户之间监控广告平台指标
为什么要继续使用 Python,而不是切换到 Node.js 使用 Puppeteer?
- 复用现有的抓取/数据处理管道(pandas、NumPy、SQLite)
- 用于并发标签页管理的 Asyncio 集成
- 避免语言切换带来的麻烦和序列化开销
对于更安全的多账户工作流,将 Pyppeteer 与 Undetectable.io 这样的反检测浏览器配合使用是合理的:Pyppeteer 负责自动化逻辑,而 Undetectable.io 提供强化的指纹和隔离配置文件,从而降低跨会话关联风险。
Pyppeteer vs Puppeteer vs Selenium(以及 Undetectable.io 的定位)
在 2026 年,如何在这些工具之间做选择,取决于你的语言偏好、浏览器需求以及维护预期。
语言与运行时:
- Puppeteer:Node.js + Promises,Google 官方支持,每周与 Chromium 同步
- Pyppeteer:Python + asyncio,非官方 Python 封装,更新速度较慢
- Selenium:多语言 WebDriver(Python、Java、C# 等),基于驱动架构
浏览器覆盖范围:
- Pyppeteer:主要专注于 Chrome/Chromium。Puppeteer:支持 Chrome 和 Firefox。
- Selenium:通过各自驱动支持 Chrome、Firefox、Edge、Safari
API 风格与能力:
- Pyppeteer/Puppeteer 提供底层 DevTools 访问:网络拦截、fetch() 模拟、性能追踪
- Selenium 主要使用 WebDriver/WebDriver BiDi,也支持请求/响应拦截,但工作流与 Puppeteer 风格 API 不同
- 在某些 JavaScript 密集型场景下,Pyppeteer 可能比 Selenium 更快,但性能取决于网站、浏览器设置、等待逻辑和实现细节。
维护现状:
- Puppeteer:非常活跃,在 GitHub 上有 90k+ stars
- Selenium:稳定成熟,生态广泛
- 与 Puppeteer 相比,Pyppeteer 的社区体量更小,发布节奏也慢得多。
- 很多 Python 用户已经迁移到 Playwright,因为它维护更积极。
Undetectable.io 的定位: 这三种工具都可以使用代理和自定义 headers,但都无法解决深层浏览器指纹问题。Undetectable.io 提供指纹隔离和付费计划中的无限本地配置文件,可自定义诸如 canvas 行为、WebGL 相关数据和 WebRTC 暴露等关键浏览器指纹信号。对于批量账户工作流,与普通 Chrome 设置相比,这套组合可以降低关联风险,但结果取决于平台规则、行为模式、代理质量和会话卫生。
安装与设置 Pyppeteer
2026 年的安装首先要确认你的 python 版本,并准备一个干净的环境。
前提条件:
使用以下命令检查 Python 版本: python --version
- 或 python3 --version。你需要 3.7+(理想情况下为 3.10-3.12)。
在 Linux 上,确保已安装基础依赖: apt install -y gconf-service libasound2 libatk1.0-0 libnss3 libgconf-2-4
- Windows 11 通常开箱即用。
创建虚拟环境:
python -m venv venv
source venv/bin/activate # Linux/macOS
venv\Scripts\activate # Windows
像 uv 或 poetry 这样的现代工具也非常适合进行依赖隔离。
安装 Pyppeteer: 运行 pyppeteer install 命令:
pip install pyppeteer
首次运行时,Pyppeteer 会将一个 Chromium 构建(约 150MB)下载到与平台相关的 pyppeteer 数据目录中。如需预下载,请单独运行 pyppeteer install 命令:
pyppeteer-install
Apple Silicon 说明: 如果捆绑的 Chromium 在 M1/M2/M3 Mac 上无法运行,请改用系统 Chrome:
browser = await launch(executablePath='/Applications/Google Chrome.app/Contents/MacOS/Google Chrome')
常见问题:
- 企业代理阻止下载:将 PYPPETEER_DOWNLOAD_HOST 设置为镜像源
- 在精简版 Docker 镜像中缺少共享库:安装 libnss3、gtk3 依赖
- 若要强制 pyppeteer 使用特定 Chromium 版本:设置 PYPPETEER_CHROMIUM_REVISION 环境变量
快速上手:第一个 Pyppeteer 脚本
下面是一个最小 pyppeteer 脚本,它会打开网页、打印页面标题,并干净地关闭浏览器。
from pyppeteer import launch
import asyncio
async def main():
browser = await launch(headless=True)
try:
page = await browser.newPage()
await page.goto('https://example.com', waitUntil='domcontentloaded')
title = await page.title()
print(f'Page title: {title}')
finally:
await browser.close()
asyncio.run(main())
关键元素说明:
- from pyppeteer import launch 引入启动器(也常见于 pyppeteer import launch async 模式)
- async def main() 定义包含所有浏览器逻辑的异步函数
- await browser 和 await page 在整个流程中用于异步操作
- launch(headless=True) 以 headless 模式启动 Chrome(无图形用户界面)
- await page.goto() 在继续前等待页面加载完成
- finally: await browser.close() 确保即使出错也会关闭浏览器实例
运行脚本: 使用 asyncio.run(main()) 执行,这是 Python 3.7+ 的现代写法。这个模式构成了后续所有 pyppeteer 示例的基础。
常用启动选项:
- headless=False 用于显示浏览器进行调试
- args=['--no-sandbox', '--disable-setuid-sandbox'] 用于 Linux 服务器
- args=['--start-maximized'] 用于全屏调试
使用 Pyppeteer 的核心浏览器操作
本节涵盖日常操作:导航、选择、点击、输入和等待元素。
页面导航:
await page.goto('https://example.com', waitUntil='networkidle2')
waitUntil 选项可接受:load、domcontentloaded、networkidle0(500ms 内无网络活动)或 networkidle2(2 个或更少连接)。请根据 SPA 或慢速 API 进行调整。
元素选择: Pyppeteer 使用 J 和 JJ,而不是 $ 和 $$,因为 $ 在 Python 中不是合法标识符:
element = await page.J('div.product') # CSS selector
elements = await page.JJ('.item') # All matching
xpath_el = await page.xpath('//button[@data-action="submit"]')
用户交互:
await page.type('#email', 'user@example.com', delay=100) # Realistic typing
await page.click('#submit-button')
await page.hover('.menu-item')
await page.keyboard.press('Enter')
等待策略: 避免静态 sleep() 调用。应使用显式等待:
await page.waitForSelector('.dashboard', visible=True, timeout=30000)
await page.waitForXPath('//div[contains(text(), "Welcome")]')
await page.waitForFunction('() => document.querySelectorAll(".item").length > 10')
登录流程示例: 以下代码片段演示了一个简单登录:
await page.goto('https://demo-site.com/login')
await page.type('#email', 'test@example.com', delay=50)
await page.type('#password', 'demo123', delay=50)
await page.click('#login-btn')
await page.waitForSelector('.user-dashboard', timeout=15000)
print('Login successful')
捕获截图与 PDF
视觉捕获对于记录广告变体、A/B 测试以及归档发票很重要。
基础截图:
await page.screenshot(path='page.png')
await page.screenshot(path='full.png', fullPage=True) # Entire scrollable area
await page.screenshot(path='quality.jpg', type='jpeg', quality=90)
用于设备模拟的视口设置:
await page.setViewport({'width': 1920, 'height': 1080}) # Desktop
await page.setViewport({'width': 390, 'height': 844}) # iPhone 15
PDF 生成:
await page.pdf(
path='report.pdf',
format='A4',
printBackground=True,
margin={'top': '1cm', 'bottom': '1cm'}
)
组合工作流示例:
await page.goto('https://dashboard.example.com')
await page.waitForSelector('.charts-loaded')
await page.screenshot(path='dashboard.png', fullPage=True)
await page.pdf(path='dashboard.pdf', format='A4', printBackground=True)
此方法接受关键字参数,用于自定义输出质量和尺寸。
处理 Cookies、会话与 iFrames
控制 cookies 和 frames 有助于保留登录状态并处理嵌入式第三方小组件。
Cookie 操作:
Get all cookies
cookies = await page.cookies()
Save to file
import json
with open('cookies.json', 'w') as f:
json.dump(cookies, f)
Restore cookies
with open('cookies.json', 'r') as f:
saved_cookies = json.load(f)
await page.setCookie(*saved_cookies)
Delete specific cookie
await page.deleteCookie({'name': 'session_id'})
对于多账户工作,请为每个身份维护独立的 cookie 文件。不过,cookies 本身无法隔离指纹——结合 Undetectable.io 配置文件能实现更强的隔离。
iFrame 处理:
List all frames
frames = page.frames
Find frame by name or URL
payment_frame = page.frame({'name': 'stripe-checkout'})
Or by URL pattern
for frame in frames:
if 'payment-provider.com' in frame.url:
payment_frame = frame
break
Interact within frame
confirm_btn = await payment_frame.J('#confirm-payment')
await confirm_btn.click()
下面的代码演示了如何点击嵌入式支付弹窗中的按钮——你必须先切换到对应 frame 上下文。
动态内容、提醒框与弹窗
现代 SPA 会在 API 调用后渲染内容,因此需要显式处理无限滚动和模态对话框。
无限滚动模式:
async def scroll_and_load(page, max_items=50):
previous_count = 0
while True:
items = await page.JJ('.product-card')
if len(items) >= max_items or len(items) == previous_count:
break
previous_count = len(items)
await page.evaluate('window.scrollTo(0, document.body.scrollHeight)')
await page.waitForTimeout(2000)
return await page.JJ('.product-card')
限制项目数量有助于性能优化,并避免触发反机器人系统。
处理 JavaScript 对话框:
page.on('dialog', lambda dialog: asyncio.ensure_future(dialog.accept()))
Or dismiss:
page.on('dialog', lambda dialog: asyncio.ensure_future(dialog.dismiss()))
弹窗与新窗口:
Wait for new tab/window
new_target = await browser.waitForTarget(
lambda t: 'oauth' in t.url
)
new_page = await new_target.page()
await new_page.waitForSelector('#authorize-btn')
await new_page.click('#authorize-btn')
这可以处理在新窗口中打开网页的 OAuth 流程。配置好自动化栈之后,你可以使用类似 BrowserLeaks 匿名性检测这样的工具,验证你的 IP、WebRTC 和 DNS 设置是否如预期工作。
在 Pyppeteer 中使用代理并规避基础封锁
代理对于大规模网页抓取和多账户操作至关重要,尤其是在面对激进限流的平台时,而精心筛选的 自动化最佳代理服务列表可以帮助你选择稳定的提供商。
启动时设置代理:
browser = await launch(
args=['--proxy-server=http://proxy-host:8080']
)
这个新浏览器实例的所有流量都会通过该代理路由。
认证代理:
page = await browser.newPage()
await page.authenticate({'username': 'proxyuser', 'password': 'proxypass'})
await page.goto('https://target-site.com')
在每个新页面导航之前调用 authenticate()。
基础反机器人卫生:
- 使用 await page.setUserAgent() 在不同会话间变换 user agents
- 在操作之间加入随机延迟:await page.waitForTimeout(random.randint(1000, 3000))
- 根据目标网站的敏感度、会话设计和提供商质量,而不是固定通用间隔来轮换代理,使用可靠提供商,例如 PlainProxies 专业代理服务
- 将并发限制为每个浏览器实例 3-5 个标签页
- 通过请求拦截屏蔽不必要的资源(图片、字体)
局限性: Pyppeteer 可以处理代理和 headers,但无法解决更深层的指纹信号问题。对于 canvas、WebGL 和字体等场景,你需要反检测解决方案。
Pyppeteer 与浏览器指纹:限制与反检测策略
2026 年的浏览器指纹识别会结合许多信号来唯一识别会话:user agents、屏幕大小、时区、字体、canvas/WebGL 哈希、WebRTC IP 和硬件提示。
Pyppeteer 可以调整的内容:
- 通过 setUserAgent() 设置 user agent
- 视口和屏幕尺寸
- 通过 page.emulateTimezone('America/New_York') 设置时区
- 通过 page.setGeolocation() 设置地理位置
- 语言 headers
- 通过 evaluateOnNewDocument() 在页面加载前执行 javascript function,从而修改某些 navigator 属性
Pyppeteer 不容易伪装的内容:
- 原生 canvas 指纹(HTMLCanvasElement.toDataURL 哈希)
- 与真实 GPU 绑定的 WebGL renderer/vendor 字符串
- 系统字体枚举
- AudioContext 指纹
- Hardware concurrency 值
即使做了基础伪装,像 CreepJS 这样的工具仍然能揭示指纹泄漏,但结果不应被简化为一个通用的单一有效百分比。免费的 AmIUnique.org 浏览器指纹检测等工具可以帮助你了解当前配置还有多容易被识别。对于拥有复杂风控系统的大型平台,不完整的伪装仍可能留下足够的信号来进行跨会话关联。
反检测浏览器集成: 管理大量账户的操作者会将自动化逻辑与 Undetectable.io 之类的解决方案结合,为每个配置文件获取独立且真实的指纹。你可以 下载适用于 Mac 和 Windows 的 Undetectable,然后进行配置,使 Undetectable.io 提供:
- 付费计划中的无限本地配置文件
- 每个配置文件的指纹随机化(50+ signals)
- 为每个配置文件分配代理
- 数据本地存储以确保安全
- 适合外部编排的自动化友好设计
推荐架构: 与其让单个 Pyppeteer 实例伪装多个身份,不如运行多个 Undetectable.io 配置文件(每个都有唯一代理和指纹),并使用本地自动化在每个隔离上下文中触发操作。
多账户管理与营销自动化工作流
广告套利团队、联盟营销人员和电商卖家,通常会在 Facebook Ads、TikTok 或 Amazon 等平台上运行数十到数百个账户。
为什么直接使用 Pyppeteer 会失败: 在单台机器、单个 Chrome、共享指纹的情况下运行,很快就会触发:
- 账户质询和验证请求
- 隐形限流和触达下降
- 人工审核和永久封禁
- 跨账户关联,导致被识别为账号农场
负责任的多账户工作流: 如果你还在评估自己的技术栈,阅读 GoLogin 替代方案的多账户评测可以帮助你在投入之前理清不同反检测浏览器之间的比较。
- 每个账户使用独立浏览器配置文件
- 每个配置文件使用单独代理/地理位置
- 隔离 cookies、localStorage 和 IndexedDB
- 错峰、类人化操作调度(间隔 5-15 分钟)
- 在核心操作前加入随机浏览模式
工具定位: 在某些广告投放场景中,团队还会在代理和反检测栈之上叠加 专门用于广告活动的 cloaking 服务,以过滤不需要的流量。
- Pyppeteer:编写重复性任务脚本(发布内容、收集统计数据、QA 检查)
- Undetectable.io: 每个配置文件的指纹隔离与定价方案、代理分配、配置文件管理
工作流示例:
- 账户预热: 每天浏览 10-20 个页面,点赞帖子,并以随机时间发表评论
- 指标监控: 登录广告仪表盘,抓取 CTR/CPM 数据,并导出到 pandas 进行分析
- 本地化测试: 自动测试商店的多语言版本,并捕获截图用于 QA
这些工作流都受益于测试自动化原则:可靠等待、错误恢复和干净的会话处理。
使用 Pyppeteer 的高级抓取模式
复杂抓取涉及多页面爬取、解析动态页面以及与 Python 数据工具集成。
分页爬取模式:
products = []
page_num = 1
while True:
await page.goto(f'https://shop.example.com/category?page={page_num}')
await page.waitForSelector('.product-grid')
items = await page.evaluate('''() => {
return Array.from(document.querySelectorAll('.product')).map(el => ({
title: el.querySelector('h3').innerText,
price: el.querySelector('.price').innerText
}))
}''')
products.extend(items)
next_disabled = await page.J('.pagination .next[disabled]')
if next_disabled or page_num >= 10:
break
page_num += 1
这个 javascript 表达式会在进入下一页前,从商品卡片中提取全部数据。
与 BeautifulSoup 结合:
from bs4 import BeautifulSoup
html = await page.content()
soup = BeautifulSoup(html, 'html.parser')
titles = [h.text for h in soup.select('.product h3')]
交互式抓取: 输入搜索词,等待建议列表,提取结果:
await page.type('#search', 'laptop', delay=100)
await page.waitForSelector('.suggestions')
suggestions = await page.JJ('.suggestion-item')
基础并发:
import asyncio
async def scrape_url(url):
browser = await launch(headless=True)
# ... scrape logic
await browser.close()
urls = ['https://site.com/1', 'https://site.com/2', 'https://site.com/3']
await asyncio.gather(*(scrape_url(url) for url in urls))
在单台机器上保持较低并发(3-5 个实例),以避免内存问题和检测风险。
2026 年 Pyppeteer 常见错误与故障排查
下面是运行 pyppeteer 脚本时常见问题的快速参考。
Linux 上出现“Browser closed unexpectedly”:
- 原因:缺少系统依赖
- 修复:apt install libnss3 libgconf-2-4 libasound2 libatk1.0-0
Chromium 下载失败:
- 原因:企业防火墙阻止访问 googleapis.com
- 修复:将 PYPPETEER_DOWNLOAD_HOST 设置为镜像源,或手动将 Chromium 放到 program files 位置
goto() 超时:
- 原因:SPA 过慢或网络问题
- 修复:增加超时时间:await page.goto(url, timeout=60000),尝试 waitUntil='load'
“Target closed” 错误:
- 原因:未处理的异常使浏览器处于异常状态
- 修复:用 try/finally 包裹,确保 browser.close() 始终执行
Jupyter notebook 问题:
- 原因:已运行的事件循环冲突
- 修复:运行前使用 nest_asyncio.apply()
僵尸 Chrome 进程:
- 原因:脚本在未清理的情况下被终止
- 修复:ps aux | grep chrome 然后 kill 孤立进程
调试:
- 启用详细日志:launch(logLevel='debug')
- 监听控制台:page.on('console', lambda msg: print(msg.text))
稳定且低调的 Pyppeteer 自动化最佳实践
这些习惯可以提升稳定性并降低被检测风险。
资源管理:
- 始终使用 try/finally 和 await browser.close(),防止产生僵尸进程
- 使用 asyncio.run() 作为入口点,以便干净地管理事件循环
- 完成后显式关闭页面:await page.close()
等待策略:
- 优先使用 waitForSelector()、waitForXPath()、waitForNavigation(),而不是静态 sleep
- 对基于 javascript 表达式求值的复杂条件,使用 waitForFunction()
- 根据目标 url 的响应时间设置合理超时时间(10-30 秒)
反检测卫生:
- 限制并发:每个 IP 3-5 个标签页
- 随机化延迟:操作之间使用 random.uniform(0.5, 2.5) 秒
- 每 10-20 个请求轮换代理
- 在会话之间变换 user agents
代码组织:
- 将编排(调度、重试)与页面工作流(登录、抓取)分离
- 创建可复用函数:async def login(page, credentials)
- 将凭证存储在环境变量或 secrets managers 中
合规性:
- 抓取前检查 robots.txt
- 避免收集敏感个人数据
- 遵守前文提到的网站条款中的速率限制
何时使用替代方案(Playwright、API 和反检测浏览器)
对于现有代码库、小型项目和学习浏览器自动化来说,Pyppeteer 很有意义。但什么时候该迁移呢?
在以下情况下考虑 Playwright Python:
- 你需要跨浏览器支持(Chrome、Firefox、WebKit)
- 移动端模拟很重要
- 你希望获得活跃维护和最新版本的 CDP 支持
- 自动等待和更好的调试工具对你很重要
在以下情况下考虑 Selenium:
- 旧系统需要兼容 WebDriver
- 需要进行 Safari 测试
- 团队已经具备 Selenium 经验
在以下情况下考虑托管 API:
- 规模超过数十万请求
- 你需要托管式代理轮换和 CAPTCHA 处理
- 基础设施管理不是你的重点
对匿名性要求极高的工作中的关键决策: 选择并不只是“Pyppeteer vs alternatives”,而是“普通浏览器 vs 反检测技术栈”。对于大规模多账户操作,Undetectable.io 提供了自动化工具单独无法实现的能力:
- 具有唯一指纹的无限本地配置文件
- 每个配置文件独立代理配置
- 用于安全的本地数据存储
- 专为与外部自动化协同编排而设计
结论
在 2026 年,Pyppeteer 仍然是基于 Python 的浏览器自动化的实用选择。作为 Puppeteer 的非官方 python 移植版,它将 Chrome DevTools Protocol 控制能力带到浏览器自动化中,无需切换到 Node.js。对于抓取 javascript 密集型网站、截屏、生成 PDF 以及处理动态页面,它都能通过简单示例脚本交付结果,并可扩展到中等规模负载。
其权衡也很明确:维护落后于 Puppeteer,Chromium 版本可能过时,而更深层的指纹伪装需要额外工具。对于常规抓取和 QA 任务,这些限制通常并不重要。但对于检测意味着封号的严肃多账户操作,将 Pyppeteer 自动化逻辑与 Undetectable.io 的指纹隔离结合起来,会形成更有韧性的工作流。
从一个遵循本指南模式的小型、结构良好的脚本开始。随着规模扩大,再逐步加入显式等待、错误处理和代理轮换。当你准备安全地运行多个账户时,在你的 Pyppeteer 自动化旁边设置第一个 Undetectable.io 配置文件——亲自体验真正的指纹控制所带来的差异。