python+selenium+chrome批量文件下载并自动创建文件夹实例


Posted in Python onApril 27, 2020

实现效果:通过url所绑定的关键名创建目录名,每次访问一个网页url后把文件下载下来

代码:

其中 data[i][0]、data[i][1] 是代表 关键词(文件保存目录)、网站链接(要下载文件的网站)

def getDriverHttp():
 for i in range(reCount):
  # 创建Chrome浏览器配置对象实例
  chromeOptions = webdriver.ChromeOptions()
  # 设定下载文件的保存目录为d盘的tudi目录,
  # 如果该目录不存在,将会自动创建
  prefs = {"download.default_directory": "e:\\tudi\\{0}".format(data[i][0]), "profile.default_content_setting_values.automatic_downloads":1}
  # 将自定义设置添加到Chrome配置对象实例中
  chromeOptions.add_experimental_option("prefs", prefs)
  # 启动带有自定义设置的Chrome浏览器
  # driver = webdriver.Chrome(executable_path="e:\\chromedriver", chrome_options=chromeOptions)
  driver = webdriver.Chrome(chrome_options=chromeOptions)
 
  driver.get(data[i][1])
 
  info2 = re.findall(r'<a href="#" rel="external nofollow" onclick="(.*?)" cssclass="xz_pic">', driver.page_source, re.S)
  print(len(info2))
  for js in info2:
   driver.execute_script(js)
 
def main():
 getDriverHttp()

注意:python 使用selenium下载文件时,chrome会提示是否下载多个文件(Download multiple files)

prefs = {"download.default_directory": "e:\\tudi\\{0}".format(data[i][0]), "profile.default_content_setting_values.automatic_downloads":1}

设置允许多个文件下载。

补充知识:python项目实现配置统一管理的操作

一个比较大的项目总是会涉及到很多的参数,最好的方法就是在一个地方统一管理这些参数。最近看了不少的python项目,总结了两种很有意思的配置管理方法。

第一种 基于easydict实现的配置管理

首先需要安装numpy、easydict以及yaml:

pip install numpy
pip install easydict
pip install yaml

就可以了。

然后定义配置类config.py:

import numpy as np
from easydict import EasyDict as edict
import yaml
 
# 创建dict
__C = edict()
cfg = __C
 
# 定义配置dict
__C.dev = edict()
__C.dev.name = 'dev-xingoo'
__C.dev.age = 20
 
__C.test = edict()
__C.test.name = 'test-xingoo'
__C.test.age = 30
 
# 内部方法,实现yaml配置文件到dict的合并
def _merge_a_into_b(a, b):
 """Merge config dictionary a into config dictionary b, clobbering the
 options in b whenever they are also specified in a.
 """
 if type(a) is not edict:
  return
 
 for k, v in a.items():
  # a must specify keys that are in b
  if k not in b:
   raise KeyError('{} is not a valid config key'.format(k))
 
  # the types must match, too
  old_type = type(b[k])
  if old_type is not type(v):
   if isinstance(b[k], np.ndarray):
    v = np.array(v, dtype=b[k].dtype)
   else:
    raise ValueError(('Type mismatch ({} vs. {}) '
        'for config key: {}').format(type(b[k]),
               type(v), k))
 
  # recursively merge dicts
  if type(v) is edict:
   try:
    _merge_a_into_b(a[k], b[k])
   except:
    print(('Error under config key: {}'.format(k)))
    raise
  else:
   b[k] = v
# 自动加载yaml文件
def cfg_from_file(filename):
 """Load a config file and merge it into the default options."""
 with open(filename, 'r', encoding='utf-8') as f:
  yaml_cfg = edict(yaml.load(f))
 
 _merge_a_into_b(yaml_cfg, __C)

使用的时候很简单,main.py:

from config import cfg_from_file
from config import cfg
 
cfg_from_file('config.yml')
print(cfg.dev.name)
print(cfg.test.name)

同级目录下创建配置文件config.yaml

dev:
name: xingoo-from-yml

输出:

xingoo-from-yml
test-xingoo

总结

这样的好处就是在任何的Python文件中只要from config import cfg就可以使用配置文件。

第二种 基于Class实现

这种基于普通的python对象实现的,创建config2.py:

class Config:
 def __init__(self):
  self.name = 'xingoo-config2'
  self.age = 100

使用的时候直接创建一个新的对象,如何python模块之间需要引用这个变量,那么需要把配置对象传过去:

import config2 as config2
 
cfg2 = config2.Config()
print(cfg2.name)
print(cfg2.age)

输出为:

xingoo-config2
100

总结

第二种方法简单粗暴...不过每次传递参数也是很蛋疼。还是喜欢第一种方式。

以上这篇python+selenium+chrome批量文件下载并自动创建文件夹实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
关于python的list相关知识(推荐)
Aug 30 Python
详解使用 pyenv 管理多个版本 python 环境
Oct 19 Python
解决已经安装requests,却依然提示No module named requests问题
May 18 Python
python3使用smtplib实现发送邮件功能
May 22 Python
Python Logging 日志记录入门学习
Jun 02 Python
python使用turtle库绘制时钟
Mar 25 Python
pandas分别写入excel的不同sheet方法
Dec 11 Python
使用Python opencv实现视频与图片的相互转换
Jul 08 Python
Python自定义聚合函数merge与transform区别详解
May 26 Python
如何教少儿学习Python编程
Jul 10 Python
Python 爬虫批量爬取网页图片保存到本地的实现代码
Dec 24 Python
matplotlib绘制正余弦曲线图的实现
Feb 22 Python
解决pycharm编辑区显示yaml文件层级结构遇中文乱码问题
Apr 27 #Python
Python使用Pyqt5实现简易浏览器(最新版本测试过)
Apr 27 #Python
python读取yaml文件后修改写入本地实例
Apr 27 #Python
基于SpringBoot构造器注入循环依赖及解决方式
Apr 26 #Python
Python判断字符串是否为空和null方法实例
Apr 26 #Python
如何将PySpark导入Python的放实现(2种)
Apr 26 #Python
基于python实现对文件进行切分行
Apr 26 #Python
You might like
php allow_url_include的应用和解释
2010/04/22 PHP
PHP性能优化工具篇Benchmark类调试执行时间
2011/12/06 PHP
php获取文件大小的方法
2014/02/26 PHP
PHP+JS实现大规模数据提交的方法
2015/07/02 PHP
PHP获取网页所有连接的方法(附demo源码下载)
2016/03/30 PHP
php自定义函数实现二维数组排序功能
2016/07/20 PHP
JavaScript使用过程中需要注意的地方和一些基本语法
2010/08/26 Javascript
一起来写段JS drag拖动代码
2010/12/09 Javascript
javascript类型转换使用方法
2014/02/08 Javascript
Bootstrap基本插件学习笔记之Alert警告框(20)
2016/12/08 Javascript
BootStrap便签页的简单应用
2017/01/06 Javascript
AngularJS中的按需加载ocLazyLoad示例
2017/01/11 Javascript
JavaScript实现QQ聊天消息展示和评论提交功能
2017/05/22 Javascript
微信小程序的分类页面制作
2017/06/27 Javascript
使用Vue写一个datepicker的示例
2018/01/27 Javascript
web3.js增加eth.getRawTransactionByHash(txhash)方法步骤
2018/03/15 Javascript
jQuery AJAX 方法success()后台传来的4种数据详解
2018/08/08 jQuery
详解使用webpack+electron+reactJs开发windows桌面应用
2019/02/01 Javascript
小程序怎样让wx.navigateBack更好用的方法实现
2019/11/01 Javascript
Preload基础使用方法详解
2020/02/03 Javascript
如何实现小程序与小程序之间的跳转
2020/11/04 Javascript
基于python yield机制的异步操作同步化编程模型
2016/03/18 Python
Python 使用requests模块发送GET和POST请求的实现代码
2016/09/21 Python
简述:我为什么选择Python而不是Matlab和R语言
2017/11/14 Python
PyCharm设置注释字体颜色以及是否倾斜的操作
2020/09/16 Python
浅析Python模块之间的相互引用问题
2021/02/26 Python
关于iframe跨域使用postMessage的实现
2019/10/29 HTML / CSS
Amaze UI 文件选择域的示例代码
2020/08/26 HTML / CSS
马来西亚网上美容店:Hermo.my
2017/11/25 全球购物
新秀丽官方旗舰店:Samsonite拉杆箱、双肩包、皮具
2018/03/05 全球购物
澳大利亚领先的在线礼品网站:Gifts Australia
2020/08/15 全球购物
error和exception有什么区别
2012/10/02 面试题
网上签名寄语活动留言
2014/01/18 职场文书
2015年店长工作总结范文
2015/04/08 职场文书
利用Python读取微信朋友圈的多种方法总结
2021/08/23 Python
Win10服务全部禁用了怎么启动?Win10服务全部禁用解决方法
2022/09/23 数码科技