python selenium如何防止被瀏覽器檢測
一、簡介
在網(wǎng)絡(luò)技術(shù)飛速發(fā)展的今天,自動(dòng)化測試作為軟件質(zhì)量保證的重要手段,已經(jīng)越來越受到開發(fā)者和運(yùn)維人員的重視。其中,Selenium以其強(qiáng)大的功能和靈活的跨平臺特性,成為了許多開發(fā)者進(jìn)行Web應(yīng)用自動(dòng)化測試的首選工具。然而,隨著瀏覽器安全策略的不斷完善,如何有效地防止Selenium在自動(dòng)化測試過程中被瀏覽器檢測到,成為了開發(fā)者們面臨的一個(gè)新的挑戰(zhàn)。本文將詳細(xì)探討Selenium在防止被瀏覽器檢測方面的技巧,幫助開發(fā)者更好地應(yīng)對這一問題。
1、瀏覽器指紋識別
瀏覽器指紋識別技術(shù)(Browser Fingerprinting)是一種通過分析用戶的瀏覽器行為、配置和功能來識別用戶的在線身份和行為的技術(shù)。它利用瀏覽器中的一些特性,如操作系統(tǒng)、瀏覽器版本、設(shè)備類型、插件和用戶活動(dòng)等,構(gòu)建一個(gè)唯一的“指紋”信息。這些信息可以被網(wǎng)站和服務(wù)器用來追蹤、定位和分析用戶的訪問行為,從而實(shí)現(xiàn)廣告定向、個(gè)性化推薦、用戶細(xì)分等目的。
瀏覽器指紋識別技術(shù)具有以下特點(diǎn):
- 用戶隱私性較低:由于瀏覽器指紋識別技術(shù)可以通過分析用戶的瀏覽器行為來獲取用戶信息,因此用戶的隱私性較低。
- 難以防范:由于瀏覽器指紋識別技術(shù)依賴于瀏覽器特性,很難完全防范。部分瀏覽器已經(jīng)針對這種技術(shù)提供了保護(hù)措施,但并不能完全消除風(fēng)險(xiǎn)。
- 用戶體驗(yàn)影響較?。弘m然瀏覽器指紋識別技術(shù)可能會(huì)影響用戶的隱私和體驗(yàn),但通常情況下,它不會(huì)對用戶造成顯著的影響。
2、行為分析
瀏覽行為分析(Behavioral Analysis,BA):這是一種分析用戶在瀏覽器中的行為模式的方法,包括用戶的瀏覽歷史、訪問的網(wǎng)站類型、停留時(shí)間等。通過對這些信息的分析,可以判斷操作者是否為真人。
在使用自動(dòng)化過程中盡量避免快速操作,在進(jìn)行每個(gè)步驟的操作中最好停留一下,最好使用模擬鼠標(biāo)和鍵盤來操作
3、為什么會(huì)被瀏覽器檢測呢
- 安全性原因:瀏覽器通常會(huì)對一些惡意行為進(jìn)行監(jiān)控和防范,Selenium 模擬瀏覽器操作的行為可能會(huì)被認(rèn)為是惡意行為。
- 用戶體驗(yàn)原因:瀏覽器的目的是為用戶提供一個(gè)良好的用戶體驗(yàn),而 Selenium 模擬瀏覽器操作可能會(huì)影響用戶的正常使用體驗(yàn)。
- 性能問題:Selenium 模擬瀏覽器操作可能會(huì)導(dǎo)致瀏覽器性能下降,影響其他用戶的正常使用。
- 競爭問題:瀏覽器廠商通常會(huì)限制第三方工具的使用,以避免用戶過度依賴這些工具,影響瀏覽器的穩(wěn)定性和性能。
二、如何知道自己已經(jīng)被檢測到
1、使用window.navigator.webdriver屬性
`window.navigator.webdriver` 是一個(gè)屬性,它返回一個(gè)布爾值,表示當(dāng)前瀏覽器是否支持 WebDriver 技術(shù)。WebDriver 是一種自動(dòng)化測試技術(shù),允許開發(fā)人員使用類似于操作瀏覽器的 API 來測試網(wǎng)頁應(yīng)用程序。
打開瀏覽器,按F12打開控制臺,在控制臺中輸入window.navigator.webdriver

可以看到返回結(jié)果是一個(gè)false
| 值 | 描述 |
|---|---|
| true | 表示當(dāng)前瀏覽器支持 WebDriver |
| false | 表示當(dāng)前瀏覽器不支持 WebDriver |
| undefined | 表示當(dāng)前瀏覽器沒有提供關(guān)于是否支持 WebDriver 的信息 |
這個(gè)屬性的值對于使用 WebDriver 進(jìn)行自動(dòng)化測試非常重要,因?yàn)樗梢詭椭_發(fā)人員確定是否能夠在瀏覽器中使用 WebDriver 進(jìn)行測試。
當(dāng)手動(dòng)打開網(wǎng)站的時(shí)候返回結(jié)果正常都是false or undefined 因?yàn)槲覀兪钦嫒诉M(jìn)行操作,但是當(dāng)使用selenium等其他自動(dòng)化工具打開網(wǎng)站的時(shí)候,很有可能會(huì)被瀏覽器檢測到是測試機(jī)器人在操作,返回true
通俗來講就是手動(dòng)操作打開瀏覽器會(huì)返回false 或者 undefined,使用自動(dòng)化機(jī)器人打開瀏覽器很大幾率會(huì)出現(xiàn)true,部分高級網(wǎng)站當(dāng)識別到你的返回值是true就會(huì)返回給你一些錯(cuò)誤的網(wǎng)站信息來阻止你的自動(dòng)化行為
2、使用在線網(wǎng)站測試工具查看
這個(gè)網(wǎng)站提供了一個(gè)在線工具,可以用于測試你的瀏覽器指紋。具體來說,它可以收集你的瀏覽器信息,并生成一個(gè)獨(dú)特的瀏覽器指紋,用于識別你的瀏覽器。
一些網(wǎng)站和服務(wù)利用瀏覽器指紋識別技術(shù)來跟蹤用戶、進(jìn)行用戶分析、識別欺詐行為等。通過檢測你的瀏覽器指紋,它們可以識別你的設(shè)備和瀏覽器,即使你更換了IP地址或刪除了Cookie也能追蹤你的活動(dòng)。
這個(gè)在線工具可以幫助用戶了解他們的瀏覽器指紋是什么樣的,以及它可能暴露了什么樣的信息。對于普通用戶來說,這有助于增強(qiáng)對個(gè)人隱私的認(rèn)識,促使他們采取一些措施來降低被跟蹤的風(fēng)險(xiǎn)。對于開發(fā)者和安全專家來說,這個(gè)工具也可以用于測試網(wǎng)站的防御措施,以及評估不同瀏覽器或代理工具對瀏覽器指紋的影響。
2.1、手動(dòng)打開該網(wǎng)頁返回

2.2、使用自動(dòng)化測試工具打開
使用selenium打開
from selenium import webdriver
import time
#打開谷歌瀏覽器
driver = webdriver.Chrome()
#頁面最大化
driver.maximize_window()
#打開網(wǎng)頁
driver.get('https://bot.sannysoft.com/')
time.sleep(10)
driver.save_screenshot('ceshi.png')
#關(guān)閉瀏覽器
driver.quit()返回結(jié)果

當(dāng)網(wǎng)站上的WebDriver(New)部分顯示為紅色時(shí),通常表示該網(wǎng)站正在檢測到你正在使用的瀏覽器是通過WebDriver控制的,而不是一個(gè)真實(shí)的人類用戶在操作。WebDriver是一種自動(dòng)化測試工具,通常被用于自動(dòng)化測試和網(wǎng)頁爬取等任務(wù)。然而,一些網(wǎng)站會(huì)檢測到WebDriver的存在,并將其視為不受歡迎的自動(dòng)化行為,可能會(huì)采取一些措施來阻止這種訪問,比如彈出驗(yàn)證碼、重定向到其他頁面,或者直接拒絕服務(wù)。
這個(gè)時(shí)候就需要我們采取一些措施來規(guī)避這種檢測
三、規(guī)避檢測解決方案
現(xiàn)在各個(gè)瀏覽器和網(wǎng)站的反爬機(jī)制都在不斷升級改造,以下方法不一定完全有效,希望對大家的當(dāng)前困境有所幫助
1、使用無頭瀏覽器
使用無頭瀏覽器是一種常見的方法來規(guī)避網(wǎng)站的檢測。下面是一個(gè)使用Selenium和無頭瀏覽器的Python示例代碼:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
# 創(chuàng)建ChromeOptions對象,配置無頭模式
chrome_options = Options()
chrome_options.add_argument('--headless') # 啟用無頭模式
# 可選:為了進(jìn)一步模擬真實(shí)用戶行為,可以添加一些其他的配置
chrome_options.add_argument('--disable-gpu') # 禁用GPU加速
chrome_options.add_argument('--no-sandbox') # 在Linux系統(tǒng)上使用時(shí)可能需要添加此選項(xiàng)
# 創(chuàng)建WebDriver對象,指定Chrome瀏覽器和ChromeOptions
driver = webdriver.Chrome(options=chrome_options)
# 訪問網(wǎng)頁
driver.get("www.baidu.com")
# 執(zhí)行其他操作,例如查找元素、點(diǎn)擊按鈕等
# 關(guān)閉瀏覽器
driver.quit()這段代碼使用了Chrome瀏覽器的無頭模式,在創(chuàng)建WebDriver對象時(shí)傳遞了chrome_options參數(shù),這樣就可以在無頭模式下啟動(dòng)Chrome瀏覽器。通過這種方式,Selenium腳本在后臺運(yùn)行,不會(huì)彈出瀏覽器窗口,從而減少被檢測的風(fēng)險(xiǎn)。
請注意,在某些情況下,網(wǎng)站可能會(huì)檢測到無頭瀏覽器的使用。
1.1、--headless
- 這個(gè)選項(xiàng)告訴Chrome瀏覽器在無頭模式下運(yùn)行,即不顯示圖形用戶界面(GUI),而是在后臺執(zhí)行。無頭模式的瀏覽器會(huì)在沒有顯示的情況下執(zhí)行JavaScript、渲染頁面等操作,通常用于自動(dòng)化測試和數(shù)據(jù)爬取等任務(wù)。
- 使用無頭瀏覽器可以提高運(yùn)行效率、節(jié)省資源,并且不會(huì)打擾用戶。
1.2、--disable-gpu
- 這個(gè)選項(xiàng)禁用了Chrome瀏覽器的GPU加速功能。GPU加速可以加快頁面渲染速度,但在一些情況下可能會(huì)導(dǎo)致問題,尤其是在無頭模式下運(yùn)行時(shí)。
- 禁用GPU加速通常用于解決一些在無頭模式下出現(xiàn)的渲染問題或性能問題。
1.3、--no-sandbox
- 這個(gè)選項(xiàng)禁用了Chrome瀏覽器的沙箱模式。沙箱模式是Chrome瀏覽器的一個(gè)安全特性,用于隔離瀏覽器進(jìn)程和系統(tǒng),以防止惡意軟件對系統(tǒng)的攻擊。
- 在一些特殊的情況下,比如在Linux環(huán)境下以root權(quán)限運(yùn)行Chrome瀏覽器時(shí),沙箱模式可能會(huì)導(dǎo)致一些問題,例如啟動(dòng)失敗或權(quán)限錯(cuò)誤。因此,禁用沙箱模式可以解決這些問題。
2、模擬用戶行為
在實(shí)際操作中,如果操作過快也很容易別檢測到是非真人操作,所以我們在自動(dòng)化操作過程中應(yīng)當(dāng)盡量模仿出人為操作痕跡
2.1、模擬鼠標(biāo)和鍵盤操作
如移動(dòng)到元素、點(diǎn)擊元素、雙擊元素等,需要輸入時(shí)通過使用模擬鍵盤來進(jìn)行數(shù)據(jù)最好不使用send_keys()直接輸入,可以采用pyautogui庫來進(jìn)行模擬鼠標(biāo)鍵盤的操作
2.2、隨機(jī)化操作
在進(jìn)行每次操作的過程中可以適當(dāng)隨機(jī)停頓一下,這樣可以盡量接近真實(shí)用戶的操作習(xí)慣,避免出現(xiàn)規(guī)律性的行為被網(wǎng)站檢測到
#隨機(jī)等待1-15秒 time.sleep(random.randint(1,15))
.....還有很多,待補(bǔ)充
總的來說,通過模擬用戶行為并盡量模仿真實(shí)用戶的操作,可以降低被網(wǎng)站檢測到的風(fēng)險(xiǎn)。但需要注意的是,即使采取了以上措施,仍然無法保證完全不被檢測到,因此在使用Selenium進(jìn)行自動(dòng)化任務(wù)時(shí),始終需要保持警惕并做好應(yīng)對各種情況的準(zhǔn)備。
3、設(shè)置瀏覽器的用戶代理(User-Agent)
設(shè)置瀏覽器的用戶代理(User-Agent)字符串為指定的值。用戶代理字符串是瀏覽器發(fā)送給網(wǎng)站的一段文本,用于告訴網(wǎng)站它所使用的瀏覽器類型和版本等信息,從而進(jìn)行偽裝成真實(shí)用戶操作
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
# 設(shè)置用戶代理字符串為指定的值
user_agent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"
chrome_options.add_argument(f'user-agent={user_agent}')
# 創(chuàng)建WebDriver對象,指定Chrome瀏覽器和ChromeOptions
driver = webdriver.Chrome(options=chrome_options)
# 訪問網(wǎng)頁
driver.get("https://bot.sannysoft.com/")
# 執(zhí)行其他操作,例如查找元素、點(diǎn)擊按鈕等
driver.save_screenshot('ceshi.png')
# 關(guān)閉瀏覽器
driver.quit()這段代碼的關(guān)鍵是使用add_argument()方法將指定的用戶代理字符串作為參數(shù)傳遞給ChromeOptions對象的user-agent選項(xiàng)。然后,將ChromeOptions對象傳遞給webdriver.Chrome()方法來啟動(dòng)Chrome瀏覽器,并且在瀏覽器中設(shè)置了指定的用戶代理字符串。這樣就可以模擬特定瀏覽器和操作系統(tǒng)的訪問行為,以達(dá)到模擬用戶行為的目的。
4、undetected_chromedriver庫(推薦)
undetected_chromedriver 旨在通過使用未被檢測到的ChromeDriver來提高Selenium自動(dòng)化腳本的穩(wěn)定性和可靠性。當(dāng)你使用普通的ChromeDriver時(shí),有些網(wǎng)站可能會(huì)檢測到你的腳本正在使用自動(dòng)化工具,從而采取一些防御措施,比如彈出驗(yàn)證碼、拒絕服務(wù)等。
undetected_chromedriver庫的作用在于通過一些技巧和方法,使得你的Selenium腳本更難被網(wǎng)站檢測到。它的主要特點(diǎn)和作用包括:
- 隨機(jī)化配置: undetected_chromedriver會(huì)隨機(jī)化一些配置,比如窗口大小、Chrome版本、ChromeDriver版本等,使得每次啟動(dòng)的瀏覽器都有些微的差異,從而減少被檢測到的風(fēng)險(xiǎn)。
- 隱藏WebDriver特征: undetected_chromedriver會(huì)嘗試隱藏WebDriver特征,比如修改一些JavaScript變量、刪除一些WebDriver的特有標(biāo)志等,以模擬真實(shí)用戶的行為。
- 定期更新: undetected_chromedriver庫會(huì)定期更新其代碼,以適應(yīng)網(wǎng)站對自動(dòng)化工具的新檢測和防御措施。
- 易于使用: 使用undetected_chromedriver庫只需要簡單地替換你原來的ChromeDriver,無需對現(xiàn)有的Selenium代碼做任何修改。
總的來說,undetected_chromedriver庫的作用是幫助你編寫更穩(wěn)定、更可靠的Selenium自動(dòng)化腳本,減少被網(wǎng)站檢測到的風(fēng)險(xiǎn),從而提高自動(dòng)化任務(wù)的成功率。
import undetected_chromedriver as uc
#創(chuàng)建谷歌瀏覽器
browser = uc.Chrome()
#打開網(wǎng)頁
browser.get(url="https://bot.sannysoft.com/")
# 執(zhí)行其他操作,例如查找元素、點(diǎn)擊按鈕等
browser.save_screenshot('ceshi.png')
# 關(guān)閉瀏覽器
browser.quit()得到的結(jié)果就是已經(jīng)避開了網(wǎng)站的檢測

5、excludeSwitches參數(shù)關(guān)閉自動(dòng)化檢測
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
#關(guān)閉自動(dòng)化檢測
chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])
# 創(chuàng)建WebDriver對象,指定Chrome瀏覽器和ChromeOptions
driver = webdriver.Chrome(options=chrome_options)
# 訪問網(wǎng)頁
driver.get("https://bot.sannysoft.com/")
# 執(zhí)行其他操作,例如查找元素、點(diǎn)擊按鈕等
driver.save_screenshot('ceshi.png')
# 關(guān)閉瀏覽器
driver.quit()options.add_experimental_option("excludeSwitches", ["enable-automation"]) 這行代碼的功能和作用是為ChromeOptions對象添加一個(gè)實(shí)驗(yàn)性選項(xiàng),該選項(xiàng)用于排除特定的開關(guān),其中 "enable-automation" 是要排除的開關(guān)名稱。
具體來說,這行代碼的作用是將 Chrome 瀏覽器的自動(dòng)化標(biāo)志 "enable-automation" 從請求頭中排除掉。在正常情況下,Chrome 瀏覽器會(huì)將 "enable-automation" 添加到請求頭中,以標(biāo)識瀏覽器正在被自動(dòng)化控制,通常是由Selenium等工具控制。這可能會(huì)導(dǎo)致一些網(wǎng)站檢測到自動(dòng)化行為并采取相應(yīng)的防御措施,比如彈出驗(yàn)證碼或拒絕服務(wù)。
通過排除 "enable-automation" 這個(gè)開關(guān),我們可以讓瀏覽器在請求頭中不再顯示自動(dòng)化標(biāo)志,從而使得自動(dòng)化行為更難被網(wǎng)站檢測到。這有助于提高自動(dòng)化測試、數(shù)據(jù)采集等任務(wù)的成功率和穩(wěn)定性。
總之,這行代碼的作用是為了規(guī)避網(wǎng)站對瀏覽器自動(dòng)化的檢測,提高自動(dòng)化腳本的穩(wěn)定性和可靠性。
以上就是python selenium如何防止被瀏覽器檢測的詳細(xì)內(nèi)容,更多關(guān)于selenium防檢測的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
100行Python代碼實(shí)現(xiàn)自動(dòng)搶火車票(附源碼)
又到年底了,相信對于在外地的朋友們來說,火車票是到年底最頭痛的一件事了,但作為程序員的你怎么能一樣呢?快發(fā)揮你的特長,下面這篇文章主要給大家介紹了如果通過100行Python代碼實(shí)現(xiàn)自動(dòng)搶火車票的相關(guān)資料,需要的朋友可以參考下。2018-01-01
python使用minimax算法實(shí)現(xiàn)五子棋
這篇文章主要為大家詳細(xì)介紹了python使用minimax算法實(shí)現(xiàn)五子棋,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07
完美解決torch.cuda.is_available()一直返回False的玄學(xué)方法
這篇文章主要介紹了完美解決torch.cuda.is_available()一直返回False的玄學(xué)方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02
python中關(guān)于os.path.pardir的一些坑
這篇文章主要介紹了python中關(guān)于os.path.pardir的一些坑及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09
Python?xpath,JsonPath,bs4的基本使用
這篇文章主要介紹了Python?xpath,JsonPath,bs4的基本使用,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下2022-07-07
GitHub?AI編程工具copilot在Pycharm的應(yīng)用
最近聽說github出了一種最新的插件叫做copilot,這篇文章主要給大家介紹了關(guān)于GitHub?AI編程工具copilot在Pycharm的應(yīng)用,目前感覺確實(shí)不錯(cuò),建議大家也去使用,需要的朋友可以參考下2022-04-04

