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

