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

Python使用DrissionPage實(shí)現(xiàn)上傳文件的實(shí)戰(zhàn)指南

 更新時(shí)間:2026年01月09日 08:16:11   作者:detayun  
在自動(dòng)化測(cè)試和網(wǎng)頁爬蟲開發(fā)中,文件上傳是一個(gè)常見需求,本文將詳細(xì)介紹如何使用Python的DrissionPage庫實(shí)現(xiàn)高效穩(wě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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于Python實(shí)現(xiàn)簡(jiǎn)單的微信通知和預(yù)警

    基于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)示例

    這篇文章主要介紹了用Python獲取攝像頭并實(shí)時(shí)控制人臉的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • Python使用回溯法子集樹模板解決迷宮問題示例

    Python使用回溯法子集樹模板解決迷宮問題示例

    這篇文章主要介紹了Python使用回溯法解決迷宮問題,簡(jiǎn)單講述了迷宮問題的原理并結(jié)合實(shí)例形式分析了Python基于回溯法子集樹模板解決迷宮問題的相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2017-09-09
  • vscode+anaconda搭建python虛擬環(huán)境全攻略 (詳細(xì)圖文)

    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實(shí)現(xiàn)的解析crontab配置文件代碼,也可以說是python版的crontab,代碼中包含大量注釋,需要的朋友可以參考下
    2014-06-06
  • Python隊(duì)列Queue實(shí)現(xiàn)詳解

    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 selenium的基本使用方法分析

    Python selenium的基本使用方法分析

    這篇文章主要介紹了Python selenium的基本使用方法,結(jié)合實(shí)例形式分析了Python使用selenium模塊進(jìn)行web自動(dòng)化測(cè)試的基本模塊導(dǎo)入、操作技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2019-12-12
  • Python高效實(shí)現(xiàn)Excel轉(zhuǎn)TXT文本

    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?'bytes'的解決方法

    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
  • Python可迭代對(duì)象操作示例

    Python可迭代對(duì)象操作示例

    這篇文章主要介紹了Python可迭代對(duì)象操作,涉及Python列表生成式、迭代器、數(shù)據(jù)遍歷等相關(guān)操作技巧,需要的朋友可以參考下
    2019-05-05

最新評(píng)論

桐柏县| 郓城县| 沧州市| 蓝山县| 当阳市| 金门县| 沧州市| 焦作市| 遂川县| 札达县| 庄河市| 南城县| 沙洋县| 平昌县| 泾阳县| 盐津县| 武山县| 辽宁省| 钦州市| 宁陵县| 莒南县| 南靖县| 仪征市| 永济市| 尚义县| 鸡东县| 柞水县| 大冶市| 富锦市| 长寿区| 鞍山市| 桂阳县| 合作市| 孙吴县| 饶平县| 阿城市| 德格县| 偏关县| 上饶市| 雷州市| 云南省|