在《在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 函數。