python使用selenium实现批量文件下载


Posted in Python onMarch 11, 2019

背景

实现需求:批量下载联想某型号的全部驱动程序。

一般在做网络爬虫的时候,都是保存网页信息为主,或者下载单个文件。当涉及到多文件批量下载的时候,由于下载所需时间不定,下载的文件名不定,所以有一定的困难。

思路

参数配置

在涉及下载的时候,需要先对chromedriver进行参数配置,设定默认下载目录:

global base_path
profile = {
  'download.default_directory': base_path
}
chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option('prefs', profile)
driver = webdriver.Chrome(executable_path='../common/chromedriver', options=chrome_options)
driver.implicitly_wait(10)

页面分析

python使用selenium实现批量文件下载

联想官网上每个型号的驱动下载页面如上图所示,虽然前面有一个登陆的遮罩,但是实际上并不影响点击。需要注意的是:

驱动列表,需要点击才可以显示具体的下载项目表格,否则可以找到对应元素但无法获取正确的信息

driver_list.find_element_by_class_name('download-center_list_t_icon').click()

每个下载列表的表头建议做跳过处理

if sub_list.find_element_by_class_name('download-center_usblist_td01').text == '驱动名称':
  continue

下载处理

在页面中,找到“普通下载”的元素,点击即可下载。最终实现结果是我们希望根据网页的列表进行重命名和重新归档到文件夹,但是我们会发现如下几个问题:

  • 下载过来的文件名无法控制。
  • 依次下载的话,我们无法确认需要下载多久。并行下载的话,无法有效的区分重命名。

在网上找了很久,也没找到在下载时直接重命名的方法,所以最终选择依次下载,当每次下载完成后进行重命名和归档,思路如下:

  • 对每个驱动目录,先新建一个文件夹,如:主板
  • 点击下载后开始下载文件
  • 通过os模块,找到下载目录中所有文件,并按创建时间排序,找到最新创建的文件
  • 由于未完成的文件后缀为.crdownload(chrome),那么根据后缀来判断是否已完成下载,未完成的话继续等待

python使用selenium实现批量文件下载

待下载完成,将文件重命名并剪切到开始建立的归档目录。这里需要注意的是,有些文件名中不能存在/符号,否则会导致重命名失败,需要做一下替换。

在后期测试的时候,发现还有几个坑需要注意:

在查找最新创建的文件时,需要注意.DS_Store文件的处理。(Mac系统,Windows则需要考虑thumbs.db

需要判断一下最新创建的文件是否为文件夹,可以通过filter函数来处理

最新文件的排序查找实现如下:

def sort_file():
 # 排序文件
 dir_link = base_path
 dir_lists = list(filter(check_file, os.listdir(dir_link)))
 if len(dir_lists) == 0:
   return ''
 else:
   dir_lists.sort(key=lambda fn: os.path.getmtime(dir_link + os.sep + fn))
   return os.path.join(base_path, dir_lists[-1])


def check_file(filename):
 # 忽略系统文件
 if filename == '.DS_Store' or filename == 'thumbs.db':
   return False
 global base_path
 # 排除文件夹
 return os.path.isfile(os.path.join(base_path, filename))

总结

最终实现效果如下:

python使用selenium实现批量文件下载

完整代码参考:https://github.com/keejo125/web_scraping_and_data_analysis/tree/master/Lenovo

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python输出当前目录下index.html文件路径的方法
Apr 28 Python
Python数组遍历的简单实现方法小结
Apr 27 Python
python中WSGI是什么,Python应用WSGI详解
Nov 24 Python
pycharm设置注释颜色的方法
May 23 Python
python中的decorator的作用详解
Jul 26 Python
基于python中theano库的线性回归
Aug 31 Python
10 行Python 代码实现 AI 目标检测技术【推荐】
Jun 14 Python
Python利用pandas处理Excel数据的应用详解
Jun 18 Python
Python 寻找局部最高点的实现
Dec 05 Python
python几种常用功能实现代码实例
Dec 25 Python
tensorflow estimator 使用hook实现finetune方式
Jan 21 Python
PyTorch的Debug指南
May 07 Python
利用Python实现微信找房机器人实例教程
Mar 10 #Python
谈谈Python中的while循环语句
Mar 10 #Python
15行Python代码实现网易云热门歌单实例教程
Mar 10 #Python
Python如何爬取实时变化的WebSocket数据的方法
Mar 09 #Python
浅谈python的深浅拷贝以及fromkeys的用法
Mar 08 #Python
Python高级特性与几种函数的讲解
Mar 08 #Python
Python I/O与进程的详细讲解
Mar 08 #Python
You might like
如何使用PHP对网站验证码进行破解
2015/09/17 PHP
PHP 接入微信扫码支付总结(总结篇)
2016/11/03 PHP
PHP时间戳和日期相互转换操作实例小结
2018/12/18 PHP
php中目录操作opendir()、readdir()及scandir()用法示例
2019/06/08 PHP
Laravel 类和接口注入相关的代码
2019/10/15 PHP
Yii2框架中一些折磨人的坑
2019/12/15 PHP
jquery ready()的几种实现方法小结
2010/06/18 Javascript
jquery中使用循环下拉菜单示例代码
2014/09/24 Javascript
jQuery实现点击图片翻页展示效果的方法
2015/02/16 Javascript
使用AngularJS 应用访问 Android 手机的图片库
2015/03/24 Javascript
js正则表达式中exec用法实例
2015/07/23 Javascript
JavaScript实现的经典文件树菜单效果
2015/09/08 Javascript
利用JS提交表单的几种方法和验证(必看篇)
2016/09/17 Javascript
Node.js数据库操作之查询MySQL数据库(二)
2017/03/04 Javascript
Angular实现下载安装包的功能代码分享
2017/09/05 Javascript
vue 使用ref 让父组件调用子组件的方法
2018/02/08 Javascript
Vue2.0结合webuploader实现文件分片上传功能
2018/03/09 Javascript
微信小程序学习笔记之本地数据缓存功能详解
2019/03/29 Javascript
Vue2.X和Vue3.0数据响应原理变化的区别
2019/11/07 Javascript
vue+element-ui表格封装tag标签使用插槽
2020/06/18 Javascript
python中使用mysql数据库详细介绍
2015/03/27 Python
Python提取Linux内核源代码的目录结构实现方法
2016/06/24 Python
Python 快速实现CLI 应用程序的脚手架
2017/12/05 Python
python logging重复记录日志问题的解决方法
2018/07/12 Python
对python中基于tcp协议的通信(数据传输)实例讲解
2019/07/22 Python
python中的Elasticsearch操作汇总
2019/10/30 Python
丝绸和人造花卉、植物和树木:Nearly Natural
2018/11/28 全球购物
高中三年学习生活的自我评价
2013/10/10 职场文书
标准导师推荐信(医学类)
2013/10/28 职场文书
人事文员岗位职责
2014/02/16 职场文书
大学推普周活动总结
2015/05/07 职场文书
学校运动会感想
2015/08/10 职场文书
SqlServer: 如何更改表的文件组?(进而改变存储位置)
2021/04/05 SQL Server
浅谈JS的原型和原型链
2021/06/04 Javascript
一篇文章弄懂Python关键字、标识符和变量
2021/07/15 Python
Java无向树分析 实现最小高度树
2022/04/09 Javascript