Python使用DrissionPage实现上传文件的实战指南

 更新时间:2026年01月09日 08:16:11   作者:detayun  
在自动化测试和网页爬虫开发中,文件上传是一个常见需求,本文将详细介绍如何使用Python的DrissionPage库实现高效稳定的文件上传操作,有需要的可以了解下

在自动化测试和网页爬虫开发中,文件上传是一个常见需求。本文将详细介绍如何使用Python的DrissionPage库实现高效稳定的文件上传操作,涵盖基础原理、核心方法和实战案例。

一、DrissionPage上传文件的核心原理

DrissionPage是一个基于Selenium和Requests的混合驱动库,它简化了浏览器自动化操作。网页中的文件上传通常通过两种方式实现:

  • 直接操作隐藏的input元素:大多数网页使用<input type="file">元素实现上传功能,即使前端用美观的按钮覆盖,底层仍依赖该元素。
  • 处理JavaScript动态生成的上传组件:部分复杂网页使用JS动态创建上传控件,需要特殊处理。

二、基础文件上传实现

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')  # 发送文件路径

2. 完整流程封装

def upload_file(page, url, file_path):
    """
    通用文件上传函数
    :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

三、实战案例:批量上传图片并处理结果

以下是一个完整的实战案例,实现批量上传图片到百度AI平台并处理识别结果:

import os
import re
import time
import random
from DrissionPage import ChromiumPage

# 配置参数
TARGET_DIR = r'G:\验证码项目\抖音九宫格语义点选验证码\图片\temp改名文件夹/'
SOURCE_DIR = r'G:\验证码项目\抖音九宫格语义点选验证码\图片\3裁剪后的图片\'
UPLOAD_URL = 'https://chat.baidu.com/search'

def process_images():
    # 初始化浏览器
    page = ChromiumPage()
    
    # 确保目标目录存在
    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)
            
            # 点击上传按钮(根据实际页面结构调整)
            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("请识别图片中的内容,用【】标注结果")
            
            # 提交
            submit_btn = page.ele('img[class*="submit-button"]')
            submit_btn.click()
            
            # 等待结果(根据实际页面调整等待条件)
            time.sleep(5)
            
            # 提取识别结果
            result_div = page.ele('div[class*="marklang"]')
            result_text = result_div.text
            print(f"识别结果: {result_text}")
            
            # 解析结果
            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. 处理动态加载的上传组件

对于使用JavaScript动态生成的上传组件,可以尝试:

# 方法1:先点击触发按钮再操作input
trigger_btn = page.ele('button[data-action="upload"]')
trigger_btn.click()
file_input = page.ele('input[type="file"]')  # 现在应该可见
file_input.send_keys(file_path)

# 方法2:直接执行JS触发点击
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. 等待策略优化

# 更可靠的等待方式
from DrissionPage.common import Wait

# 等待元素出现(最多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()

五、性能优化建议

  • 复用浏览器实例:避免频繁启动关闭浏览器
  • 并行处理:使用多线程/多进程处理大量文件
  • 异常重试机制:对失败操作自动重试
  • 日志记录:详细记录上传过程和结果

六、总结

DrissionPage提供了简洁高效的文件上传实现方式,通过直接操作隐藏的<input type="file">元素,可以绕过复杂的前端交互逻辑。掌握本文介绍的核心方法和实战技巧后,您可以轻松实现各种文件上传自动化需求。

对于更复杂的场景,建议结合DrissionPage的等待机制、异常处理和JavaScript执行能力,构建健壮的自动化流程。在实际项目中,还应考虑添加进度显示、结果验证和错误恢复等功能,提升用户体验和系统可靠性。

到此这篇关于Python使用DrissionPage实现上传文件的实战指南的文章就介绍到这了,更多相关Python DrissionPage上传文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解析Python中的eval()、exec()及其相关函数

    解析Python中的eval()、exec()及其相关函数

    本篇文章主要介绍了解析Python中的eval()、exec()及其相关函数,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • 利用4行Python代码监测每一行程序的运行时间和空间消耗

    利用4行Python代码监测每一行程序的运行时间和空间消耗

    这篇文章主要介绍了如何使用4行Python代码监测每一行程序的运行时间和空间消耗,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • python基础之爬虫入门

    python基础之爬虫入门

    这篇文章主要介绍了python基础之爬虫入门,文中有非常详细的代码示例,对正在学习python爬虫的小伙伴们有很好地帮助哟,需要的朋友可以参考下
    2021-05-05
  • Python高效解析大型XML文件的方法详解

    Python高效解析大型XML文件的方法详解

    XML作为数据交换和存储的主流格式,在数据处理领域应用广泛,本文将深入探讨Python中增量解析大型XML文件的各种方法,技术原理和最佳实践,希望对大家有所帮助
    2025-09-09
  • Python 忽略warning的输出方法

    Python 忽略warning的输出方法

    今天小编就为大家分享一篇Python 忽略warning的输出方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10
  • Django使用详解:ORM 的反向查找(related_name)

    Django使用详解:ORM 的反向查找(related_name)

    今天小编就为大家分享一篇Django使用详解:ORM 的反向查找(related_name),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • python使用os.listdir和os.walk获得文件的路径的方法

    python使用os.listdir和os.walk获得文件的路径的方法

    本篇文章主要介绍了python使用os.listdir和os.walk获得文件的路径的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • 基于python实现自动化文件移动工具

    基于python实现自动化文件移动工具

    在现代办公和数据处理环境中,文件的频繁迁移和整理是一项常见且耗时的任务,本文将详细介绍一个基于Python的自动化文件迁移工具,可以实时监控指定文件夹,需要的可以了解下
    2025-07-07
  • Anaconda安装配置Jupyter最新版的图文步骤

    Anaconda安装配置Jupyter最新版的图文步骤

    本文详细介绍了在本地环境中使用Anaconda安装和配置Jupyter Notebook的过程,具有一定的参考价值,感兴趣的可以了解一下
    2025-03-03
  • CentOS 7下Python 2.7升级至Python3.6.1的实战教程

    CentOS 7下Python 2.7升级至Python3.6.1的实战教程

    Centos是目前最为流行的Linux服务器系统,其默认的Python 2.x,这篇文章主要给大家分享了关于在CentOS 7下Python 2.7升级至Python3.6.1的实战教程,文中将升级的步骤一步步的介绍的非常详细,对大家的理解和学习具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-07-07

最新评论