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批量下载图片的三种方法
Apr 22 Python
Python利用正则表达式匹配并截取指定子串及去重的方法
Jul 30 Python
Python实现的简单dns查询功能示例
May 24 Python
PyQt 线程类 QThread使用详解
Jul 16 Python
Python构建网页爬虫原理分析
Dec 19 Python
Python输出各行命令详解
Feb 01 Python
详解python的四种内置数据结构
Mar 19 Python
浅谈Python反射 & 单例模式
Mar 21 Python
python接口自动化(十六)--参数关联接口后传(详解)
Apr 16 Python
python接口调用已训练好的caffe模型测试分类方法
Aug 26 Python
python离线安装外部依赖包的实现
Feb 13 Python
详解Python中openpyxl模块基本用法
Feb 23 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
杏林同学录(四)
2006/10/09 PHP
PHP产生随机字符串函数
2006/12/06 PHP
利用浏览器的Javascript控制台调试PHP程序
2014/01/08 PHP
php多维数组去掉重复值示例分享
2014/03/02 PHP
PHP学习笔记(一):基本语法之标记、空白、和注释
2015/04/17 PHP
php json相关函数用法示例
2017/03/28 PHP
php使用curl伪造浏览器访问操作示例
2019/09/30 PHP
关于Blog顶部的滚动导航条代码
2006/09/25 Javascript
jquery $.ajax相关用法分享
2012/03/16 Javascript
基于JavaScript自定义构造函数的详解说明
2013/04/24 Javascript
JavaScript onkeypress事件入门实例(按下或按住一个键盘按键)
2014/10/17 Javascript
jQuery中:file选择器用法实例
2015/01/04 Javascript
浅析Nodejs npm常用命令
2016/06/14 NodeJs
js实现将json数组显示前台table中
2017/01/10 Javascript
微信小程序 使用canvas制作K线实例详解
2017/01/12 Javascript
将RGB值转换为灰度值的简单算法
2019/10/09 Javascript
在Python的setuptools框架下生成egg的教程
2015/04/13 Python
深入浅析ImageMagick命令执行漏洞
2016/10/11 Python
python使用fcntl模块实现程序加锁功能示例
2017/06/23 Python
Python装饰器的执行过程实例分析
2018/06/04 Python
Django框架实现逆向解析url的方法
2018/07/04 Python
详解python 注释、变量、类型
2018/08/10 Python
Python创建字典的八种方式
2019/02/27 Python
Python实现随机取一个矩阵数组的某几行
2019/11/26 Python
如何在django中运行scrapy框架
2020/04/22 Python
Python Opencv轮廓常用操作代码实例解析
2020/09/01 Python
芬兰汽车配件商店:Autonvaraosat24
2017/01/30 全球购物
宝拉珍选美国官网:Paula’s Choice美国
2018/01/07 全球购物
德尔福集团DELPHI的笔试题
2012/02/22 面试题
党组织公开承诺书
2014/03/29 职场文书
2015年机关纠风工作总结
2015/05/15 职场文书
golang中的空slice案例
2021/04/27 Golang
mongodb清除连接和日志的正确方法分享
2021/09/15 MongoDB
Netty分布式客户端处理接入事件handle源码解析
2022/03/25 Java/Android
Mongodb 迁移数据块的流程介绍分析
2022/04/18 MongoDB
python使用shell脚本创建kafka连接器
2022/04/29 Python