在Pyppeteer中正確隱藏window.navigator.webdriver

在我之前的一篇文章:一日一技:如何正確移除Selenium中window.navigator.webdriver的值,我講到了如何在Selenium啓動的Chrome中,經過設置啓動參數隱藏window.navigator.webdriver,駁斥了網上垃圾文章中流傳的使用JavaScript注入的弊端。python

因爲Selenium啓動的Chrome中,有幾十個特徵能夠被識別,因此在爬蟲界已經沒有之前那麼受歡迎了。模擬瀏覽器的新秀Puppeteer異軍突起,逐漸受到了爬蟲界的關注。Puppeteer須要使用JavaScript來控制,若是你是用Python,那麼就須要使用Pyppeteer.web

若是你使用模擬瀏覽器爬淘寶,你會發現,不管怎麼修改參數,Selenium老是能夠馬上被識別。可是若是你使用了本文的方法,用Pyppeteer抓取淘寶,你就會發現另一個廣闊的天地。瀏覽器

今天,咱們來說講如何在Pyppeteer中隱藏window.navigator.webdriverapp

首先,咱們使用下面的代碼,經過Pyppeteer打開瀏覽器窗口: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.goto('http://exercise.kingname.info')
    input('測試完成之後回到這裏按下回車...')
    await browser.close()

asyncio.get_event_loop().run_until_complete(main())
複製代碼

代碼運行之後,會打開Chrome瀏覽器,並訪問http://exercise.kingname.info/(這是我寫的爬蟲練習網站,你們能夠用這個網站練習爬蟲開發,裏面有幾道題挺難^_^)async

在這個瀏覽器中,咱們打開開發者工具,查詢window.navigator.webdriver會發現它的值爲true。以下圖所示:工具

網上的代碼,無外乎注入JavaScript,在網頁自帶的JavaScript加載以前,提早運行一段JavaScript,修改查詢window.navigator.webdriver的接口。oop

這種方式每開一個新頁面都要執行一次,繁瑣,愚蠢!測試

那麼正確的辦法是什麼呢?網站

我寫這篇文章的時候(2019-08-15),Pyppeteer的最新版本爲0.0.25,以下圖所示:

此時,你能夠在PyCharm中,按住Command鍵(Windows、Linux用戶按住Ctrl鍵),鼠標左鍵點擊from pyppeteer import launch中的launch,自動跳轉到Pyppeteer源代碼中的launcher.py文件。

把代碼往上翻,在第60行左右,找到以下圖方框框住的代碼:

--enable-automation這一行註釋掉。此時PyCharm會提示你是否修改源代碼,選擇OK。以下圖所示。

修改完成之後的代碼以下圖所示:

以上就是你須要作的所有修改。

從新運行剛纔的代碼,你會發現,window.navigator.webdriver已是undefined了。以下圖所示。

在Pyppeteer即將發佈的0.0.26版本的功能裏面,我看到了以下圖方框框住的一項:

因此,等0.0.26版本發佈之後,咱們就能夠直接經過傳遞參數來禁用--enable-automation了,再也不須要修改源代碼了。

題外話:官方文檔和源代碼是你的好朋友,若是官方文檔找不到你想要的功能,源代碼又看不懂,那麼就來關注個人公衆號吧。長按下面的二維碼關注我:

相關文章
相關標籤/搜索