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

Written by

in

文章目录
  • DrissionPage是一个基于Selenium和Requests的混合驱动库,它简化了浏览器自动化操作。网页中的文件上传通常通过两种方式实现: 直接操作隐藏的input元素:大多数网页使用<input type="file">元素实现上传功能,即使前端用美观的按钮覆盖,底层仍依赖该元素。 处理JavaScript动态生成的上传组件:部分复杂网页使用JS动态创建上传控件,需要特殊处理。
  • 以下是一个完整的实战案例,实现批量上传图片到百度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()
  • 复用浏览器实例:避免频繁启动关闭浏览器 并行处理:使用多线程/多进程处理大量文件 异常重试机制:对失败操作自动重试 日志记录:详细记录上传过程和结果
  • DrissionPage提供了简洁高效的文件上传实现方式,通过直接操作隐藏的<input type="file">元素,可以绕过复杂的前端交互逻辑。掌握本文介绍的核心方法和实战技巧后,您可以轻松实现各种文件上传自动化需求。 对于更复杂的场景,建议结合DrissionPage的等待机制、异常处理和JavaScript执行能力,构建健壮的自动化流程。在实际项目中,还应考虑添加进度显示、结果验证和错误恢复等功能,提升用户体验和系统可靠性。 到此这篇关于Python使用DrissionPage实现上传文件的实战指南的文章就介绍到这了,更多相关Python DrissionPage上传文件内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客! 您可能感兴趣的文章: 浅析Python如何使用DrissionPage轻松玩转动态网页 使用Python的DrissionPage库设置代理IP的详细流程 Python使用DrissionPage实现数据分析工具 Python使用DrissionPage中ChromiumPage进行自动化网页操作 Python使用DrissionPage实现网页自动化采集 Python中DrissionPage的示例代码 python使用DrissionPage库进行网页自动化操作和数据提取 基于Python的网页自动化工具DrissionPage的使用详解
  • 目录
    • 一、DrissionPage上传文件的核心原理
    • 二、基础文件上传实现
      • 1. 最简上传示例
      • 2. 完整流程封装
    • 三、实战案例:批量上传图片并处理结果
      • 四、高级技巧与注意事项
        • 1. 处理动态加载的上传组件
        • 2. 多文件上传
        • 3. 等待策略优化
        • 4. 常见问题解决
      • 五、性能优化建议
        • 六、总结

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

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

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

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

          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()
          

          对于使用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()')
          

          # 支持多选的上传(需页面允许)
          file_input = page.ele('input[type="file"][multiple]')
          file_input.send_keys([
              r'C:testfile1.jpg',
              r'C:testfile2.png'
          ])
          

          # 更可靠的等待方式
          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)
          

          文件路径问题

          • 始终使用绝对路径
          • Windows路径使用原始字符串(前缀r)或双反斜杠

          元素定位失败

          • 检查元素是否在iframe中(需要先切换)
          • 确认页面是否完全加载
          • 尝试多种定位方式(CSS/XPath)

          浏览器兼容性

          • 确保ChromeDriver版本与浏览器匹配
          • 考虑使用无头模式(options.set_headless()

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

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

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

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

          您可能感兴趣的文章:

          • 浅析Python如何使用DrissionPage轻松玩转动态网页
          • 使用Python的DrissionPage库设置代理IP的详细流程
          • Python使用DrissionPage实现数据分析工具
          • Python使用DrissionPage中ChromiumPage进行自动化网页操作
          • Python使用DrissionPage实现网页自动化采集
          • Python中DrissionPage的示例代码
          • python使用DrissionPage库进行网页自动化操作和数据提取
          • 基于Python的网页自动化工具DrissionPage的使用详解

          站内搜索