Selenium模擬人類行為,操作網頁的方法(全)

看到有朋友評論問,用selenium怎么模仿人類行為,去操作網頁的頁面呢?

我想了想,這確實是一個很大的點,不應該是一段代碼能解決的,

就像是,如果讓程序模擬人類的行為。例如模擬人類買菜,做飯,吃飯,聊天,蹲坑等

這個過程中最重要的不是結果,不是程序能不能完成這些事,而是做這些事的時候,能不能盡可能地像個人在做的,然后盡力躲過網絡警察的審查。

selenium的優勢是在于它的休眠機制、可以模擬真實的瀏覽器指紋,模擬鼠標移動的行為軌跡、處理復雜交互等,可以降低被檢測和封鎖的風險。

具體的模擬應該要分不同的情況來,以下是一些整理:

1. 配置selenium的瀏覽器界面

在運行下面的方法前,先把selenium 配置好,盡量多一些selenium的配置,用來繞過監測,下面的簡單的寫法,嚴謹一點的話,可以如2、3、4的寫法,加上用戶代理和禁用自動化特征、防檢測的header頭寫法等:

from selenium import webdriver
from selenium.webdriver.chrome.options import Optionsoptions = Options()
options.add_argument("--window-size=1920,1080")  # 設置瀏覽器窗口大小
options.add_argument("--disable-blink-features=AutomationControlled")  # 禁用自動化控制特征
options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36")  # 設置用戶代理
driver = webdriver.Chrome(options=options)#加上頭的寫法

2. 使用代理IP

我們在訪問其他網站的時候,使用自己的服務器地址,向對方的網站打個招呼,這個時候會暴露自己的IP地址,就像打電話給別人一樣,我們的電話號碼也會暴露給了對方。如果頻繁地向對方一直打招呼,就容易被對方視作垃圾號碼一樣拉黑

這就跟被人標記成垃圾號碼一樣被對方封了,這個是封IP;現在很多人會用虛擬號碼去頻繁地打電話給別人,哪怕別人拉黑了這個號碼,也拉黑不了下一個。因為每次打出去的號碼都是新的虛擬的號

做代理IP就像是給自己的電腦IP,包裝多個虛擬號碼一樣的外殼, 這樣可以保障自己在頻繁地訪問一個網站的時候,不會輕易被拉黑了。

from selenium import webdriverPROXY = "123.456.789.012:8080"  # 示例代理options = webdriver.ChromeOptions()
options.add_argument(f'--proxy-server={PROXY}')
driver = webdriver.Chrome(options=options)

這個代理ip有付費的網站,也有免費的網站,如果有需要,后期我會再整理各類的網站出來


3. 禁用自動化特征

在這里插入圖片描述
有時候爬取的時候,會顯示這樣一行字,下面的方法是可以取消這行字的顯示,將瀏覽器包裝成非自動化測試的外殼。

options = Options()
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
driver = webdriver.Chrome(options=options)

4. selenium上構造安全頭header

請求頭把自己的瀏覽器信息發送給對方服務器,有點像是給對方服務器遞了個名片過去。

單一的header頭,也會受到對方服務器的檢測,有時候我們也可以有選擇地構建安全頭內容。

4.1 方法1:通過 add_argument 設置基礎 Headers(簡單但有限)

適用于修改 User-Agent 等基礎頭信息:

from selenium import webdriveroptions = webdriver.ChromeOptions()
options.add_argument("--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36")
options.add_argument("--accept-language=en-US,en;q=0.9")driver = webdriver.Chrome(options=options)

局限性:僅支持部分預定義頭(如 User-Agent、Accept-Language),無法添加自定義頭(如 Authorization)。

4.2 方法2:使用 DevTools Protocol(推薦,完整控制)

動態的header構建,通過 Chrome DevTools 的 Network.setExtraHTTPHeaders 方法,注入任意 Headers:

from selenium import webdriver
from selenium.webdriver.common.by import Bydriver = webdriver.Chrome()# 定義自定義 Headers
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)","Accept": "text/html,application/xhtml+xml","Authorization": "Bearer token123",  # 示例自定義頭"X-Custom-Header": "MyValue"
}# 通過 DevTools 注入 Headers
driver.execute_cdp_cmd("Network.enable", {})
driver.execute_cdp_cmd("Network.setExtraHTTPHeaders", {"headers": headers})driver.get("https://example.com")

優點:支持所有自定義 Headers,適用于需要 Cookie、Referer 等復雜場景。

4.3 進階的header頭:使用undetected-chromedriver來構建

反爬會對部分網站會檢測 Sec- 開頭的安全頭(如 Sec-Ch-Ua),需用 undetected-chromedriver 規避。


5.模擬鼠標移動與點擊

我們在點擊網頁后,如果有一些交互的按鈕,例如要移動到某個位置再點擊之類的,我們可能會用find_element 定位元素再進行點擊,

但是如果在防檢測比較嚴格的情況下,例如對方瀏覽器對鼠標進行監控計算,會監測用戶是鼠標是不是在移動,如果是上面的方法,這種就沒法做到,這時候可以用到ActionChains來處理:

from selenium.webdriver.common.action_chains import ActionChains
import random
import timeelement = driver.find_element_by_id("some-id")# 模擬人類移動鼠標
actions = ActionChains(driver)
actions.move_to_element(element).perform()# 添加隨機延遲
time.sleep(random.uniform(0.5, 2.5))# 模擬人類點擊(先移動再點擊)
actions.click(element).perform()

但是這種方法會一直占用鼠標的使用的,導致我們爬蟲之余沒法做其他的事情,處于下策,能不用就盡量不用。


6.模擬鼠標滾動的行為

我們在瀏覽頁面的時候,會有滾動鼠標,看下滑的頁面,下滑不是一直滑,而是會停一會,再下拉頁面一會

即模擬人的人眼在看到頁面后的反應,腦子會對眼球的視覺信息做處理,停留思考一會,這時候會有一個間隔的空隙,

這個空隙可以用隨機休眠的方法處理:

import random# 隨機滾動頁面
scroll_pause_time = random.uniform(0.5, 1.5)
scroll_height = random.randint(200, 800)for i in range(random.randint(1, 5)):driver.execute_script(f"window.scrollBy(0, {scroll_height});") #用js模擬滾動鼠標的操作time.sleep(scroll_pause_time) #間隔休眠的時間

7.模擬瀏覽頁面時,停留一些時間

人在瀏覽網頁的時候,不會一直都無停留地一直切換不同的瀏覽器的網頁,我們在不同的網頁間切換,要隨機增加一些睡眠,原理同上

import random# 不同頁面間的隨機等待
wait_times = [1, 1.5, 2, 2.5, 3, 4, 5]driver.get(url_1)
time.sleep(random.choice(wait_times))
driver.get(url_2)
time.sleep(random.choice(wait_times))

8. 模擬在輸入框里輸入文字的行為

在模擬人在手敲鍵盤的時候,模擬一個字一個字得打出來,

這個一字一頓,得用到字與字輸出的休眠

這種方法的實現是for循環里打出一堆字的時候,在每個字之間增加隨機的休眠,如:

from selenium.webdriver.common.keys import Keystext_field = driver.find_element_by_id("search-box")# 模擬人類打字速度
text_to_type = "example search query"
for char in text_to_type:text_field.send_keys(char)time.sleep(random.uniform(0.1, 0.3))  # 隨機輸入間隔# 隨機等待后按回車
time.sleep(random.uniform(0.5, 1.5))
text_field.send_keys(Keys.RETURN)

9. 模擬人類錯誤與糾正

我們在打字的時候,有時候會寫錯字,需要刪除內容,然后再重新輸入

這個模擬寫錯又糾錯的過程,如下:

# 模擬輸入錯誤并糾正
search_box = driver.find_element_by_name("q")# 故意輸入錯誤
search_box.send_keys("mistake")
time.sleep(random.uniform(0.5, 1.5))# 模擬退格刪除
for _ in range(3):search_box.send_keys(Keys.BACK_SPACE)time.sleep(random.uniform(0.1, 0.3))# 輸入正確內容
search_box.send_keys("correct term")

10. 標簽頁與窗口行為模擬

如果爬取時間比較長的話,我們一直在一個標簽頁的窗口上一直操作,也不太合理,要時不時打開新的標簽頁,進行處理

下面的方法是用概率來限制打開標簽頁的次數:

# 隨機打開新標簽頁
if random.random() > 0.7:  # 30%概率打開新標簽driver.execute_script("window.open('https://example.com');")time.sleep(random.uniform(1, 3))# 切換回原標簽頁driver.switch_to.window(driver.window_handles[0])time.sleep(random.uniform(0.5, 1.5))

11. 操作順序隨機化

一些可以點擊的元素,不要按順序一個個順著去點,要調換順序,隨機去點,例如:在這里插入圖片描述
寫法:

actions = [lambda: driver.execute_script("window.scrollBy(0, 200);"),lambda: driver.find_element_by_link_text("About").click(),lambda: driver.back(),lambda: time.sleep(random.uniform(1, 2))
]random.shuffle(actions)
for action in actions[:random.randint(1, 3)]:action()time.sleep(random.uniform(0.5, 1.5))

12. 下載文件時,模擬網絡條件限定速度

下載一些文件的時候,模擬網絡的狀態,設置下載的速度,不要太快,或者太頻繁下載:

from selenium.webdriver.common.desired_capabilities import DesiredCapabilitiescaps = DesiredCapabilities.CHROME
caps['goog:loggingPrefs'] = {'performance': 'ALL'}
caps['networkConditions'] = {'offline': False,'latency': 100,  # 額外延遲(ms)'download_throughput': 500 * 1024,  # 最大下載速度'upload_throughput': 500 * 1024  # 最大上傳速度
}
driver = webdriver.Chrome(desired_capabilities=caps)

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/79492.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/79492.shtml
英文地址,請注明出處:http://en.pswp.cn/web/79492.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

RabbitMQ的工作隊列模式和路由模式有什么區別?

RabbitMQ 的工作隊列模式(Work Queues)和路由模式(Routing)是兩種不同的消息傳遞模式,主要區別在于消息的分發邏輯和使用場景。以下是它們的核心差異: 1. 工作隊列模式(Work Queues&#xff09…

牛客練習賽138(首篇萬字題解???)

賽時成績如下: 1. 小s的簽到題 小s拿到了一個比賽榜單,他要用最快的速度找到簽到題,但是小s腦子還是有點暈,請你幫幫小s,助力他找到簽到題。 比賽榜單是一個 2 行 n 列的表格: 第一行是 n 個大寫字母&#…

linux0.11內核源碼修仙傳第十六章——獲取硬盤信息及根目錄掛載

🚀 前言 書接第十四章:linux0.11內核源碼修仙傳第十四章——進程調度之fork函數,在這一節博客中已經通過fork進程創建了一個新的進程1,并且可以被調度,接下來接著主線繼續走下去。希望各位給個三連,拜托啦&…

mobile自動化測試-appium webdriverio

WebdriverIO是一款支持mobile app和mobile web自動化測試框架,與appium集成,完成對mobile應用測試。支持ios 和android兩種平臺,且功能豐富,是mobile app自動化測試首選框架。且官方還提供了mobile 應用測試example代碼&#xff0…

Kubernetes排錯(十):常見網絡故障排查

通用排查思路 Kubernetes 集群內不同服務之間的網絡通信出現異常,表現為請求超時、連接失敗或響應緩慢,導致服務間依賴關系中斷,依賴服務的功能不可用或性能下降,甚至可能波及整個微服務架構,引發連鎖反應&#xff0c…

PyTorch 張量與自動微分操作

筆記 1 張量索引操作 import torch ? # 下標從左到右從0開始(0->第一個值), 從右到左從-1開始 # data[行下標, 列下標] # data[0軸下標, 1軸下標, 2軸下標] ? def dm01():# 創建張量torch.manual_seed(0)data torch.randint(low0, high10, size(4, 5))print(data->,…

接口的基礎定義與屬性約束

在 TypeScript 中,接口(Interface)是一個非常強大且常用的特性。接口定義了對象的結構,包括對象的屬性和方法,可以為對象提供類型檢查和約束。通過接口,我們可以清晰地描述一個對象應該具備哪些屬性和方法。…

高效全能PDF工具,支持OCR識別

軟件介紹 PDF XChange Editor是一款功能強大的PDF編輯工具,支持多種操作功能,不僅可編輯PDF內容與圖片,還具備OCR識別表單信息的能力,滿足多種場景下的需求。 軟件特點 這款PDF編輯器完全免費,用戶下載后直接…

OpenCV 中用于背景分割的一個類cv::bgsegm::BackgroundSubtractorGMG

操作系統:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 編程語言:C11 算法描述 cv::bgsegm::BackgroundSubtractorGMG 是 OpenCV 中用于背景分割的一個類,它實現了基于貝葉斯推理的背景建模算法(Bayesi…

MongoDB知識框架

簡介:MongoDB 是一個基于分布式文件存儲的數據庫,屬于 NoSQL 數據庫產品,以下是其知識框架總結: 一、數據模型 文檔:MongoDB 中的數據以 BSON(二進制形式的 JSON)格式存儲在集合中,…

WEBSTORM前端 —— 第2章:CSS —— 第8節:網頁制作2(小兔鮮兒)

目錄 1.項目目錄 2.SEO 三大標簽 3.Favicon 圖標 4.版心 5.快捷導航(shortcut) 6.頭部(header) 7.底部(footer) 8.banner 9.banner – 圓點 10.新鮮好物(goods) 11.熱門品牌(brand) 12.生鮮(fresh) 13.最新專題(topic) 1.項目目錄 【xtx-pc】 ima…

1、RocketMQ 核心架構拆解

1. 為什么要使用消息隊列? 消息隊列(MQ)是分布式系統中不可或缺的中間件,主要解決系統間的解耦、異步和削峰填谷問題。 解耦:生產者和消費者通過消息隊列通信,彼此無需直接依賴,極大提升系統靈…

[Linux網絡_71] NAT技術 | 正反代理 | 網絡協議總結 | 五種IO模型

目錄 1.NAT技術 NAPT 2.NAT和代理服務器 3.網線通信各層協議總結 補充說明 4.五種 IO 模型 1.什么是IO?什么是高效的IO? 2.有那些IO的方式?這么多的方式,有那些是高效的? 異步 IO 🎣 關鍵缺陷類比…

Unity基礎學習(八)時間相關內容Time

眾所周知,每一個游戲都會有自己的時間。這個時間可以是內部,從游戲開始的時間,也可以是外部真實的物理時間,時間相關內容 主要用于游戲中 參與位移計時 時間暫停等。那么我們今天就來看看Unity中和時間相關的內容。 Unity時間功能…

Java游戲服務器開發流水賬(1)游戲服務器的架構淺析

新項目立項停滯,頭大。近期讀老項目代碼看到Java,筆記記錄一下。 為什么要做服務器的架構 游戲服務器架構設計具有多方面的重要意義,它直接關系到游戲的性能、可擴展性、穩定性以及用戶體驗等關鍵因素 確保游戲的流暢運行 優化數據處理&a…

計算機視覺與深度學習 | 基于Transformer的低照度圖像增強技術

基于Transformer的低照度圖像增強技術通過結合Transformer的全局建模能力和傳統圖像增強理論(如Retinex),在保留顏色信息、抑制噪聲和平衡亮度方面展現出顯著優勢。以下是其核心原理、關鍵公式及典型代碼實現: 一、原理分析 1. 全局依賴建模與局部特征融合 Transformer的核…

Linux 文件目錄管理常用命令

pwd 顯示當前絕對路徑 cd 切換目錄 指令備注cd -回退cd …返回上一層cd ~切換到用戶主目錄 ls 列出目錄的內容 指令備注ls -a顯示當前目錄中的所有文件和目錄,包括隱藏文件ls -l以長格式顯示當前目錄中的文件和目錄ls -hl以人類可讀的方式顯示當前目錄中的文…

【Linux 系統調試】性能分析工具perf使用與調試方法

目錄 一、perf基本概念 1?. 事件類型? 2?. 低開銷高精度 3?. 工具定位? 二、安裝與基礎配置 1. 安裝方法 2. 啟用符號調試 三、perf工作原理 1. 數據采集機制 2. 硬件事件轉化流程 四、perf應用場景 1. 系統瓶頸定位 2. 鎖競爭優化 3. 緩存優化 五、perf高級…

嵌入式中屏幕的通信方式

LCD屏通信方式詳解 LCD屏(液晶顯示屏)的通信方式直接影響其數據傳輸效率、顯示刷新速度及硬件設計復雜度。根據應用場景和需求,LCD屏的通信方式主要分為以下三類,每種方式在協議類型、數據速率、硬件成本及適用場景上存在顯著差異…

【el-admin】el-admin關聯數據字典

數據字典使用 一、新增數據字典1、新增【圖書狀態】和【圖書類型】數據字典2、編輯字典值 二、代碼生成配置1、表單設置2、關聯字典3、驗證關聯數據字典 三、查詢操作1、模糊查詢2、按類別查詢(下拉框) 四、數據校驗 一、新增數據字典 1、新增【圖書狀態…