(最新版)如何正確移除 Pyppeteer 中的window.navigator.webdriver
- 2020 年 3 月 13 日
- 筆記
在《在Pyppeteer中正確隱藏window.navigator.webdriver 》一文中,我們介紹了修改源程式碼使Pyppeteer 打開的 Chrome 隱藏window.navigator.webdriver的方法。
然而時過境遷,隨著 Chrome 版本升級,這一方法也宣告失效。
在前幾天的文章《(最新版)如何正確移除Selenium中的 window.navigator.webdriver 》我們介紹了在 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 函數。
參考資料
[1]
Pyppeteer 的官方 API: https://miyakogi.github.io/pyppeteer/reference.html#pyppeteer.page.Page.evaluateOnNewDocument

