当前位置: 首页 > news >正文

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

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

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

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

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

二、基础文件上传实现

1. 最简上传示例

1

2

3

4

5

6

7

8

9

fromDrissionPageimportChromiumPage

# 初始化浏览器

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. 完整流程封装

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

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

returnTrue

exceptException as e:

print(f"上传失败: {str(e)}")

returnFalse

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

importos

importre

importtime

importrandom

fromDrissionPageimportChromiumPage

# 配置参数

TARGET_DIR=r'G:\验证码项目\抖音九宫格语义点选验证码\图片\temp改名文件夹/'

SOURCE_DIR=r'G:\验证码项目\抖音九宫格语义点选验证码\图片\3裁剪后的图片\'

UPLOAD_URL='https://chat.baidu.com/search'

defprocess_images():

# 初始化浏览器

page=ChromiumPage()

# 确保目标目录存在

os.makedirs(TARGET_DIR, exist_ok=True)

# 获取所有图片

image_files=[fforfinos.listdir(SOURCE_DIR)iff.lower().endswith(('.jpg','.png'))]

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

ifmatches:

# 生成新文件名

new_name=f"{matches[0]}_{int(time.time()*1000)}_{random.randint(1000,9999)}.jpg"

new_path=os.path.join(TARGET_DIR, new_name)

# 移动文件(先删除已存在的同名文件)

ifos.path.exists(new_path):

os.remove(new_path)

os.rename(img_path, new_path)

print(f"文件已重命名为: {new_name}")

exceptException as e:

print(f"处理图片 {img_name} 时出错: {str(e)}")

continue

if__name__=='__main__':

process_images()

四、高级技巧与注意事项

1. 处理动态加载的上传组件

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

1

2

3

4

5

6

7

8

# 方法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. 多文件上传

1

2

3

4

5

6

# 支持多选的上传(需页面允许)

file_input=page.ele('input[type="file"][multiple]')

file_input.send_keys([

r'C:\test\file1.jpg',

r'C:\test\file2.png'

])

3. 等待策略优化

1

2

3

4

5

6

7

8

# 更可靠的等待方式

fromDrissionPage.commonimportWait

# 等待元素出现(最多10秒)

upload_input=Wait(page).until(lambdap: 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执行能力,构建健壮的自动化流程。在实际项目中,还应考虑添加进度显示、结果验证和错误恢复等功能,提升用户体验和系统可靠性。

http://www.jsqmd.com/news/742461/

相关文章:

  • 2026年游戏行业IDC托管服务优质服务商推荐指南:算力租赁公司、算力租赁收费、算力租赁费用、GPU算力租用、服务器托管商选择指南 - 优质品牌商家
  • exa-search:基于exa的现代化终端文件搜索工具
  • 深入解析zfoo:高性能Java游戏服务器框架的设计与实践
  • 从QGIS预览到代码解析:一份给GIS新手的GDAL操作GDB文件实战指南
  • 初创公司如何借助 Taotoken 实现敏捷的 AI 能力集成与成本控制
  • 3个核心技巧:使用AKShare快速构建金融数据分析工作流
  • 2026激光水幕音乐喷泉厂家排行:激光水幕设计施工、激光水幕音乐喷泉厂家、重庆音乐喷泉厂家、音乐喷泉安装、音乐喷泉施工选择指南 - 优质品牌商家
  • AI辅助开发新体验:让快马平台为黑科网大事记注入智能推荐与摘要功能
  • 2026Q2可俪塑技术解析:热玛吉丽可缇/热立塑可丽塑/可俪塑减肥美容仪器/可俪塑局部溶脂美容设备/可俪塑无创溶脂美容设备/选择指南 - 优质品牌商家
  • 视觉Transformer(ViT)原理与NVIDIA TAO部署实践
  • 告别WebService依赖:用SAP Gateway和Python搭建轻量级RFC调用通道(SEGW实战)
  • 如何免费快速解锁网易云音乐NCM加密文件:终极ncmdump使用指南
  • 金舟电脑录音软件
  • 2026年4月江浙沪皖护栏源头厂家推荐,阳台护栏/锌钢护栏/江浙沪皖护栏/围墙护栏/楼梯护栏,江浙沪皖护栏源头厂家哪个好 - 品牌推荐师
  • 零样本图像方向与对称性识别技术解析与应用
  • 2026阆中消防维保公司技术指南:蓬安消防检测公司/西充消防检测公司电话/西充消防维保公司推荐/仪陇消防检测公司电话/选择指南 - 优质品牌商家
  • PotPlayer字幕实时翻译终极指南:免费实现外语视频双语字幕
  • ICode竞赛Python 5级通关秘籍:用函数让机器人走迷宫,手把手教你拆解20个关卡
  • AO3镜像站完整指南:如何快速访问全球最大同人创作平台
  • CoolProp热力学计算深度解析:R-134a参考状态差异的实用解决方案
  • SoundStorm:分层并行解码技术如何实现高质量语音的快速生成
  • VMware装RedHat 8.6踩坑实录:从移除无用硬件到网络配置,一篇讲清所有自定义细节
  • MuRF多分辨率融合技术在视觉基础模型中的应用
  • LeetCode 162.寻找峰值
  • CAPL脚本自动化进阶:如何动态生成带外部链接和配置信息的Vector测试报告?
  • ESP8266 AP模式避坑指南:手把手教你解决与App Inventor通信中的5个常见问题
  • 别再手动改了!EndNote文献类型缩写对照表(含M/J/D等)一键导入教程
  • WorkshopDL:3步解决跨平台游戏模组下载难题的技术方案
  • ARM ETMv4跟踪单元架构与调试技术详解
  • 可编程直流电源核心技术解析与应用实践