自从2020年进入公司从学生变成社会人以来,接手的第一项工作就是检查并整改公司终端的季度考核指标;
季度考核是公司总部要求的,每季度一次(废话。。),需要管理的终端量在1500台左右;
主要就是检查内网终端各类管理软件(桌面管理、防病毒等等)的安装率与版本合规情况;
各类软件都有总部提供的平台,需要做的就是去各个平台导出数据、Excel汇总计算,
然后看看哪项考核不达标,通知负责终端维护的外包公司去各个地点做维护;
这项工作虽然不难,但是每季度末都要重复地检查确保达标,因此工作量很大,每天至少要花一两个小时;
其实在刚接手的时候就有做一个自动检查系统的想法,奈何当时的我技术力还不够;
并且刚刚进入公司需要学习的东西太多,就暂且搁置了;
22年一季度不是很忙,就利用工作之余的上班时间做出来了;
每天自动出结果发给外包公司,很大程度上减少了季度考核时的工作量;
主要的实现过程大致是三个步骤:
一、利用Python的selenium WEB自动化工具去各个平台下载数据;
二、利用Python的pymysql数据库工具将数据文件导入MySQL数据库;
三、MySQL数据库按照考核标准计算结果,生成结果文件,再通过邮件发送结果文件。
结构图:
一、利用Python的selenium WEB自动化工具去各个平台下载数据
其实用浏览器控制去导数可靠性比较差,并且效率比较低,但是去找各个平台的项目组对接数据库实在太麻烦了,人家也不见得乐意开放数据库给你用;
并且这个工具最多季度末的时候一天跑两三次,并不需要太高的效率,所以就采用了selenium WEB自动化;
selenium的学习参考的是腾讯云社区的教程:Python中Selenium库使用教程详解 - 云+社区 - 腾讯云 (tencent.com);
首先是pip安装selenium,指定国内源加快下载速度:
pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple
我用的是谷歌浏览器版本99,需要下载一个对应版本99的驱动程序才能调起浏览器,下载地址:http://chromedriver.storage.googleapis.com/index.html;
使用示例:
from selenium import webdriver
from time import sleep
# 实例化一款浏览器
browser = webdriver.Chrome(executable_path = \"chromedriver.exe\")
# 对指定的url发起请求
browser.get(\"https://www.bilibili.com/\")
# 设定窗口大小
browser.set_window_size(1600, 900)
# 在页面中寻找元素
element = browser.find_element_by_xpath(\'/html/body/div[2]/div[1]/div[1]/ul[2]/li[1]/li/div/div/span\') # “登录”
# 对元素进行操作
element.click() # 点击
# 延时3秒,等待页面回应
sleep(3)
# 关闭浏览器
browser.quit()
一般浏览器都可以用F12进入开发工具查看页面中的元素,点击1处的工具,再点击2处页面中任意的元素,在3处会跳转并高亮元素在HTML代码中的位置;
我是按照完整xpath来寻找元素的browser.find_element_by_xpath()
,也可以使用元素的id、name、标签等等;
点击元素后element.click()
,如果有后续操作可以添加一个延时,否则页面可能来不及响应。
1. 切换frame
某些页面会用到frame的结构,比如:
<html lang=\"en\">
<head>
<title>FrameTest</title>
</head>
<body>
<iframe src=\"a.html\" id=\"frame1\" name=\"myframe\"></iframe>
</body>
</html>
在frame中的元素无法被browser.find_element_by_xpath()
直接寻找到,需要进行frame的切换:
frame = browser.find_elements_by_tag_name(\'iframe\')[1] # 切换frame
browser.switch_to.frame(frame)
element = browser.find_element_by_xpath(\'XXXXXX\') # 寻找frame中的元素
element.click()
browser.switch_to.default_content() # 退出frame回到主体结构
如果需要回到主体结构继续操作要使用browser.switch_to.default_content()
。
2. 切换浏览器窗口
某些地方点击后会新建标签页或者弹出新的浏览器窗口,此时就需要切换窗口去继续操作:
windows = browser.window_handles
browser.switch_to.window(windows[1]) # 打开了新页面,需要切换窗口
element = browser.find_element_by_xpath(\'XXXXXX\')
element.click()
3. 新建标签页
如果不想关闭浏览器,需要打开新的标签页继续操作:
js = \"window.open(\'https://www.douban.com/\')\"
browser.execute_script(js) # 在新标签页中访问
4. 识别简单的验证码
本来我以为用selenium查找元素一个一个去点是很重复无聊且枯燥的工作;
直到我遇到了一个平台登录的时候需要输入一个图片验证码(其他平台都是只需要账号密码),事情突然变得有趣了起来;
大概的思路是先截取验证码的图片,然后用图片识别文字的工具来识别验证码,再输入到网页验证码框里;
首先要解决把验证码图片截出来的问题,我参考的是selenium验证码识别之局部截图 - 简书 (jianshu.com);
然后选择了一个比较轻量的(因为要放到内网,太大了不好处理)图片识别文字的工具——pytesseract;
from selenium import webdriver
from time import sleep
from PIL import Image
import pytesseract
# 重复尝试识别验证码,失败后刷新重试,成功后寻找不到try部分中第一个元素,跳转到finally部分
try:
r = 0
while True:
# 输入用户名密码,识别验证码,点击“登录”
element = browser.find_element_by_xpath(\'XXXXXX\') # 用户名
element.send_keys(\'用户名\')
element = browser.find_element_by_xpath(\'XXXXXX\') # 密码
element.send_keys(\'密码\')
# 截图识别验证码并输入
browser.save_screenshot(\'browser.png\') # 对网页进行截图
code_png_lel = browser.find_element_by_xpath(\'XXXXXX\') # 验证码
location = code_png_lel.location # 获取验证码元素所在位置
print(\'location\', location)
size = code_png_lel.size # 获取验证码元素大小
print(\'size\', size)
rangle = (int(location[\'x\']), int(location[\'y\']), int(location[\'x\'] + size[\'width\']), int(location[\'y\'] + size[\'height\'])) # 找到验证码在网页截图中的位置
print(\'rangle\', rangle)
i = Image.open(\'browser.png\')
frame = i.crop(rangle) # 按照验证码位置截图
frame.save(\'code.png\')
j = Image.open(\'code.png\')
string = pytesseract.image_to_string(j) # 识别验证码图片中的文字
string = string.replace(\' \', \'\') # 删除识别结果中的空格
print(string)
element = browser.find_element_by_xpath(\'XXXXXX\') # 验证码输入框
element.send_keys(string) # 输入删除空格后的识别结果
element = browser.find_element_by_xpath(\'XXXXXX\') # “登录”
element.click() # 点击登录
browser.refresh() # 刷新页面
r = r + 1
print(r)
finally:
# 成功后跳出循环,继续操作
sleep(5)
element = browser.find_element_by_xpath(\'XXXXXX\')
element.click()
未完待续。。。
来源:https://www.cnblogs.com/BTday/p/16117880.html
本站部分图文来源于网络,如有侵权请联系删除。