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编码最佳实践之总结
Feb 14 Python
Python编程实现蚁群算法详解
Nov 13 Python
Python文本特征抽取与向量化算法学习
Dec 22 Python
使用python获取电脑的磁盘信息方法
Nov 01 Python
python获取微信企业号打卡数据并生成windows计划任务
Apr 30 Python
新手如何发布Python项目开源包过程详解
Jul 11 Python
使用OpenCV实现仿射变换—旋转功能
Aug 29 Python
mac使用python识别图形验证码功能
Jan 10 Python
文件上传服务器-jupyter 中python解压及压缩方式
Apr 22 Python
Pycharm及python安装详细教程(图解)
Jul 31 Python
Python函数__new__及__init__作用及区别解析
Aug 31 Python
全网最细 Python 格式化输出用法讲解(推荐)
Jan 18 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
杏林同学录(一)
2006/10/09 PHP
php使用ftp实现文件上传与下载功能
2017/07/21 PHP
详谈PHP中public,private,protected,abstract等关键字的用法
2017/12/31 PHP
Jquery选择器 $实现原理
2009/12/02 Javascript
input按钮的事件处理大全
2010/12/10 Javascript
常见表单重复提交问题整理及解决方法
2013/11/13 Javascript
jQuery插件StickUp实现网页导航置顶
2015/04/12 Javascript
javascript仿百度输入框提示自动下拉补全
2016/01/07 Javascript
jquery实现左右无缝轮播图
2020/07/31 Javascript
浅谈js和css内联外联注意事项
2016/06/30 Javascript
Bootstrap实现带暂停功能的轮播组件(推荐)
2016/11/25 Javascript
微信小程序 向左滑动删除功能的实现
2017/03/10 Javascript
基于nodejs 的多页面爬虫实例代码
2017/05/31 NodeJs
vue动态改变背景图片demo分享
2018/09/13 Javascript
Node.js操作系统OS模块用法分析
2019/01/04 Javascript
React传值 组件传值 之间的关系详解
2019/08/26 Javascript
element中的$confirm的使用
2020/04/26 Javascript
JavaScript编写开发动态时钟
2020/07/29 Javascript
[09:43]DOTA2每周TOP10 精彩击杀集锦vol.5
2014/06/25 DOTA
[43:43]完美世界DOTA2联赛PWL S2 FTD.C vs Rebirth 第一场 11.22
2020/11/24 DOTA
python服务器端收发请求的实现代码
2014/09/29 Python
跟老齐学Python之私有函数和专有方法
2014/10/24 Python
详解Python命令行解析工具Argparse
2016/04/20 Python
教大家玩转Python字符串处理的七种技巧
2017/03/31 Python
python中if及if-else如何使用
2020/06/02 Python
详解Python 最短匹配模式
2020/07/29 Python
Python如何截图保存的三种方法(小结)
2020/09/01 Python
利用Python优雅的登录校园网
2020/10/21 Python
python 自定义异常和主动抛出异常(raise)的操作
2020/12/11 Python
一家专门做特卖的网站:唯品会
2016/10/09 全球购物
Watch Station官方网站:世界一流的手表和智能手表
2020/01/05 全球购物
2013年学期结束动员演讲稿
2014/01/07 职场文书
党员公开承诺书范文
2014/03/25 职场文书
浅谈Python数学建模之整数规划
2021/06/23 Python
MySQL中JOIN连接的基本用法实例
2022/06/05 MySQL
el-table-column 内容不自动换行的解决方法
2022/08/14 Vue.js