(最新版)如何正確移除 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