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动态参数用法实例分析
May 25 Python
全面解析Python的While循环语句的使用方法
Oct 13 Python
Python字符编码判断方法分析
Jul 01 Python
requests和lxml实现爬虫的方法
Jun 11 Python
Python3实现定时任务的四种方式
Jun 03 Python
利用PyCharm操作Github(仓库新建、更新,代码回滚)
Dec 18 Python
python 浅谈serial与stm32通信的编码问题
Dec 18 Python
Python使用扩展库pywin32实现批量文档打印实例
Apr 09 Python
如何提高python 中for循环的效率
Apr 15 Python
PyTorch中torch.tensor与torch.Tensor的区别详解
May 18 Python
python实现代码审查自动回复消息
Feb 01 Python
python中使用asyncio实现异步IO实例分析
Feb 26 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+SQL 注入攻击的技术实现以及预防办法
2011/01/27 PHP
洪恩在线成语词典小偷程序php版
2012/04/20 PHP
PHP中几种常见的超时处理全面总结
2012/09/11 PHP
PHP与Web页面的交互示例详解一
2020/08/04 PHP
关于 byval 与 byref 的区别分析总结
2007/10/08 Javascript
jquery 选择器引擎sizzle浅析
2013/02/06 Javascript
Javascript 按位左移运算符使用介绍(
2014/02/04 Javascript
jQuery设置和移除文本框默认值的方法
2015/03/09 Javascript
在Ubuntu系统上安装Ghost博客平台的教程
2015/06/17 Javascript
不依赖Flash和任何JS库实现文本复制与剪切附源码下载
2015/10/09 Javascript
js实现页面跳转的五种方法推荐
2016/03/10 Javascript
JavaScript实现星星等级评价功能
2017/03/22 Javascript
详解如何在NodeJS项目中优雅的使用ES6
2017/04/22 NodeJs
vue中前进刷新、后退缓存用户浏览数据和浏览位置的实例讲解
2018/09/21 Javascript
JSON字符串操作移除空串更改key/value的介绍
2019/01/05 Javascript
vue表单验证你真的会了吗?vue表单验证(form)validate
2019/04/07 Javascript
微信小程序实现点击导航条切换页面
2020/11/19 Javascript
用map函数来完成Python并行任务的简单示例
2015/04/02 Python
pygame学习笔记(5):游戏精灵
2015/04/15 Python
简述:我为什么选择Python而不是Matlab和R语言
2017/11/14 Python
python执行系统命令后获取返回值的几种方式集合
2018/05/12 Python
python 返回列表中某个值的索引方法
2018/11/07 Python
python之当你发现QTimer不能用时的解决方法
2019/06/21 Python
html5本地存储_动力节点Java学院整理
2017/07/12 HTML / CSS
一家专门做特卖的网站:唯品会
2016/10/09 全球购物
招聘单位介绍信
2014/01/14 职场文书
母婴店促销方案
2014/03/05 职场文书
农民工工资发放承诺书
2014/03/31 职场文书
企业文化标语大全
2014/06/10 职场文书
文明好少年事迹材料
2014/08/19 职场文书
群众路线批评与自我批评发言稿
2014/10/16 职场文书
教师工作决心书
2015/02/04 职场文书
2015年工会工作总结范文
2015/07/23 职场文书
2016年“抗战胜利纪念日”71周年校园广播稿
2015/12/18 职场文书
详解Django中 render() 函数的使用方法
2021/04/22 Python
hive数据仓库新增字段方法
2022/06/25 数据库