工作每天都得下载最新的固件进行测试,想每天到达工位时最新固件已经下好,而我只是菜鸡,想不到好办法只能用笨办法,让浏览器自动帮我点呗,所以想到了selenium
去chrome设置->关于chrome 查看当前chrome版本
去http://chromedriver.storage.googleapis.com/index.html下载对应版本webdriver
由于该网站url仅随日期变动,分析后补全url
找寻方法有很多,需要结合网站html的详情自行分析
在这里我使用By.CLASS_NAME确定大的div,由于下载文件版本很多,我过滤了一下关键字,找到我想要的,然后因为div本身就有跳转链接就不用再去找子button,我直接click了
死循环,每隔一个小时看一眼是不是快到设定的时间了,这个方法很笨,肯定可以优化,但是我懒得优化了,能用就行。(比如可以计算当前时间和目标时间秒数差,精确下载时间;由于我没搜到如何获取下载状态,我就根据网速和文件大小统一设置了1200s等待时间;再做点交互指定其他版本等等。以后再填坑吧)
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)
我不想老挂着pycharm,就想着打包生成一个exe挂后台
pip install pyinstaller
pyinstaller -F D:\\文件夹\xxx.py
加入-w可以不显示控制台,但是我要打印日志所以去掉了
现在允许用户手动指定下载路径和下载时间。且由于网络状况可能不稳定,考虑到单纯的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)