(最新版)如何正确移除 Pyppeteer 中的window.navigator.webdriver
在一文中,我们介绍了修改源代码使Pyppeteer 打开的 Chrome 隐藏window.navigator.webdriver
的方法。
然而时过境迁,随着 Chrome 版本升级,这一方法也宣告失效。
在前几天的文章我们介绍了在 Selenium 中如何隐藏最新版 Chrome 的window.navigator.webdriver
的方法。今天我们来讲讲如何隐藏Pyppeteer。
今天的方法非常简单,不需要修改源代码。
大家阅读 Selenium 版的文章,应该看到我们的原理是通过 CDP 执行一段 JavaScript 代码。这段代码中有一个关键词叫做addScriptToEvaluateOnNewDocument
。表示添加一段脚本,在打开新文档时执行。
我们记住这个关键词EvaluateOnNewDocument
。现在大家打开 Pyppeteer 的官方 API[1],搜索evaluateOnNewDocument
可以看到原来 Pyppeteer 也是支持这个功能的。
这样一来文件就非常简单了,我们在 Pyppeteer 里面直接调用它,并传递 JavaScript 代码就好了:
import asyncio
from pyppeteer import launch
async def main():
browser = await launch(executablePath='/Applications/Google Chrome.app/Contents/MacOS/Google Chrome', headless=False)
page = await browser.newPage()
await page.evaluateOnNewDocument('''() => {
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
})
}
''')
await page.goto('http://exercise.kingname.info')
input('检查完毕后按下回车键关闭窗口...')
await browser.close()
asyncio.run(main())
代码的运行效果如下图所示:
完美解决问题。并且只要你不开新的选项卡或者新的窗口,只在当前窗口打开新的网址或者刷新页面,这个 js 代码都是自动生效的,不需要重复执行。
其中关键的代码就是:
await page.evaluateOnNewDocument('''() => {
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
})
}
''')
让 Pyppeteer 在每个新页面加载的时候,所有网站自带的 js 执行之前,执行参数中的这段JavaScript 函数。
参考资料
Pyppeteer 的官方 API: https://miyakogi.github.io/pyppeteer/reference.html#pyppeteer.page.Page.evaluateOnNewDocument