Python使用webdriver模拟点击,定时自动下载文件

0.目的

工作每天都得下载最新的固件进行测试,想每天到达工位时最新固件已经下好,而我只是菜鸡,想不到好办法只能用笨办法,让浏览器自动帮我点呗,所以想到了selenium

1.下载webdriver

去chrome设置->关于chrome 查看当前chrome版本

去http://chromedriver.storage.googleapis.com/index.html下载对应版本webdriver

2.分析URL

由于该网站url仅随日期变动,分析后补全url

3.寻找下载按钮

找寻方法有很多,需要结合网站html的详情自行分析

在这里我使用By.CLASS_NAME确定大的div,由于下载文件版本很多,我过滤了一下关键字,找到我想要的,然后因为div本身就有跳转链接就不用再去找子button,我直接click了

4.定时

死循环,每隔一个小时看一眼是不是快到设定的时间了,这个方法很笨,肯定可以优化,但是我懒得优化了,能用就行。(比如可以计算当前时间和目标时间秒数差,精确下载时间;由于我没搜到如何获取下载状态,我就根据网速和文件大小统一设置了1200s等待时间;再做点交互指定其他版本等等。以后再填坑吧)

5.代码如下

import datetime
from selenium.webdriver.common.by import By
from selenium import webdriver
import time

while True:
    hour = datetime.datetime.now().hour
    print('now hour is ' + str(hour))
    if hour == 8:
        opt = webdriver.ChromeOptions()  # 创建浏览
        prefs = {"download.default_directory": "C:\\Users\\Simon\\Downloads", "download.prompt_for_download": False, }
        opt.add_experimental_option("prefs", prefs)
        opt.add_argument("--headless")
        web = webdriver.Chrome(options=opt)  # 创建浏览器对象
        url = 'http://xxx' + datetime.date.today().__str__() + '/xxx/'
        web.get(url)
        print('loading webpage now')
        web.implicitly_wait(5)  # 加载等待
        flag = True
        tags = web.find_elements(By.CLASS_NAME, 'to-detail')
        for tag in tags:
            if tag.text.__contains__('root-secure'):
                tag.click()
                print('start downloading!')
                time.sleep(1200)
                print('it should be finished by now, check your disk.')
                flag = False
        if flag:
            print('no root-secure version, please check manually.')
        web.quit()
    time.sleep(3600)

6.Pyinstaller

我不想老挂着pycharm,就想着打包生成一个exe挂后台

pip install pyinstaller

pyinstaller -F D:\\文件夹\xxx.py

加入-w可以不显示控制台,但是我要打印日志所以去掉了

7.优化1.0

现在允许用户手动指定下载路径和下载时间。且由于网络状况可能不稳定,考虑到单纯的sleep 1200s不太好,所以额外增加一个下载函数,这样下载结束就会立马关掉web,并增加下载进度条显示,更新后代码如下:

import datetime
from selenium.webdriver.common.by import By
from selenium import webdriver
from requests import get
import time


def download(url, file_path):
    reply = get(url, stream=True)
    content_size = int(reply.headers['content-length'])
    data_count = 0
    with open(file_path, 'wb') as file:
        for chunk in reply.iter_content(chunk_size=10485760):
            if chunk:
                file.write(chunk)
                done_block = int((data_count / content_size) * 50)
                # 已经下载的文件大小
                data_count = data_count + len(chunk)
                # 实时进度条进度
                now_jd = (data_count / content_size) * 100
                # %% 表示%
                print("\r [%s%s] %d%% " % (done_block * '█', ' ' * (50 - 1 - done_block), now_jd), end=" ")
    print(' ')


due_time = int(input('请输入您想开始下载的整点时间(如输入数字 8 就是8点之后开始下载):'))
path = input('请输入您想要保存文件的路径(如D:\\):')

while True:
    hour = datetime.datetime.now().hour
    print('现在是' + str(hour) + '点')
    if hour == due_time:
        opt = webdriver.ChromeOptions()
        prefs = {"download.prompt_for_download": False, }  # webdriver默认下载是要申请权限的,配置此参数跳过
        opt.add_experimental_option("prefs", prefs)
        opt.add_argument("--headless")  # 去掉网页展示
        web = webdriver.Chrome(options=opt)  # 创建浏览器对象
        webUrl = 'xxxxxxxxxx' + datetime.date.today().__str__() + '/full-build-release/'
        web.get(webUrl)
        print('加载网页中,请稍等')
        web.implicitly_wait(5)  # 加载等待
        flag = True
        tags = web.find_elements(By.CLASS_NAME, 'to-detail')
        for tag in tags:
            if tag.text.__contains__('root-secure'):
                print('已找到下载按钮,开始下载!')
                link = tag.get_attribute('href')
                name = link[link.rfind('/') + 1:len(link)]  # 从下载链接中切割文件名
                download(link, path + name)
                print('下载应该已经完成,请检查下载路径')
                flag = False
        if flag:
            print('没找到root-secure版本,请手动检查')
        web.quit()
    print('进入等待')
    time.sleep(3600)

你可能感兴趣的:(瞎写的小东西,python,chrome,开发语言)