前言:最近在思考如何将一些生活中重复做的事情自动化,笔者比较喜欢玩LOL,去一些网站下载免费皮肤软件,奈何LOL更新实在频繁,皮肤软件也需要不断更新,所以有了下载这个软件自动化的想法...
0 开始之前
os, shutil, time, zipfile, pykeyboard(标准库直接导入即可)
-
msedge.selenium_tools, pyHook, PyUserInput
- 第三方库需要下载后才能导入,比较特殊的是pyhook和PyUserInput,安装教程
1 源码
import shutil, os, time, zipfile
from msedge.selenium_tools import EdgeOptions
from msedge.selenium_tools import Edge
from pykeyboard import PyKeyboard
edge_options = EdgeOptions()
'''todo(@Yuan),下面这段代码是将Edge浏览器在后台运行(即不打开浏览器执行自动化,但存在一些问题还未解决)'''
# edge_options.use_chromium = True
# edge_options.add_argument('headless')
# edge_options.add_argument('disable-gpu')
driver = Edge(executable_path='./msedgedriver.exe', options=edge_options)
driver.get('http://leagueskin.net/p/download-mod-skin-2020-chn')
# 等待网站加载完全,加载不完全可能无法获取所需的数据
# driver.implicitly_wait(10)
# 找到需要的数据属性名,可以通过id,class,tag...
software_download_button = driver.find_element_by_id('link_download3')
# 获取官网最新版本
software_lastest_version = software_download_button.text.replace(' ', '')[14:-4]
# 本地存放软件目录
software_storage_path = r"C:\Users\Yuan\Desktop\skin"
# Edge浏览器文件下载存放目录
Edge_download_path = r"C:\Users\Yuan\Downloads"
# 本地的旧版本
for software_name in os.listdir(software_storage_path):
if os.path.splitext(software_name)[1] == '.zip':
software_old_version = software_name[8:-4]
# 判断版本,从而决定是否下载
if software_lastest_version > software_old_version:
software_download_button.click()
'''点击下载后会有广告,但只需随意点击就可开始下载,所以用Pykeyword模拟键入了回车键'''
time.sleep(3)
k = PyKeyboard()
k.press_key(k.return_key)
time.sleep(5)
driver.quit()
for download_file in os.listdir(Edge_download_path):
if software_lastest_version in download_file:
'''如果有新版本,下载完成,将之前的旧版本删除'''
shutil.rmtree(software_storage_path)
os.mkdir(software_storage_path)
download_file = os.path.join(Edge_download_path, download_file)
shutil.move(download_file, software_storage_path)
'''新版以zip包形式存在,需要解压'''
for new_software in os.listdir(software_storage_path):
new_software = os.path.join(software_storage_path, new_software)
zipfile.ZipFile(new_software, 'r').extractall(software_storage_path)
for software_name in os.listdir(software_storage_path):
if os.path.splitext(software_name)[1] == '.exe':
if software_lastest_version in software_name:
new_software_name = software_name.replace(' ', '')
os.rename(software_storage_path + '\\' + software_name,
software_storage_path + '\\' + new_software_name)
os.chdir(software_storage_path)
os.system('%s' %new_software_name)
2 期间遇到的问题
Q1:selenium库导入无法使用
A1:文件名不要和库名一样,将文件名修改后正常使用。(笔者的这个py文件名字和selenium一样)
Q2:无法调用浏览器
A2:设置浏览器安装根目录options = Options() options.binary_location = "C:\\Users\\Yuan\\AppData\\Local\\CentBrowser\\Application\\chrome.exe",最好是默认安装目录(代码中options.binary_location是浏览器在笔者电脑安装位置);还需要安装chromedriver,下载和谷歌浏览器版本相近的解压即可
Q3:软件名带有空格无法用os.system()正常启动
A3:带有空格时,可以用os.system(r'"路径"'),运行名字带有空格的程序。也可以通过修改文件名,将空格改消失,这样也可以正常启动。最后,如果路径是个变量,可以用os.system('%s'%变量)
Q4:百分浏览器下载资源时需要确认,且删除旧文件,移动到指定文件夹解压后运行?
A4:上述代码已经可以完成这个操作,只需将Edge浏览器的Webdriver换成谷歌的Webdriver,再导入selenium库,引用Chorme webdriver(具体可百度)。
Q5:键盘模拟键入Enter,selenium库本身需要绑定页面一个元素,而有些弹窗并不是页面弹出,或是不想去定位元素,只想实现一个按键操作?
A5:利用pykeyboard模拟安装操作,前提安装pyHook和PyUserInput,安装教程见0 开始之前,具体实现见1 源码。
3 不足之处
N1:是否可以静默确认版本?一开始想的是后台静默确认版本,从网上找到Edge的webdriver后台运行方式(不打开浏览器运行脚本),但是好像和2 期间遇到的问题 Q5冲突?就是如果后台运行了,会出现脚本执行到按键就不继续了,笔者猜测可能是由于浏览器后台运行造成模拟键入Enter无法找到施加的对象,从而脚本不继续运行。(笔者之前想的是在Edge浏览器里下载Adblock插件拦截广告,但是webdriver每次调用的是一个全新的Edge浏览器,所以没办法)
N2:由于请求的是外国的网站,虽然软件才2M多,有时候会存在下载缓慢,从而导致下载超时,代码无法执行完全。有两个解决办法:①科学上网②用迅雷下载,需手动确认(迅雷没怎么用过,所以不知道在哪里设置无需确认),替换下载路径
N3:如果软件存放文件夹为空,或是没有新版本直接启动程序?为空的话可以写一个判断直接下载软件即可,因笔者电脑一般会有旧版本,所以这里不再赘述。如果没有新版本,想要直接启动程序,一般这个脚本发现有新版本后,会把程序执行一次,然后会在桌面生成一个快捷方式直接启动程序即可,无需再使用脚本,比较慢。
4 后续
暂无。。。