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

在寫爬蟲,面對不少js 加載的頁面,不少人一籌莫展,更多的人喜歡用Senlenium+ Webdriver,古語有云:道高一尺魔高一丈。已淘寶爲首,衆多網站都針對 Selenium的js監測機制, 好比:window.navigator.webdriver,navigator.languages,navigator.plugins.length……web

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

當咱們用selenium 的時候, window.navigator.webdriver的值爲 true。服務器

那麼如何解決這個問題呢? async

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

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

以前我寫過一次用 pyppeteer 加 asyncio 繞過selenium檢測的方案,對於新手來講比較麻煩,如今我有了更好的解決方案。網站

只須要設置Chromedriver的啓動參數便可解決問題。code

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

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

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

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

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

相關文章
相關標籤/搜索