杨宏远 發表於 2026-1-9 08:16:11

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

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">一、DrissionPage上传文件的核心原理</a></li><li><a href="#_label1">二、基础文件上传实现</a></li><ul class="second_class_ul"><li><a href="#_lab2_1_0">1. 最简上传示例</a></li><li><a href="#_lab2_1_1">2. 完整流程封装</a></li></ul><li><a href="#_label2">三、实战案例:批量上传图片并处理结果</a></li><ul class="second_class_ul"></ul><li><a href="#_label3">四、高级技巧与注意事项</a></li><ul class="second_class_ul"><li><a href="#_lab2_3_2">1. 处理动态加载的上传组件</a></li><li><a href="#_lab2_3_3">2. 多文件上传</a></li><li><a href="#_lab2_3_4">3. 等待策略优化</a></li><li><a href="#_lab2_3_5">4. 常见问题解决</a></li></ul><li><a href="#_label4">五、性能优化建议</a></li><ul class="second_class_ul"></ul><li><a href="#_label5">六、总结</a></li><ul class="second_class_ul"></ul></ul></div><p>在自动化测试和网页爬虫开发中,文件上传是一个常见需求。本文将详细介绍如何使用Python的DrissionPage库实现高效稳定的文件上传操作,涵盖基础原理、核心方法和实战案例。</p>
<p class="maodian"><a name="_label0"></a></p><h2>一、DrissionPage上传文件的核心原理</h2>
<p>DrissionPage是一个基于Selenium和Requests的混合驱动库,它简化了浏览器自动化操作。网页中的文件上传通常通过两种方式实现:</p>
<ul><li><strong>直接操作隐藏的input元素:</strong>大多数网页使用<code>&lt;input type=&quot;file&quot;&gt;</code>元素实现上传功能,即使前端用美观的按钮覆盖,底层仍依赖该元素。</li><li><strong>处理JavaScript动态生成的上传组件:</strong>部分复杂网页使用JS动态创建上传控件,需要特殊处理。</li></ul>
<p class="maodian"><a name="_label1"></a></p><h2>二、基础文件上传实现</h2>
<p class="maodian"><a name="_lab2_1_0"></a></p><h3>1. 最简上传示例</h3>
<div class="jb51code"><pre class="brush:py;">from DrissionPage import ChromiumPage

# 初始化浏览器
page = ChromiumPage()
page.get('https://example.com/upload')# 替换为实际上传页面

# 直接定位file input并上传
file_input = page.e('input')# CSS选择器
file_input.send_keys(r'C:\test\sample.jpg')# 发送文件路径
</pre></div>
<p class="maodian"><a name="_lab2_1_1"></a></p><h3>2. 完整流程封装</h3>
<div class="jb51code"><pre class="brush:py;">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', timeout=10)
      upload_input.send_keys(file_path)
      return True
    except Exception as e:
      print(f"上传失败: {str(e)}")
      return False
</pre></div>
<p class="maodian"><a name="_label2"></a></p><h2>三、实战案例:批量上传图片并处理结果</h2>
<p>以下是一个完整的实战案例,实现批量上传图片到百度AI平台并处理识别结果:</p>
<div class="jb51code"><pre class="brush:py;">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 =
   
    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')
            upload_btn.click()
            
            # 操作隐藏的file input
            file_input = page.ele('input')
            file_input.send_keys(img_path)
            
            # 填写表单(示例)
            textarea = page.ele('textarea')
            textarea.input("请识别图片中的内容,用【】标注结果")
            
            # 提交
            submit_btn = page.ele('img')
            submit_btn.click()
            
            # 等待结果(根据实际页面调整等待条件)
            time.sleep(5)
            
            # 提取识别结果
            result_div = page.ele('div')
            result_text = result_div.text
            print(f"识别结果: {result_text}")
            
            # 解析结果
            matches = re.findall(r'【(.*?)】', result_text)
            if matches:
                # 生成新文件名
                new_name = f"{matches}_{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()
</pre></div>
<p class="maodian"><a name="_label3"></a></p><h2>四、高级技巧与注意事项</h2>
<p class="maodian"><a name="_lab2_3_2"></a></p><h3>1. 处理动态加载的上传组件</h3>
<p>对于使用JavaScript动态生成的上传组件,可以尝试:</p>
<div class="jb51code"><pre class="brush:py;"># 方法1:先点击触发按钮再操作input
trigger_btn = page.ele('button')
trigger_btn.click()
file_input = page.ele('input')# 现在应该可见
file_input.send_keys(file_path)

# 方法2:直接执行JS触发点击
page.run_js('document.querySelector("input").click()')
</pre></div>
<p class="maodian"><a name="_lab2_3_3"></a></p><h3>2. 多文件上传</h3>
<div class="jb51code"><pre class="brush:py;"># 支持多选的上传(需页面允许)
file_input = page.ele('input')
file_input.send_keys([
    r'C:\test\file1.jpg',
    r'C:\test\file2.png'
])
</pre></div>
<p class="maodian"><a name="_lab2_3_4"></a></p><h3>3. 等待策略优化</h3>
<div class="jb51code"><pre class="brush:py;"># 更可靠的等待方式
from DrissionPage.common import Wait

# 等待元素出现(最多10秒)
upload_input = Wait(page).until(lambda p: p.ele('input'))

# 或者使用显式等待
page.wait('@input', timeout=10)
</pre></div>
<p class="maodian"><a name="_lab2_3_5"></a></p><h3>4. 常见问题解决</h3>
<p><strong>文件路径问题</strong>:</p>
<ul><li>始终使用绝对路径</li><li>Windows路径使用原始字符串(前缀<code>r</code>)或双反斜杠</li></ul>
<p><strong>元素定位失败</strong>:</p>
<ul><li>检查元素是否在iframe中(需要先切换)</li><li>确认页面是否完全加载</li><li>尝试多种定位方式(CSS/XPath)</li></ul>
<p><strong>浏览器兼容性</strong>:</p>
<ul><li>确保ChromeDriver版本与浏览器匹配</li><li>考虑使用无头模式(<code>options.set_headless()</code>)</li></ul>
<p class="maodian"><a name="_label4"></a></p><h2>五、性能优化建议</h2>
<ul><li><strong>复用浏览器实例</strong>:避免频繁启动关闭浏览器</li><li><strong>并行处理</strong>:使用多线程/多进程处理大量文件</li><li><strong>异常重试机制</strong>:对失败操作自动重试</li><li><strong>日志记录</strong>:详细记录上传过程和结果</li></ul>
<p class="maodian"><a name="_label5"></a></p><h2>六、总结</h2>
<p>DrissionPage提供了简洁高效的文件上传实现方式,通过直接操作隐藏的<code>&lt;input type=&quot;file&quot;&gt;</code>元素,可以绕过复杂的前端交互逻辑。掌握本文介绍的核心方法和实战技巧后,您可以轻松实现各种文件上传自动化需求。</p>
<p>对于更复杂的场景,建议结合DrissionPage的等待机制、异常处理和JavaScript执行能力,构建健壮的自动化流程。在实际项目中,还应考虑添加进度显示、结果验证和错误恢复等功能,提升用户体验和系统可靠性。</p>
頁: [1]
查看完整版本: Python使用DrissionPage实现上传文件的实战指南