最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Selenium模擬用戶(hù)進(jìn)行操作網(wǎng)頁(yè)的最全指南

 更新時(shí)間:2025年05月07日 10:54:49   作者:翠花上酸菜  
這篇文章主要為大家詳細(xì)介紹了使用selenium怎么模仿人類(lèi)行為,去操作網(wǎng)頁(yè)的頁(yè)面呢,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

看到有朋友評(píng)論問(wèn),用selenium怎么模仿人類(lèi)行為,去操作網(wǎng)頁(yè)的頁(yè)面呢?

我想了想,這確實(shí)是一個(gè)很大的點(diǎn),不應(yīng)該是一段代碼能解決的,

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

這個(gè)過(guò)程中最重要的不是結(jié)果,不是程序能不能完成這些事,而是做這些事的時(shí)候,能不能盡可能地像個(gè)人在做的,然后盡力躲過(guò)網(wǎng)絡(luò)警察的審查。

selenium的優(yōu)勢(shì)是在于它的休眠機(jī)制、可以模擬真實(shí)的瀏覽器指紋,模擬鼠標(biāo)移動(dòng)的行為軌跡、處理復(fù)雜交互等,可以降低被檢測(cè)和封鎖的風(fēng)險(xiǎn)。

具體的模擬應(yīng)該要分不同的情況來(lái),以下是一些整理:

1. 配置selenium的瀏覽器界面

在運(yùn)行下面的方法前,先把selenium 配置好,盡量多一些selenium的配置,用來(lái)繞過(guò)監(jiān)測(cè),下面的簡(jiǎn)單的寫(xiě)法,嚴(yán)謹(jǐn)一點(diǎn)的話(huà),可以如2、3、4的寫(xiě)法,加上用戶(hù)代理和禁用自動(dòng)化特征、防檢測(cè)的header頭寫(xiě)法等:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument("--window-size=1920,1080")  # 設(shè)置瀏覽器窗口大小
options.add_argument("--disable-blink-features=AutomationControlled")  # 禁用自動(dòng)化控制特征
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")  # 設(shè)置用戶(hù)代理
driver = webdriver.Chrome(options=options)

#加上頭的寫(xiě)法

2. 使用代理IP

我們?cè)谠L問(wèn)其他網(wǎng)站的時(shí)候,使用自己的服務(wù)器地址,向?qū)Ψ降木W(wǎng)站打個(gè)招呼,這個(gè)時(shí)候會(huì)暴露自己的IP地址,就像打電話(huà)給別人一樣,我們的電話(huà)號(hào)碼也會(huì)暴露給了對(duì)方。如果頻繁地向?qū)Ψ揭恢贝蛘泻?,就容易被?duì)方視作垃圾號(hào)碼一樣拉黑

這就跟被人標(biāo)記成垃圾號(hào)碼一樣被對(duì)方封了,這個(gè)是封IP;現(xiàn)在很多人會(huì)用虛擬號(hào)碼去頻繁地打電話(huà)給別人,哪怕別人拉黑了這個(gè)號(hào)碼,也拉黑不了下一個(gè)。因?yàn)槊看未虺鋈サ奶?hào)碼都是新的虛擬的號(hào)

做代理IP就像是給自己的電腦IP,包裝多個(gè)虛擬號(hào)碼一樣的外殼, 這樣可以保障自己在頻繁地訪問(wèn)一個(gè)網(wǎng)站的時(shí)候,不會(huì)輕易被拉黑了。

from selenium import webdriver

PROXY = "123.456.789.012:8080"  # 示例代理

options = webdriver.ChromeOptions()
options.add_argument(f'--proxy-server={PROXY}')
driver = webdriver.Chrome(options=options)

這個(gè)代理ip有付費(fèi)的網(wǎng)站,也有免費(fèi)的網(wǎng)站,如果有需要,后期我會(huì)再整理各類(lèi)的網(wǎng)站出來(lái)

3. 禁用自動(dòng)化特征

有時(shí)候爬取的時(shí)候,會(huì)顯示這樣一行字,下面的方法是可以取消這行字的顯示,將瀏覽器包裝成非自動(dòng)化測(cè)試的外殼。

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

4. selenium上構(gòu)造安全頭header

請(qǐng)求頭把自己的瀏覽器信息發(fā)送給對(duì)方服務(wù)器,有點(diǎn)像是給對(duì)方服務(wù)器遞了個(gè)名片過(guò)去。

單一的header頭,也會(huì)受到對(duì)方服務(wù)器的檢測(cè),有時(shí)候我們也可以有選擇地構(gòu)建安全頭內(nèi)容。

4.1 方法1:通過(guò) add_argument 設(shè)置基礎(chǔ) Headers(簡(jiǎn)單但有限)

適用于修改 User-Agent 等基礎(chǔ)頭信息:

from selenium import webdriver

options = 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)

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

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

動(dòng)態(tài)的header構(gòu)建,通過(guò) Chrome DevTools 的 Network.setExtraHTTPHeaders 方法,注入任意 Headers:

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = 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"
}

# 通過(guò) DevTools 注入 Headers
driver.execute_cdp_cmd("Network.enable", {})
driver.execute_cdp_cmd("Network.setExtraHTTPHeaders", {"headers": headers})

driver.get("https://example.com")

優(yōu)點(diǎn):支持所有自定義 Headers,適用于需要 Cookie、Referer 等復(fù)雜場(chǎng)景。

4.3 進(jìn)階的header頭:使用undetected-chromedriver來(lái)構(gòu)建

反爬會(huì)對(duì)部分網(wǎng)站會(huì)檢測(cè) Sec- 開(kāi)頭的安全頭(如 Sec-Ch-Ua),需用 undetected-chromedriver 規(guī)避。

5.模擬鼠標(biāo)移動(dòng)與點(diǎn)擊

我們?cè)邳c(diǎn)擊網(wǎng)頁(yè)后,如果有一些交互的按鈕,例如要移動(dòng)到某個(gè)位置再點(diǎn)擊之類(lèi)的,我們可能會(huì)用find_element 定位元素再進(jìn)行點(diǎn)擊,

但是如果在防檢測(cè)比較嚴(yán)格的情況下,例如對(duì)方瀏覽器對(duì)鼠標(biāo)進(jìn)行監(jiān)控計(jì)算,會(huì)監(jiān)測(cè)用戶(hù)是鼠標(biāo)是不是在移動(dòng),如果是上面的方法,這種就沒(méi)法做到,這時(shí)候可以用到ActionChains來(lái)處理:

from selenium.webdriver.common.action_chains import ActionChains
import random
import time

element = driver.find_element_by_id("some-id")

# 模擬人類(lèi)移動(dòng)鼠標(biāo)
actions = ActionChains(driver)
actions.move_to_element(element).perform()

# 添加隨機(jī)延遲
time.sleep(random.uniform(0.5, 2.5))

# 模擬人類(lèi)點(diǎn)擊(先移動(dòng)再點(diǎn)擊)
actions.click(element).perform()

但是這種方法會(huì)一直占用鼠標(biāo)的使用的,導(dǎo)致我們爬蟲(chóng)之余沒(méi)法做其他的事情,處于下策,能不用就盡量不用。

6.模擬鼠標(biāo)滾動(dòng)的行為

我們?cè)跒g覽頁(yè)面的時(shí)候,會(huì)有滾動(dòng)鼠標(biāo),看下滑的頁(yè)面,下滑不是一直滑,而是會(huì)停一會(huì),再下拉頁(yè)面一會(huì)

即模擬人的人眼在看到頁(yè)面后的反應(yīng),腦子會(huì)對(duì)眼球的視覺(jué)信息做處理,停留思考一會(huì),這時(shí)候會(huì)有一個(gè)間隔的空隙,

這個(gè)空隙可以用隨機(jī)休眠的方法處理:

import random

# 隨機(jī)滾動(dòng)頁(yè)面
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模擬滾動(dòng)鼠標(biāo)的操作
    time.sleep(scroll_pause_time) #間隔休眠的時(shí)間

7.模擬瀏覽頁(yè)面時(shí),停留一些時(shí)間

人在瀏覽網(wǎng)頁(yè)的時(shí)候,不會(huì)一直都無(wú)停留地一直切換不同的瀏覽器的網(wǎng)頁(yè),我們?cè)诓煌木W(wǎng)頁(yè)間切換,要隨機(jī)增加一些睡眠,原理同上

import random

# 不同頁(yè)面間的隨機(jī)等待
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. 模擬在輸入框里輸入文字的行為

在模擬人在手敲鍵盤(pán)的時(shí)候,模擬一個(gè)字一個(gè)字得打出來(lái),

這個(gè)一字一頓,得用到字與字輸出的休眠

這種方法的實(shí)現(xiàn)是for循環(huán)里打出一堆字的時(shí)候,在每個(gè)字之間增加隨機(jī)的休眠,如:

from selenium.webdriver.common.keys import Keys

text_field = driver.find_element_by_id("search-box")

# 模擬人類(lèi)打字速度
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))  # 隨機(jī)輸入間隔
    
# 隨機(jī)等待后按回車(chē)
time.sleep(random.uniform(0.5, 1.5))
text_field.send_keys(Keys.RETURN)

9. 模擬人類(lèi)錯(cuò)誤與糾正

我們?cè)诖蜃值臅r(shí)候,有時(shí)候會(huì)寫(xiě)錯(cuò)字,需要?jiǎng)h除內(nèi)容,然后再重新輸入

這個(gè)模擬寫(xiě)錯(cuò)又糾錯(cuò)的過(guò)程,如下:

# 模擬輸入錯(cuò)誤并糾正
search_box = driver.find_element_by_name("q")

# 故意輸入錯(cuò)誤
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))

# 輸入正確內(nèi)容
search_box.send_keys("correct term")

10. 標(biāo)簽頁(yè)與窗口行為模擬

如果爬取時(shí)間比較長(zhǎng)的話(huà),我們一直在一個(gè)標(biāo)簽頁(yè)的窗口上一直操作,也不太合理,要時(shí)不時(shí)打開(kāi)新的標(biāo)簽頁(yè),進(jìn)行處理

下面的方法是用概率來(lái)限制打開(kāi)標(biāo)簽頁(yè)的次數(shù):

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

11. 操作順序隨機(jī)化

一些可以點(diǎn)擊的元素,不要按順序一個(gè)個(gè)順著去點(diǎn),要調(diào)換順序,隨機(jī)去點(diǎn),例如:

寫(xiě)法:

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. 下載文件時(shí),模擬網(wǎng)絡(luò)條件限定速度

下載一些文件的時(shí)候,模擬網(wǎng)絡(luò)的狀態(tài),設(shè)置下載的速度,不要太快,或者太頻繁下載:

from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

???????caps = 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)

到此這篇關(guān)于Selenium模擬用戶(hù)進(jìn)行操作網(wǎng)頁(yè)的最全指南的文章就介紹到這了,更多相關(guān)Selenium操作網(wǎng)頁(yè)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • PyCharm?設(shè)置數(shù)據(jù)庫(kù),查詢(xún)數(shù)據(jù)庫(kù)語(yǔ)句方式

    PyCharm?設(shè)置數(shù)據(jù)庫(kù),查詢(xún)數(shù)據(jù)庫(kù)語(yǔ)句方式

    這篇文章主要介紹了PyCharm?設(shè)置數(shù)據(jù)庫(kù),查詢(xún)數(shù)據(jù)庫(kù)語(yǔ)句方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Python中使用format函數(shù)的小結(jié)

    Python中使用format函數(shù)的小結(jié)

    在Python中,format()函數(shù)是一種用于格式化字符串的方法主要介紹了Python中使用format函數(shù)的小結(jié),本文就來(lái)介紹一下format()函數(shù)的使用示例,感興趣的可以了解一下
    2023-08-08
  • python3學(xué)生名片管理v2.0版

    python3學(xué)生名片管理v2.0版

    這篇文章主要為大家詳細(xì)介紹了python3學(xué)生名片管理v2.0版,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • 詳解OpenCV圖像的概念和基本操作

    詳解OpenCV圖像的概念和基本操作

    opencv最主要的的功能是用于圖像處理,所以圖像的概念貫穿了整個(gè)opencv,與其相關(guān)的核心類(lèi)就是Mat。這篇文章主要介紹了OpenCV圖像的概念和基本操作,需要的朋友可以參考下
    2021-10-10
  • python實(shí)現(xiàn)串口通信的示例代碼

    python實(shí)現(xiàn)串口通信的示例代碼

    python實(shí)現(xiàn)串口通信是一件簡(jiǎn)單的事情,只要通過(guò)pyserial模塊就可以實(shí)現(xiàn),本文主要介紹了python實(shí)現(xiàn)串口通信的示例代碼,感興趣的可以了解一下
    2023-10-10
  • Python實(shí)現(xiàn)邊緣提取的示例代碼

    Python實(shí)現(xiàn)邊緣提取的示例代碼

    這篇文章主要為大家詳細(xì)介紹了Python計(jì)算機(jī)視覺(jué)中如何實(shí)現(xiàn)邊緣提取,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)有一定幫助,需要的可以參考一下
    2022-05-05
  • python如何運(yùn)行js語(yǔ)句

    python如何運(yùn)行js語(yǔ)句

    在本篇內(nèi)容里小編給大家整理的是一篇關(guān)于python如何運(yùn)行js語(yǔ)句的相關(guān)內(nèi)容,有興趣的朋友們可以參考下。
    2020-09-09
  • Python機(jī)器學(xué)習(xí)之使用Pyecharts制作可視化大屏

    Python機(jī)器學(xué)習(xí)之使用Pyecharts制作可視化大屏

    pyecharts是一個(gè)用于生成Echarts圖表的Python庫(kù),Echarts是百度開(kāi)源的一個(gè)數(shù)據(jù)可視化 JS 庫(kù),可以生成一些非常酷炫的圖表,這篇文章主要給大家介紹了關(guān)于Python機(jī)器學(xué)習(xí)之Pyecharts制作可視化大屏的相關(guān)資料,需要的朋友可以參考下
    2021-10-10
  • Python實(shí)現(xiàn)自動(dòng)化遷移Github倉(cāng)庫(kù)并保留所有歷史記錄

    Python實(shí)現(xiàn)自動(dòng)化遷移Github倉(cāng)庫(kù)并保留所有歷史記錄

    這篇文章主要為大家詳細(xì)介紹了如何使用Python實(shí)現(xiàn)自動(dòng)化遷移Github倉(cāng)庫(kù)并保留所有歷史記錄,文中的示例代碼簡(jiǎn)潔易懂,下面就跟隨小編一起了解下吧
    2025-10-10
  • python庫(kù)pydantic的入門(mén)簡(jiǎn)易教程

    python庫(kù)pydantic的入門(mén)簡(jiǎn)易教程

    本文主要介紹了python庫(kù)pydantic的入門(mén)簡(jiǎn)易教程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07

最新評(píng)論

富裕县| 河间市| 德昌县| 诸暨市| 龙岩市| 始兴县| 吉安县| 柳林县| 龙山县| 元江| 宾阳县| 陕西省| 大荔县| 雅安市| 昆山市| 康平县| 峨眉山市| 如皋市| 宜章县| 辽阳县| 石河子市| 福州市| 清流县| 苏州市| 惠安县| 房产| 上栗县| 合江县| 偏关县| 泊头市| 来安县| 顺义区| 土默特右旗| 水富县| 清流县| 永吉县| 祁连县| 广东省| 漳州市| 香港| 穆棱市|