Selenium 操作被屏蔽
使用selenium自動化網頁時,有一定的概率會被目標網站識別,一旦被檢測到,目標網站會攔截該客戶端做出的網頁操作。
比如淘寶和大眾點評的登錄頁,當打開瀏覽器,輸入用戶名和密碼時,是能正常進入首頁的,但是如果是通過selenium打開, 會直接提示驗證失敗,點擊框體重試。
本文介紹一種辦法,不需要修改瀏覽器屬性,不需要注入JAVAScript腳本,也能輕松繞過網站檢測。
Selenium為何會被檢測
每一個瀏覽器訪問網站時,都會帶上特定的指紋特征,網站會解析這些特征,從而判斷這次訪問是不是自動化程序。
一個最廣為人知的特征是
window.navigator.webdriver,該特征直接標明此瀏覽器是webdriver程序。當一個瀏覽器通過selenium啟動后,在開發者工具中輸入這個屬性,會發現被標為 true, 而手工打開的瀏覽器是 false。
實際上,瀏覽器被檢測為webdriver程序的特征并不止這一個,這意味著,就算你通過修改屬性,也不一定能繞過網站的檢測。
我們可以通過 sannysoft 來檢測瀏覽器指紋,如果瀏覽器是通過selenium等自動化程序打開的,訪問這個網址后會有很多特征暴露這些指紋,這些特征的值和手工打開后的值是不一樣的,因此可以很輕易被別人檢測出來。
有人也試圖不用selenium,換成puppeter和playwright這樣的自動化工具,但是結局都是一樣的。
Selenium避免被檢測方法
瀏覽器在啟動時就會帶上指紋特征,如果使用自動化程序啟動時已經被標記,那為什么不直接用手工啟動,然后用Selenium連接已經啟動的瀏覽器呢?
那手工打開瀏覽器要做什么操作才能讓Selenium連接呢?Selenium又是怎樣連接手工打開的瀏覽器呢?
我在 Selenium連接已存在的瀏覽器1 這篇文章詳細記錄了需要的步驟,概括起來:
1、打開瀏覽器時添加以下參數:
--remote-debugging-port=9222 --user-data-dir="C:\selenium\ChromeProfile"
2、selenium中設置瀏覽器選項,通過上面設置的 9222端口連接瀏覽器:
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
driver = webdriver.Chrome(options=chrome_options)
通過 subprocess 運行瀏覽器
當然,做自動化程序一般不會手工點擊圖標來打開瀏覽器,我們可以用命令行啟動瀏覽器,然后再用 selenium 連接。
import subprocess
cmd = '"C:\Program Files (x86)\google\Chrome\Application\chrome.exe" ' \
'--remote-debugging-port=9222 ' \
'--user-data-dir="C:\selenium\ChromeProfile"'
subprocess.run(cmd)
我是九柄,感謝耐心閱讀,下次見。
作者:九柄
鏈接:
https://juejin.cn/post/7083138870962814989