自從2020年進入公司從學生變成社會人以來,接手的第一項工作就是檢查並整改公司終端的季度考核指標; 季度考核是公司總部要求的,每季度一次(廢話。。),主要就是檢查內網終端各類管理軟體(桌面管理、防病毒等等)的安裝率與版本合規情況; 需要管理的終端量在1500台左右,各類軟體都有總部提供的平臺,需要做 ...
自從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查找元素一個一個去點是很重覆無聊且枯燥的工作,直到我遇到了一個平臺登錄的時候需要輸入一個圖片驗證碼(其他平臺都是只需要賬號密碼),事情突然變得有趣了起來;
首先我去找了一個比較輕量的圖片識別文字的工具——pytesseract
未完待續。。。