python selenium如何防止被瀏覽器檢測
一、簡介
在網(wǎng)絡(luò)技術(shù)飛速發(fā)展的今天,自動化測試作為軟件質(zhì)量保證的重要手段,已經(jīng)越來越受到開發(fā)者和運維人員的重視。其中,Selenium以其強大的功能和靈活的跨平臺特性,成為了許多開發(fā)者進行Web應(yīng)用自動化測試的首選工具。然而,隨著瀏覽器安全策略的不斷完善,如何有效地防止Selenium在自動化測試過程中被瀏覽器檢測到,成為了開發(fā)者們面臨的一個新的挑戰(zhàn)。本文將詳細探討Selenium在防止被瀏覽器檢測方面的技巧,幫助開發(fā)者更好地應(yīng)對這一問題。
1、瀏覽器指紋識別
瀏覽器指紋識別技術(shù)(Browser Fingerprinting)是一種通過分析用戶的瀏覽器行為、配置和功能來識別用戶的在線身份和行為的技術(shù)。它利用瀏覽器中的一些特性,如操作系統(tǒng)、瀏覽器版本、設(shè)備類型、插件和用戶活動等,構(gòu)建一個唯一的“指紋”信息。這些信息可以被網(wǎng)站和服務(wù)器用來追蹤、定位和分析用戶的訪問行為,從而實現(xiàn)廣告定向、個性化推薦、用戶細分等目的。
瀏覽器指紋識別技術(shù)具有以下特點:
- 用戶隱私性較低:由于瀏覽器指紋識別技術(shù)可以通過分析用戶的瀏覽器行為來獲取用戶信息,因此用戶的隱私性較低。
- 難以防范:由于瀏覽器指紋識別技術(shù)依賴于瀏覽器特性,很難完全防范。部分瀏覽器已經(jīng)針對這種技術(shù)提供了保護措施,但并不能完全消除風(fēng)險。
- 用戶體驗影響較?。弘m然瀏覽器指紋識別技術(shù)可能會影響用戶的隱私和體驗,但通常情況下,它不會對用戶造成顯著的影響。
2、行為分析
瀏覽行為分析(Behavioral Analysis,BA):這是一種分析用戶在瀏覽器中的行為模式的方法,包括用戶的瀏覽歷史、訪問的網(wǎng)站類型、停留時間等。通過對這些信息的分析,可以判斷操作者是否為真人。
在使用自動化過程中盡量避免快速操作,在進行每個步驟的操作中最好停留一下,最好使用模擬鼠標(biāo)和鍵盤來操作
3、為什么會被瀏覽器檢測呢
- 安全性原因:瀏覽器通常會對一些惡意行為進行監(jiān)控和防范,Selenium 模擬瀏覽器操作的行為可能會被認為是惡意行為。
- 用戶體驗原因:瀏覽器的目的是為用戶提供一個良好的用戶體驗,而 Selenium 模擬瀏覽器操作可能會影響用戶的正常使用體驗。
- 性能問題:Selenium 模擬瀏覽器操作可能會導(dǎo)致瀏覽器性能下降,影響其他用戶的正常使用。
- 競爭問題:瀏覽器廠商通常會限制第三方工具的使用,以避免用戶過度依賴這些工具,影響瀏覽器的穩(wěn)定性和性能。
二、如何知道自己已經(jīng)被檢測到
1、使用window.navigator.webdriver屬性
`window.navigator.webdriver` 是一個屬性,它返回一個布爾值,表示當(dāng)前瀏覽器是否支持 WebDriver 技術(shù)。WebDriver 是一種自動化測試技術(shù),允許開發(fā)人員使用類似于操作瀏覽器的 API 來測試網(wǎng)頁應(yīng)用程序。
打開瀏覽器,按F12打開控制臺,在控制臺中輸入window.navigator.webdriver
可以看到返回結(jié)果是一個false
值 | 描述 |
---|---|
true | 表示當(dāng)前瀏覽器支持 WebDriver |
false | 表示當(dāng)前瀏覽器不支持 WebDriver |
undefined | 表示當(dāng)前瀏覽器沒有提供關(guān)于是否支持 WebDriver 的信息 |
這個屬性的值對于使用 WebDriver 進行自動化測試非常重要,因為它可以幫助開發(fā)人員確定是否能夠在瀏覽器中使用 WebDriver 進行測試。
當(dāng)手動打開網(wǎng)站的時候返回結(jié)果正常都是false or undefined 因為我們是真人進行操作,但是當(dāng)使用selenium等其他自動化工具打開網(wǎng)站的時候,很有可能會被瀏覽器檢測到是測試機器人在操作,返回true
通俗來講就是手動操作打開瀏覽器會返回false 或者 undefined,使用自動化機器人打開瀏覽器很大幾率會出現(xiàn)true,部分高級網(wǎng)站當(dāng)識別到你的返回值是true就會返回給你一些錯誤的網(wǎng)站信息來阻止你的自動化行為
2、使用在線網(wǎng)站測試工具查看
這個網(wǎng)站提供了一個在線工具,可以用于測試你的瀏覽器指紋。具體來說,它可以收集你的瀏覽器信息,并生成一個獨特的瀏覽器指紋,用于識別你的瀏覽器。
一些網(wǎng)站和服務(wù)利用瀏覽器指紋識別技術(shù)來跟蹤用戶、進行用戶分析、識別欺詐行為等。通過檢測你的瀏覽器指紋,它們可以識別你的設(shè)備和瀏覽器,即使你更換了IP地址或刪除了Cookie也能追蹤你的活動。
這個在線工具可以幫助用戶了解他們的瀏覽器指紋是什么樣的,以及它可能暴露了什么樣的信息。對于普通用戶來說,這有助于增強對個人隱私的認識,促使他們采取一些措施來降低被跟蹤的風(fēng)險。對于開發(fā)者和安全專家來說,這個工具也可以用于測試網(wǎng)站的防御措施,以及評估不同瀏覽器或代理工具對瀏覽器指紋的影響。
2.1、手動打開該網(wǎng)頁返回
2.2、使用自動化測試工具打開
使用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)部分顯示為紅色時,通常表示該網(wǎng)站正在檢測到你正在使用的瀏覽器是通過WebDriver控制的,而不是一個真實的人類用戶在操作。WebDriver是一種自動化測試工具,通常被用于自動化測試和網(wǎng)頁爬取等任務(wù)。然而,一些網(wǎng)站會檢測到WebDriver的存在,并將其視為不受歡迎的自動化行為,可能會采取一些措施來阻止這種訪問,比如彈出驗證碼、重定向到其他頁面,或者直接拒絕服務(wù)。
這個時候就需要我們采取一些措施來規(guī)避這種檢測
三、規(guī)避檢測解決方案
現(xiàn)在各個瀏覽器和網(wǎng)站的反爬機制都在不斷升級改造,以下方法不一定完全有效,希望對大家的當(dāng)前困境有所幫助
1、使用無頭瀏覽器
使用無頭瀏覽器是一種常見的方法來規(guī)避網(wǎng)站的檢測。下面是一個使用Selenium和無頭瀏覽器的Python示例代碼:
from selenium import webdriver from selenium.webdriver.chrome.options import Options # 創(chuàng)建ChromeOptions對象,配置無頭模式 chrome_options = Options() chrome_options.add_argument('--headless') # 啟用無頭模式 # 可選:為了進一步模擬真實用戶行為,可以添加一些其他的配置 chrome_options.add_argument('--disable-gpu') # 禁用GPU加速 chrome_options.add_argument('--no-sandbox') # 在Linux系統(tǒng)上使用時可能需要添加此選項 # 創(chuàng)建WebDriver對象,指定Chrome瀏覽器和ChromeOptions driver = webdriver.Chrome(options=chrome_options) # 訪問網(wǎng)頁 driver.get("www.baidu.com") # 執(zhí)行其他操作,例如查找元素、點擊按鈕等 # 關(guān)閉瀏覽器 driver.quit()
這段代碼使用了Chrome瀏覽器的無頭模式,在創(chuàng)建WebDriver對象時傳遞了chrome_options
參數(shù),這樣就可以在無頭模式下啟動Chrome瀏覽器。通過這種方式,Selenium腳本在后臺運行,不會彈出瀏覽器窗口,從而減少被檢測的風(fēng)險。
請注意,在某些情況下,網(wǎng)站可能會檢測到無頭瀏覽器的使用。
1.1、--headless
- 這個選項告訴Chrome瀏覽器在無頭模式下運行,即不顯示圖形用戶界面(GUI),而是在后臺執(zhí)行。無頭模式的瀏覽器會在沒有顯示的情況下執(zhí)行JavaScript、渲染頁面等操作,通常用于自動化測試和數(shù)據(jù)爬取等任務(wù)。
- 使用無頭瀏覽器可以提高運行效率、節(jié)省資源,并且不會打擾用戶。
1.2、--disable-gpu
- 這個選項禁用了Chrome瀏覽器的GPU加速功能。GPU加速可以加快頁面渲染速度,但在一些情況下可能會導(dǎo)致問題,尤其是在無頭模式下運行時。
- 禁用GPU加速通常用于解決一些在無頭模式下出現(xiàn)的渲染問題或性能問題。
1.3、--no-sandbox
- 這個選項禁用了Chrome瀏覽器的沙箱模式。沙箱模式是Chrome瀏覽器的一個安全特性,用于隔離瀏覽器進程和系統(tǒng),以防止惡意軟件對系統(tǒng)的攻擊。
- 在一些特殊的情況下,比如在Linux環(huán)境下以root權(quán)限運行Chrome瀏覽器時,沙箱模式可能會導(dǎo)致一些問題,例如啟動失敗或權(quán)限錯誤。因此,禁用沙箱模式可以解決這些問題。
2、模擬用戶行為
在實際操作中,如果操作過快也很容易別檢測到是非真人操作,所以我們在自動化操作過程中應(yīng)當(dāng)盡量模仿出人為操作痕跡
2.1、模擬鼠標(biāo)和鍵盤操作
如移動到元素、點擊元素、雙擊元素等,需要輸入時通過使用模擬鍵盤來進行數(shù)據(jù)最好不使用send_keys()直接輸入,可以采用pyautogui庫來進行模擬鼠標(biāo)鍵盤的操作
2.2、隨機化操作
在進行每次操作的過程中可以適當(dāng)隨機停頓一下,這樣可以盡量接近真實用戶的操作習(xí)慣,避免出現(xiàn)規(guī)律性的行為被網(wǎng)站檢測到
#隨機等待1-15秒 time.sleep(random.randint(1,15))
.....還有很多,待補充
總的來說,通過模擬用戶行為并盡量模仿真實用戶的操作,可以降低被網(wǎng)站檢測到的風(fēng)險。但需要注意的是,即使采取了以上措施,仍然無法保證完全不被檢測到,因此在使用Selenium進行自動化任務(wù)時,始終需要保持警惕并做好應(yīng)對各種情況的準(zhǔn)備。
3、設(shè)置瀏覽器的用戶代理(User-Agent)
設(shè)置瀏覽器的用戶代理(User-Agent)字符串為指定的值。用戶代理字符串是瀏覽器發(fā)送給網(wǎng)站的一段文本,用于告訴網(wǎng)站它所使用的瀏覽器類型和版本等信息,從而進行偽裝成真實用戶操作
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í)行其他操作,例如查找元素、點擊按鈕等 driver.save_screenshot('ceshi.png') # 關(guān)閉瀏覽器 driver.quit()
這段代碼的關(guān)鍵是使用add_argument()
方法將指定的用戶代理字符串作為參數(shù)傳遞給ChromeOptions對象的user-agent
選項。然后,將ChromeOptions對象傳遞給webdriver.Chrome()
方法來啟動Chrome瀏覽器,并且在瀏覽器中設(shè)置了指定的用戶代理字符串。這樣就可以模擬特定瀏覽器和操作系統(tǒng)的訪問行為,以達到模擬用戶行為的目的。
4、undetected_chromedriver庫(推薦)
undetected_chromedriver 旨在通過使用未被檢測到的ChromeDriver來提高Selenium自動化腳本的穩(wěn)定性和可靠性。當(dāng)你使用普通的ChromeDriver時,有些網(wǎng)站可能會檢測到你的腳本正在使用自動化工具,從而采取一些防御措施,比如彈出驗證碼、拒絕服務(wù)等。
undetected_chromedriver庫的作用在于通過一些技巧和方法,使得你的Selenium腳本更難被網(wǎng)站檢測到。它的主要特點和作用包括:
- 隨機化配置: undetected_chromedriver會隨機化一些配置,比如窗口大小、Chrome版本、ChromeDriver版本等,使得每次啟動的瀏覽器都有些微的差異,從而減少被檢測到的風(fēng)險。
- 隱藏WebDriver特征: undetected_chromedriver會嘗試隱藏WebDriver特征,比如修改一些JavaScript變量、刪除一些WebDriver的特有標(biāo)志等,以模擬真實用戶的行為。
- 定期更新: undetected_chromedriver庫會定期更新其代碼,以適應(yīng)網(wǎng)站對自動化工具的新檢測和防御措施。
- 易于使用: 使用undetected_chromedriver庫只需要簡單地替換你原來的ChromeDriver,無需對現(xiàn)有的Selenium代碼做任何修改。
總的來說,undetected_chromedriver庫的作用是幫助你編寫更穩(wěn)定、更可靠的Selenium自動化腳本,減少被網(wǎng)站檢測到的風(fēng)險,從而提高自動化任務(wù)的成功率。
import undetected_chromedriver as uc #創(chuàng)建谷歌瀏覽器 browser = uc.Chrome() #打開網(wǎng)頁 browser.get(url="https://bot.sannysoft.com/") # 執(zhí)行其他操作,例如查找元素、點擊按鈕等 browser.save_screenshot('ceshi.png') # 關(guān)閉瀏覽器 browser.quit()
得到的結(jié)果就是已經(jīng)避開了網(wǎng)站的檢測
5、excludeSwitches參數(shù)關(guān)閉自動化檢測
from selenium import webdriver from selenium.webdriver.chrome.options import Options chrome_options = Options() #關(guān)閉自動化檢測 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í)行其他操作,例如查找元素、點擊按鈕等 driver.save_screenshot('ceshi.png') # 關(guān)閉瀏覽器 driver.quit()
options.add_experimental_option("excludeSwitches", ["enable-automation"])
這行代碼的功能和作用是為ChromeOptions對象添加一個實驗性選項,該選項用于排除特定的開關(guān),其中 "enable-automation"
是要排除的開關(guān)名稱。
具體來說,這行代碼的作用是將 Chrome 瀏覽器的自動化標(biāo)志 "enable-automation" 從請求頭中排除掉。在正常情況下,Chrome 瀏覽器會將 "enable-automation" 添加到請求頭中,以標(biāo)識瀏覽器正在被自動化控制,通常是由Selenium等工具控制。這可能會導(dǎo)致一些網(wǎng)站檢測到自動化行為并采取相應(yīng)的防御措施,比如彈出驗證碼或拒絕服務(wù)。
通過排除 "enable-automation" 這個開關(guān),我們可以讓瀏覽器在請求頭中不再顯示自動化標(biāo)志,從而使得自動化行為更難被網(wǎng)站檢測到。這有助于提高自動化測試、數(shù)據(jù)采集等任務(wù)的成功率和穩(wěn)定性。
總之,這行代碼的作用是為了規(guī)避網(wǎng)站對瀏覽器自動化的檢測,提高自動化腳本的穩(wěn)定性和可靠性。
以上就是python selenium如何防止被瀏覽器檢測的詳細內(nèi)容,更多關(guān)于selenium防檢測的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
100行Python代碼實現(xiàn)自動搶火車票(附源碼)
又到年底了,相信對于在外地的朋友們來說,火車票是到年底最頭痛的一件事了,但作為程序員的你怎么能一樣呢?快發(fā)揮你的特長,下面這篇文章主要給大家介紹了如果通過100行Python代碼實現(xiàn)自動搶火車票的相關(guān)資料,需要的朋友可以參考下。2018-01-01完美解決torch.cuda.is_available()一直返回False的玄學(xué)方法
這篇文章主要介紹了完美解決torch.cuda.is_available()一直返回False的玄學(xué)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02python中關(guān)于os.path.pardir的一些坑
這篇文章主要介紹了python中關(guān)于os.path.pardir的一些坑及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-09-09Python?xpath,JsonPath,bs4的基本使用
這篇文章主要介紹了Python?xpath,JsonPath,bs4的基本使用,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下2022-07-07GitHub?AI編程工具copilot在Pycharm的應(yīng)用
最近聽說github出了一種最新的插件叫做copilot,這篇文章主要給大家介紹了關(guān)于GitHub?AI編程工具copilot在Pycharm的應(yīng)用,目前感覺確實不錯,建議大家也去使用,需要的朋友可以參考下2022-04-04