在寫爬蟲,面對很多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
。
只支持舊的版本啦,更多信息以及其它方法戳