一行js代碼識別Selenium+Webdriver及其應對方案

有不少朋友在開發爬蟲的過程中喜歡使用Selenium + Chromedriver,以爲這樣就能做到不被網站的反爬蟲機制發現。

先不說淘寶這種基於用戶行爲的反爬蟲策略,僅僅是一個普通的小網站,使用一行Javascript代碼,就能輕輕鬆鬆識別你是否使用了Selenium + Chromedriver模擬瀏覽器。

我們來看一個例子。

使用下面這一段代碼啓動Chrome窗口:

from selenium.webdriver import Chrome

driver = Chrome()

現在,在這個窗口中打開開發者工具,並定位到Console選項卡,如下圖所示。

現在,在這個窗口輸入如下的js代碼並按下回車鍵:

window.navigator.webdriver

可以看到,開發者工具返回了true。如下圖所示。

但是,如果你打開一個普通的Chrome窗口,執行相同的命令,可以發現這行代碼的返回值爲undefined,如下圖所示。

所以,如果網站通過js代碼獲取這個參數,返回值爲undefined說明是正常的瀏覽器,返回true說明用的是Selenium模擬瀏覽器。一抓一個準。這裏給出一個檢測Selenium的js代碼例子:

webdriver = window.navigator.webdriver;
if(webdriver){
    console.log('你這個傻逼你以爲使用Selenium模擬瀏覽器就可以了?')
} else {
    console.log('正常瀏覽器')
}

網站只要在頁面加載的時候運行這個js代碼,就可以識別訪問者是不是用的Selenium模擬瀏覽器。如果是,就禁止訪問或者觸發其他反爬蟲的機制。

那麼對於這種情況,在爬蟲開發的過程中如何防止這個參數告訴網站你在模擬瀏覽器呢?

可能有一些會js的朋友覺得可以通過覆蓋這個參數從而隱藏自己,但實際上這個值是不能被覆蓋的:

對js更精通的朋友,可能會使用下面這一段代碼來實現:

Object.defineProperties(navigator, {webdriver:{get:()=>undefined}});

運行效果如下圖所示:

確實修改成功了。這種寫法就萬無一失了嗎?並不是這樣的,如果此時你在模擬瀏覽器中通過點擊鏈接、輸入網址進入另一個頁面,或者開啓新的窗口,你會發現,window.navigator.webdriver又變成了true。如下圖所示。

那麼是不是可以在每一個頁面都打開以後,再次通過webdriver執行上面的js代碼,從而實現在每個頁面都把window.navigator.webdriver設置爲undefined呢?也不行。

因爲當你執行:driver.get(網址)的時候,瀏覽器會打開網站,加載頁面並運行網站自帶的js代碼。所以在你重設window.navigator.webdriver之前,實際上網站早就已經知道你是模擬瀏覽器了。

接下來,又有朋友提出,可以通過編寫Chrome插件來解決這個問題,讓插件裏面的js代碼在網站自帶的所有js代碼之前執行。

這樣做當然可以,不過有更簡單的辦法,只需要設置Chromedriver的啓動參數即可解決問題。

在啓動Chromedriver之前,爲Chrome開啓實驗性功能參數excludeSwitches,它的值爲['enable-automation'],完整代碼如下:

from selenium.webdriver import Chrome
from selenium.webdriver import ChromeOptions

option = ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])
driver = Chrome(options=option)

此時啓動的Chrome窗口,在右上角會彈出一個提示,不用管它,不要點擊停用按鈕。

再次在開發者工具的Console選項卡中查詢window.navigator.webdriver,可以發現這個值已經自動變成undefined了。並且無論你打開新的網頁,開啓新的窗口還是點擊鏈接進入其他頁面,都不會讓它變成true。運行效果如下圖所示。

截至2019年02月12日20:46分,本文所講的方法可以用來登錄知乎。如果使用 Selenium 直接登錄知乎,會彈出驗證碼;先使用本文的方法再登錄知乎,能夠成功僞裝成真實的瀏覽器,不會彈出驗證碼。

實際上,Selenium + Webdriver能被識別的特徵不止這一個。關於如何隱藏其他特徵,請關注我的微信公衆號。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章