在我之前的一篇文章:一日一技:如何正確移除Selenium中window.navigator.webdriver的值,我講到了如何在Selenium啓動的Chrome中,經過設置啓動參數隱藏window.navigator.webdriver
,駁斥了網上垃圾文章中流傳的使用JavaScript注入的弊端。python
因爲Selenium啓動的Chrome中,有幾十個特徵能夠被識別,因此在爬蟲界已經沒有之前那麼受歡迎了。模擬瀏覽器的新秀Puppeteer異軍突起,逐漸受到了爬蟲界的關注。Puppeteer須要使用JavaScript來控制,若是你是用Python,那麼就須要使用Pyppeteer.web
若是你使用模擬瀏覽器爬淘寶,你會發現,不管怎麼修改參數,Selenium老是能夠馬上被識別。可是若是你使用了本文的方法,用Pyppeteer抓取淘寶,你就會發現另一個廣闊的天地。瀏覽器
今天,咱們來說講如何在Pyppeteer中隱藏window.navigator.webdriver
app
首先,咱們使用下面的代碼,經過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
了,再也不須要修改源代碼了。
題外話:官方文檔和源代碼是你的好朋友,若是官方文檔找不到你想要的功能,源代碼又看不懂,那麼就來關注個人公衆號吧。長按下面的二維碼關注我: