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读写excel的方法
Nov 18 Python
Python中表示字符串的三种方法
Sep 06 Python
详解如何在python中读写和存储matlab的数据文件(*.mat)
Feb 24 Python
解决Mac安装scrapy失败的问题
Jun 13 Python
用Python从0开始实现一个中文拼音输入法的思路详解
Jul 20 Python
Pytorch Tensor 输出为txt和mat格式方式
Jan 03 Python
pytorch数据预处理错误的解决
Feb 20 Python
Python通过Pillow实现图片对比
Apr 29 Python
Python文件操作模拟用户登陆代码实例
Jun 09 Python
利用python对mysql表做全局模糊搜索并分页实例
Jul 12 Python
python压包的概念及实例详解
Feb 17 Python
Jupyter notebook 更改文件打开的默认路径操作
May 21 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
用ODBC的分页显示
2006/10/09 PHP
php5新改动之短标记启用方法
2008/09/11 PHP
PHP函数之error_reporting(E_ALL ^ E_NOTICE)详细说明
2011/07/01 PHP
PHP 面向对象程序设计(oop)学习笔记 (二) - 静态变量的属性和方法及延迟绑定
2014/06/12 PHP
php统计数组元素个数的方法
2015/07/02 PHP
在WordPress中使用wp_count_posts函数来统计文章数量
2016/01/05 PHP
List the Stored Procedures in a SQL Server database
2007/06/20 Javascript
动态添加js事件实现代码
2009/03/12 Javascript
HTML 自动伸缩的表格Table js实现
2009/04/01 Javascript
javascript设计模式 封装和信息隐藏(上)
2012/07/24 Javascript
A标签中通过href和onclick传递的this对象实现思路
2013/04/19 Javascript
javascript如何创建表格(javascript绘制表格的二种方法)
2013/12/10 Javascript
javascript实现随机生成DIV背景色
2016/06/20 Javascript
JS原型链怎么理解
2016/06/27 Javascript
第一次接触神奇的Bootstrap表单
2016/07/27 Javascript
jQuery 遍历map()方法详解
2016/11/04 Javascript
轻松理解Javascript变量的相关问题
2017/01/20 Javascript
React-Router如何进行页面权限管理的方法
2017/12/06 Javascript
JS同步、异步、延迟加载的方法
2018/05/05 Javascript
解决vue中post方式提交数据后台无法接收的问题
2018/08/11 Javascript
详解项目升级到vue-cli3的正确姿势
2019/01/28 Javascript
浅谈bootstrap layer.open中end的使用方法
2019/09/12 Javascript
Vue 中使用lodash对事件进行防抖和节流操作
2020/07/26 Javascript
node使用async_hooks模块进行请求追踪
2021/01/28 Javascript
[01:45]DOTA2新英雄“神谕者”全方位展示
2014/11/21 DOTA
Python实现比较两个列表(list)范围
2015/06/12 Python
python3.7.0的安装步骤
2018/08/27 Python
python多进程控制学习小结
2018/10/31 Python
python快排算法详解
2019/03/04 Python
Python实现FTP文件定时自动下载的步骤
2020/12/19 Python
CSS3弹性布局内容对齐(justify-content)属性使用详解
2017/07/31 HTML / CSS
客服专员岗位职责
2014/02/28 职场文书
2014年语文教师工作总结
2014/12/18 职场文书
七年级英语教学反思
2016/02/15 职场文书
2019年年中职场激励人心语录30条
2019/08/07 职场文书
低版本Druid连接池+MySQL驱动8.0导致线程阻塞、性能受限
2021/07/01 MySQL