Python使用DrissionPage實(shí)現(xiàn)上傳文件的實(shí)戰(zhàn)指南
在自動(dòng)化測(cè)試和網(wǎng)頁爬蟲開發(fā)中,文件上傳是一個(gè)常見需求。本文將詳細(xì)介紹如何使用Python的DrissionPage庫實(shí)現(xiàn)高效穩(wěn)定的文件上傳操作,涵蓋基礎(chǔ)原理、核心方法和實(shí)戰(zhàn)案例。
一、DrissionPage上傳文件的核心原理
DrissionPage是一個(gè)基于Selenium和Requests的混合驅(qū)動(dòng)庫,它簡(jiǎn)化了瀏覽器自動(dòng)化操作。網(wǎng)頁中的文件上傳通常通過兩種方式實(shí)現(xiàn):
- 直接操作隱藏的input元素:大多數(shù)網(wǎng)頁使用
<input type="file">元素實(shí)現(xiàn)上傳功能,即使前端用美觀的按鈕覆蓋,底層仍依賴該元素。 - 處理JavaScript動(dòng)態(tài)生成的上傳組件:部分復(fù)雜網(wǎng)頁使用JS動(dòng)態(tài)創(chuàng)建上傳控件,需要特殊處理。
二、基礎(chǔ)文件上傳實(shí)現(xiàn)
1. 最簡(jiǎn)上傳示例
from DrissionPage import ChromiumPage
# 初始化瀏覽器
page = ChromiumPage()
page.get('https://example.com/upload') # 替換為實(shí)際上傳頁面
# 直接定位file input并上傳
file_input = page.e('input[type="file"]') # CSS選擇器
file_input.send_keys(r'C:\test\sample.jpg') # 發(fā)送文件路徑
2. 完整流程封裝
def upload_file(page, url, file_path):
"""
通用文件上傳函數(shù)
:param page: DrissionPage對(duì)象
:param url: 上傳頁面URL
:param file_path: 本地文件路徑
:return: 是否上傳成功
"""
try:
page.get(url)
# 等待上傳元素加載(顯式等待更可靠)
upload_input = page.wait('@input[type="file"]', timeout=10)
upload_input.send_keys(file_path)
return True
except Exception as e:
print(f"上傳失敗: {str(e)}")
return False
三、實(shí)戰(zhàn)案例:批量上傳圖片并處理結(jié)果
以下是一個(gè)完整的實(shí)戰(zhàn)案例,實(shí)現(xiàn)批量上傳圖片到百度AI平臺(tái)并處理識(shí)別結(jié)果:
import os
import re
import time
import random
from DrissionPage import ChromiumPage
# 配置參數(shù)
TARGET_DIR = r'G:\驗(yàn)證碼項(xiàng)目\抖音九宮格語義點(diǎn)選驗(yàn)證碼\圖片\temp改名文件夾/'
SOURCE_DIR = r'G:\驗(yàn)證碼項(xiàng)目\抖音九宮格語義點(diǎn)選驗(yàn)證碼\圖片\3裁剪后的圖片\'
UPLOAD_URL = 'https://chat.baidu.com/search'
def process_images():
# 初始化瀏覽器
page = ChromiumPage()
# 確保目標(biāo)目錄存在
os.makedirs(TARGET_DIR, exist_ok=True)
# 獲取所有圖片
image_files = [f for f in os.listdir(SOURCE_DIR) if f.lower().endswith(('.jpg', '.png'))]
for img_name in image_files:
img_path = os.path.join(SOURCE_DIR, img_name)
try:
# 上傳流程
page.get(UPLOAD_URL)
# 點(diǎn)擊上傳按鈕(根據(jù)實(shí)際頁面結(jié)構(gòu)調(diào)整)
upload_btn = page.ele('xpath://div[contains(@class,"upload-btn")]')
upload_btn.click()
# 操作隱藏的file input
file_input = page.ele('input[type="file"]')
file_input.send_keys(img_path)
# 填寫表單(示例)
textarea = page.ele('textarea[id="chat-textarea"]')
textarea.input("請(qǐng)識(shí)別圖片中的內(nèi)容,用【】標(biāo)注結(jié)果")
# 提交
submit_btn = page.ele('img[class*="submit-button"]')
submit_btn.click()
# 等待結(jié)果(根據(jù)實(shí)際頁面調(diào)整等待條件)
time.sleep(5)
# 提取識(shí)別結(jié)果
result_div = page.ele('div[class*="marklang"]')
result_text = result_div.text
print(f"識(shí)別結(jié)果: {result_text}")
# 解析結(jié)果
matches = re.findall(r'【(.*?)】', result_text)
if matches:
# 生成新文件名
new_name = f"{matches[0]}_{int(time.time()*1000)}_{random.randint(1000,9999)}.jpg"
new_path = os.path.join(TARGET_DIR, new_name)
# 移動(dòng)文件(先刪除已存在的同名文件)
if os.path.exists(new_path):
os.remove(new_path)
os.rename(img_path, new_path)
print(f"文件已重命名為: {new_name}")
except Exception as e:
print(f"處理圖片 {img_name} 時(shí)出錯(cuò): {str(e)}")
continue
if __name__ == '__main__':
process_images()
四、高級(jí)技巧與注意事項(xiàng)
1. 處理動(dòng)態(tài)加載的上傳組件
對(duì)于使用JavaScript動(dòng)態(tài)生成的上傳組件,可以嘗試:
# 方法1:先點(diǎn)擊觸發(fā)按鈕再操作input
trigger_btn = page.ele('button[data-action="upload"]')
trigger_btn.click()
file_input = page.ele('input[type="file"]') # 現(xiàn)在應(yīng)該可見
file_input.send_keys(file_path)
# 方法2:直接執(zhí)行JS觸發(fā)點(diǎn)擊
page.run_js('document.querySelector("input[type=file]").click()')
2. 多文件上傳
# 支持多選的上傳(需頁面允許)
file_input = page.ele('input[type="file"][multiple]')
file_input.send_keys([
r'C:\test\file1.jpg',
r'C:\test\file2.png'
])
3. 等待策略優(yōu)化
# 更可靠的等待方式
from DrissionPage.common import Wait
# 等待元素出現(xiàn)(最多10秒)
upload_input = Wait(page).until(lambda p: p.ele('input[type="file"]'))
# 或者使用顯式等待
page.wait('@input[type="file"]', timeout=10)
4. 常見問題解決
文件路徑問題:
- 始終使用絕對(duì)路徑
- Windows路徑使用原始字符串(前綴
r)或雙反斜杠
元素定位失敗:
- 檢查元素是否在iframe中(需要先切換)
- 確認(rèn)頁面是否完全加載
- 嘗試多種定位方式(CSS/XPath)
瀏覽器兼容性:
- 確保ChromeDriver版本與瀏覽器匹配
- 考慮使用無頭模式(
options.set_headless())
五、性能優(yōu)化建議
- 復(fù)用瀏覽器實(shí)例:避免頻繁啟動(dòng)關(guān)閉瀏覽器
- 并行處理:使用多線程/多進(jìn)程處理大量文件
- 異常重試機(jī)制:對(duì)失敗操作自動(dòng)重試
- 日志記錄:詳細(xì)記錄上傳過程和結(jié)果
六、總結(jié)
DrissionPage提供了簡(jiǎn)潔高效的文件上傳實(shí)現(xiàn)方式,通過直接操作隱藏的<input type="file">元素,可以繞過復(fù)雜的前端交互邏輯。掌握本文介紹的核心方法和實(shí)戰(zhàn)技巧后,您可以輕松實(shí)現(xiàn)各種文件上傳自動(dòng)化需求。
對(duì)于更復(fù)雜的場(chǎng)景,建議結(jié)合DrissionPage的等待機(jī)制、異常處理和JavaScript執(zhí)行能力,構(gòu)建健壯的自動(dòng)化流程。在實(shí)際項(xiàng)目中,還應(yīng)考慮添加進(jìn)度顯示、結(jié)果驗(yàn)證和錯(cuò)誤恢復(fù)等功能,提升用戶體驗(yàn)和系統(tǒng)可靠性。
到此這篇關(guān)于Python使用DrissionPage實(shí)現(xiàn)上傳文件的實(shí)戰(zhàn)指南的文章就介紹到這了,更多相關(guān)Python DrissionPage上傳文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 淺析Python如何使用DrissionPage輕松玩轉(zhuǎn)動(dòng)態(tài)網(wǎng)頁
- 使用Python的DrissionPage庫設(shè)置代理IP的詳細(xì)流程
- Python使用DrissionPage實(shí)現(xiàn)數(shù)據(jù)分析工具
- Python使用DrissionPage中ChromiumPage進(jìn)行自動(dòng)化網(wǎng)頁操作
- Python使用DrissionPage實(shí)現(xiàn)網(wǎng)頁自動(dòng)化采集
- Python中DrissionPage的示例代碼
- python使用DrissionPage庫進(jìn)行網(wǎng)頁自動(dòng)化操作和數(shù)據(jù)提取
- 基于Python的網(wǎng)頁自動(dòng)化工具DrissionPage的使用詳解
相關(guān)文章
基于Python實(shí)現(xiàn)簡(jiǎn)單的微信通知和預(yù)警
這篇文章主要為大家詳細(xì)介紹了如何基于Python實(shí)現(xiàn)簡(jiǎn)單的微信通知和預(yù)警功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-12-12
用Python獲取攝像頭并實(shí)時(shí)控制人臉的實(shí)現(xiàn)示例
這篇文章主要介紹了用Python獲取攝像頭并實(shí)時(shí)控制人臉的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
vscode+anaconda搭建python虛擬環(huán)境全攻略 (詳細(xì)圖文)
本文詳細(xì)介紹用VSCode和Anaconda配置Python運(yùn)行環(huán)境的方法,先是講解 Anaconda的下載、安裝步驟,如勾選關(guān)鍵安裝選項(xiàng),創(chuàng)建并激活虛擬環(huán)境,接著說明VSCode的安裝過程,以及在其中安裝Python 擴(kuò)展、選定Anaconda環(huán)境解釋器的操作,最終通過運(yùn)行“Hello, World!”測(cè)試環(huán)境2026-02-02
python實(shí)現(xiàn)的解析crontab配置文件代碼
這篇文章主要介紹了python實(shí)現(xiàn)的解析crontab配置文件代碼,也可以說是python版的crontab,代碼中包含大量注釋,需要的朋友可以參考下2014-06-06
Python隊(duì)列Queue實(shí)現(xiàn)詳解
這篇文章主要介紹了Python隊(duì)列Queue實(shí)現(xiàn)詳解,隊(duì)列是一種列表,隊(duì)列用于存儲(chǔ)按順序排列的數(shù)據(jù),隊(duì)列是一種先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),不同的是隊(duì)列只能在隊(duì)尾插入元素,在隊(duì)首刪除元素,需要的朋友可以參考下2023-07-07
Python高效實(shí)現(xiàn)Excel轉(zhuǎn)TXT文本
在數(shù)據(jù)處理場(chǎng)景中,將Excel文件轉(zhuǎn)換為純文本(TXT)格式便成為了一個(gè)常見的需求,本文將解析如何通過?Spire.XLS?for?Python?實(shí)現(xiàn)?Excel?到TXT?的高效轉(zhuǎn)換,有需要的可以了解下2026-01-01
Pycharm報(bào)錯(cuò):'NoneType'?object?has?no?attribute?
這篇文章主要給大家介紹了關(guān)于Pycharm報(bào)錯(cuò):'NoneType'?object?has?no?attribute?'bytes'的解決方法,文中通過圖文將解決的方法介紹的非常詳細(xì),需要的朋友可以參考下2022-02-02

