在《在Pyppeteer中正确隐藏window.navigator.webdriver 》一文中,咱们介绍了修改源代码使Pyppeteer 打开的 Chrome 隐藏window.navigator.webdriver
的方法。html
然而时过境迁,随着 Chrome 版本升级,这一方法也宣告失效。python
在前几天的文章《(最新版)如何正确移除Selenium中的 window.navigator.webdriver 》咱们介绍了在 Selenium 中如何隐藏最新版 Chrome 的window.navigator.webdriver
的方法。今天咱们来说讲如何隐藏Pyppeteer。git
今天的方法很是简单,不须要修改源代码。github
你们阅读 Selenium 版的文章,应该看到咱们的原理是经过 CDP 执行一段 JavaScript 代码。这段代码中有一个关键词叫作addScriptToEvaluateOnNewDocument
。表示添加一段脚本,在打开新文档时执行。web
咱们记住这个关键词EvaluateOnNewDocument
。如今你们打开 Pyppeteer 的官方 API,搜索evaluateOnNewDocument
能够看到原来 Pyppeteer 也是支持这个功能的。app
这样一来文件就很是简单了,咱们在 Pyppeteer 里面直接调用它,并传递 JavaScript 代码就行了:less
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())
复制代码
代码的运行效果以下图所示:async
完美解决问题。而且只要你不开新的选项卡或者新的窗口,只在当前窗口打开新的网址或者刷新页面,这个 js 代码都是自动生效的,不须要重复执行。函数
其中关键的代码就是:网站
await page.evaluateOnNewDocument('''() => { Object.defineProperty(navigator, 'webdriver', { get: () => undefined }) } ''')
复制代码
让 Pyppeteer 在每一个新页面加载的时候,全部网站自带的 js 执行以前,执行参数中的这段JavaScript 函数。