移除Selenium中window.navigator.webdriver值
有不少朋友在開發(fā)爬蟲的過程中喜歡使用Selenium + Chromedriver,以為這樣就能做到不被網(wǎng)站的反爬蟲機制發(fā)現(xiàn)。
先不說淘寶這種基于用戶行為的反爬蟲策略,僅僅是一個普通的小網(wǎng)站,使用一行Javascript代碼,就能輕輕松松識別你是否使用了Selenium + Chromedriver模擬瀏覽器。
我們來看一個例子。
使用下面這一段代碼啟動Chrome窗口:
現(xiàn)在,在這個窗口中打開開發(fā)者工具,并定位到Console選項卡,如下圖所示。
from selenium.webdriver import Chrome driver = Chrome()
現(xiàn)在,在這個窗口輸入如下的js代碼并按下回車鍵:
window.navigator.webdriver
可以看到,開發(fā)者工具返回了 true。如下圖所示。
但是,如果你打開一個普通的Chrome窗口,執(zhí)行相同的命令,可以發(fā)現(xiàn)這行代碼的返回值為 undefined,如下圖所示:
所以,如果網(wǎng)站通過js代碼獲取這個參數(shù),返回值為 undefined說明是正常的瀏覽器,返回 true說明用的是Selenium模擬瀏覽器。一抓一個準。這里給出一個檢測Selenium的js代碼例子:
webdriver = window.navigator.webdriver; if(webdriver){ console.log('你這個小可愛你以為使用Selenium模擬瀏覽器就可以了?') } else { console.log('正常瀏覽器') }
網(wǎng)站只要在頁面加載的時候運行這個js代碼,就可以識別訪問者是不是用的Selenium模擬瀏覽器。如果是,就禁止訪問或者觸發(fā)其他反爬蟲的機制。
那么對于這種情況,在爬蟲開發(fā)的過程中如何防止這個參數(shù)告訴網(wǎng)站你在模擬瀏覽器呢?
可能有一些會js的朋友覺得可以通過覆蓋這個參數(shù)從而隱藏自己,但實際上這個值是不能被覆蓋的:
對js更精通的朋友,可能會使用下面這一段代碼來實現(xiàn):
Object.defineProperties(navigator, {webdriver:{get:()=>undefined}});
運行效果如下圖所示:
確實修改成功了。這種寫法就萬無一失了嗎?并不是這樣的,如果此時你在模擬瀏覽器中通過點擊鏈接、輸入網(wǎng)址進入另一個頁面,或者開啟新的窗口,你會發(fā)現(xiàn), window.navigator.webdriver又變成了 true。
如下圖所示。
那么是不是可以在每一個頁面都打開以后,再次通過webdriver執(zhí)行上面的js代碼,從而實現(xiàn)在每個頁面都把 window.navigator.webdriver設置為 undefined呢?也不行。
因為當你執(zhí)行: driver.get(網(wǎng)址)的時候,瀏覽器會打開網(wǎng)站,加載頁面并運行網(wǎng)站自帶的js代碼。
所以在你重設 window.navigator.webdriver之前,實際上網(wǎng)站早就已經(jīng)知道你是模擬瀏覽器了。
接下來,又有朋友提出,可以通過編寫Chrome插件來解決這個問題,讓插件里面的js代碼在網(wǎng)站自帶的所有js代碼之前執(zhí)行。
這樣做當然可以,不過有更簡單的辦法,只需要設置Chromedriver的啟動參數(shù)即可解決問題。
在啟動Chromedriver之前,為Chrome開啟實驗性功能參數(shù) 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窗口,在右上角會彈出一個提示,不用管它,不要點擊 停用按鈕。
再次在開發(fā)者工具的Console選項卡中查詢 window.navigator.webdriver,可以發(fā)現(xiàn)這個值已經(jīng)自動變成 undefined了。并且無論你打開新的網(wǎng)頁,開啟新的窗口還是點擊鏈接進入其他頁面,都不會讓它變成 true。運行效果如下圖所示。
以上就是移除Selenium中window.navigator.webdriver值的詳細內(nèi)容,更多關于window.navigator.webdriver值移除的資料請關注腳本之家其它相關文章!
相關文章
python用pyecharts實現(xiàn)地圖數(shù)據(jù)可視化
這篇文章主要介紹了python用pyecharts實現(xiàn)地圖數(shù)據(jù)可視化,幫助大家更好的理解和學習使用python,感興趣的朋友可以了解下2021-03-03Appium+python自動化之連接模擬器并啟動淘寶APP(超詳解)
這篇文章主要介紹了Appium+python自動化之 連接模擬器并啟動淘寶APP(超詳解)本文以淘寶app為例,通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2019-06-06Django基于ORM操作數(shù)據(jù)庫的方法詳解
這篇文章主要介紹了Django基于ORM操作數(shù)據(jù)庫的方法,結合實例形式總結分析了Django使用ORM操作數(shù)據(jù)庫的相關配置、增刪改查等相關操作技巧,需要的朋友可以參考下2018-03-03淺談Python xlwings 讀取Excel文件的正確姿勢
這篇文章主要介紹了淺談Python xlwings 讀取Excel文件的正確姿勢,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-02-02