Selenium+Webdriver被檢測識別出來的應對方案


在寫爬蟲,面對很多js 加載的頁面,很多人束手無策,更多的人喜歡用Senlenium+ Webdriver,古語有雲:道高一尺魔高一丈。已淘寶為首,眾多網站都針對 Selenium的js監測機制, 比如:window.navigator.webdriver,navigator.languages,navigator.plugins.length……

正常情況下我們用瀏覽器訪問淘寶等網站的 window.navigator.webdriver的值為
undefined。

當我們用selenium 的時候, window.navigator.webdriver的值為 true。

那么如何解決這個問題呢?

第一種:使用mitmproxy用中間人的方式截取服務器發送來的js,修改js里面函數的參值方式發送給服務器。相當於在browser和server之間做一層中介的攔截。不過此方法要對js非常熟悉的人才好實施。

第二種方法依舊通過selenium,不過是在服務器在第一次發送js並在本地驗證的時候,做好‘第一次’的偽裝,從而實現‘第一次登陸’有效。。方法簡單,適合小白。

之前我寫過一次用 pyppeteer 加 asyncio 繞過selenium檢測的方案,對於新手來說比較麻煩,現在我有了更好的解決方案。

只需要設置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

只支持舊的版本啦,更多信息以及其它方法戳

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM