背景:
疫情期間學校要求每日上午10點前線上健康打卡,以利於第一時間掌握全體同學的實時動態。但我老忘,因此沒少被輔導員教育。我們可以使用url訪問簽到頁面,這里用一個例子來圖文演示如何實現自動填報!
腳本中使用到的Python庫
有:
Selenium:自動化測試工具,可以驅動瀏覽器執行特定的動作。
Time:Python中處理時間的標准庫,會用到其sleep(s)讓程序休眠一段時間。
Smtplib:主要負責發送郵件,是一個發送郵件的動作,連接郵箱服務器,登錄郵箱,發送郵件(發件人,收信人,郵件內容)。
Email:主要負責構造郵件,指的是郵箱頁面顯示的一些構造,如發件人,收件人,主題,正文,附件等。
1. 環境搭建
-
Anaconda
1. 下載位置
清華大學的鏡像網:Anaconda ,這里咱下載版本Anaconda3-2021.04-Windows-x86_64.exe
2. Anaconda 的安裝
如果不懂安裝可以看看該篇教程: 安裝教程
-
配置驅動 ChromeDriver
1. Chrome 瀏覽器
網上chrome老版本特別難找,該鏈接可下載41及以上的版本:Chrome Downloads
如圖,我下載的是版本
96.0.4664.45
2. 下載版本對應的瀏覽器驅動
ChromeDriver
的版本一定要與Chrome
的版本一致
,不然就不起作用!下載地址: ChromeDriver
3. 將驅動解壓放置指定位置
1) Anaconda3的
Scripts
文件夾中2)
chrome
同一目錄下
-
添加環境變量
-
第三方庫的安裝
1. 進入命令行界面
windows+R
,輸入cmd
后回車,cd到Anaconda3/Scripts
文件夾下2. 安裝
Selenium
pip install selenium -i https://pypi.doubanio.com/simple/
由於我的雲服務器上已經安裝了該庫,此時不方便演示,如若安裝完成后,可輸入命令
查看版本
pip show selenium
-
測試
到了此刻,准備工作才算是全部完成了,咱淺淺測試一下,看能否成功打開瀏覽器並訪問指定url!1. 雙擊
Jupyter Notebook (Anaconda3)
2. 敲進代碼點擊運行
from selenium import webdriver browser = webdriver.Chrome() browser.get('http://dw10.fdzcxy.edu.cn/datawarn/ReportServer? formlet=app/sjkrb.frm&op=h5&userno=211906371#/form')
2. 代碼實現
-
Selenium
1. 學習資料
百度網盤鏈接:崔慶才_Python3爬蟲入門到精通
提取碼:ts4q
這是<Python3爬蟲入門到精通>這本書的配套視頻,視頻里面的案例基本沒有問題,還是可以用的。有些例子里的網站已經被反爬了,但方法還是可以學習的。主要是掌握章節2:基礎篇
中課時13:Selenium詳解
2. 核心代碼段
from selenium import webdriver import time from selenium.webdriver.common.by import By try: # 載入網頁后,沉睡5秒讓頁面元素全部加載出來 browser = webdriver.Chrome() browser.get('http://dw10.fdzcxy.edu.cn/datawarn/ReportServer?formlet=app/sjkrb.frm&op=h5&userno=211906371#/form') time.sleep(5) # 用xpath的方式尋找指定元素 # 點擊“承諾”按鈕 button = browser.find_element(By.XPATH, '//*[@id="CHECK"]/div[2]/div[2]/input') button.click() time.sleep(2) finally: browser.close()
3. 獲取元素xpath
3. 踩過的坑
前期因為沒有time.sleep()
導致程序總是報錯找不到該元素
,所以這里建議在每個點擊之前,需要加載的地方都加一個time.sleep()
以確保能夠找到所需元素!
4. 部署到服務器上
只需要一個輕量應用服務器,我選擇裝的操作系統為Windows Server 2019 DataCenter 64bitCN
,按照上述環境搭建即可。
-
遠程連接桌面
mstsc
5. 定點執行
-
保存為py文件
-
Windows執行任務計划
control schedtasks
6. 源碼
from selenium import webdriver
import time
from selenium.webdriver.common.by import By
from smtplib import SMTP_SSL
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
msg_from = '******@qq.com' #發件人郵箱
pwd = '******'
msg_to = '******@qq.com' #收件人郵箱
try:
# 載入網頁后,沉睡5秒讓頁面元素全部加載出來
browser = webdriver.Chrome()
browser.get('http://dw10.fdzcxy.edu.cn/datawarn/ReportServer?formlet=app/sjkrb.frm&op=h5&userno=211906371#/form')
time.sleep(5)
# 選擇省份
# 第一步:點擊跳出省份彈窗列表
provinces = browser.find_element(By.XPATH, '//*[@id="SHENG"]/div[2]/div[2]')
provinces.click()
time.sleep(2)
# 第二步:輸入搜索框
provinces_input = browser.find_element(By.XPATH, '//*[@id="app"]/div/div[2]/div/div/div/div/div[2]/div/div[1]/div/div[1]/div/input')
provinces_input.send_keys('**省')
time.sleep(2)
# 第三步:點擊單選按鈕
provinces = browser.find_element(By.XPATH, '//*[@id="app"]/div/div[2]/div/div/div/div/div[2]/div/div[2]/div/div/div/div/div/div[3]/div')
provinces.click()
time.sleep(2)
# 選擇市
# 第一步:點擊跳出市彈窗列表
city = browser.find_element(By.XPATH, '//*[@id="SHI"]/div[2]/div[2]')
city.click()
time.sleep(2)
# 第二步:輸入搜索框
city_input = browser.find_element(By.XPATH, '//*[@id="app"]/div/div[2]/div/div/div/div/div[2]/div/div[1]/div/div[1]/div/input')
city_input.send_keys('**市')
time.sleep(2)
# 第三步:點擊單選按鈕
city = browser.find_element(By.XPATH, '//*[@id="app"]/div/div[2]/div/div/div/div/div[2]/div/div[2]/div/div/div/div/div/div[3]/div')
city.click()
time.sleep(2)
# 選擇區
# 第一步:點擊跳出區彈窗列表
area = browser.find_element(By.XPATH, '//*[@id="QU"]/div[2]/div[2]')
area.click()
time.sleep(2)
# 第二步:輸入搜索框
area_input = browser.find_element(By.XPATH, '//*[@id="app"]/div/div[2]/div/div/div/div/div[2]/div/div[1]/div/div[1]/div/input')
area_input.send_keys('**區')
time.sleep(2)
# 第三步:點擊單選按鈕
area = browser.find_element(By.XPATH, '//*[@id="app"]/div/div[2]/div/div/div/div/div[2]/div/div[2]/div/div/div/div/div/div[3]/div')
area.click()
time.sleep(2)
# 點擊“承諾”按鈕
button = browser.find_element(By.XPATH, '//*[@id="CHECK"]/div[2]/div[2]/input')
button.click()
time.sleep(2)
# 點擊“提交”按鈕
button = browser.find_element(By.XPATH, '//*[@id="SUBMIT"]/div[2]')
button.click()
time.sleep(2)
# 點擊“確認”按鈕
button = browser.find_element(By.XPATH, '//*[@id="app"]/div/div[2]/div/div/div/div[2]/div/div')
button.click()
time.sleep(2)
# 提示每次簽到成功(預防某天簽到失敗還能有手動再簽的機會)
#---------------------------發送字符串的郵件-----------------------------
mail_title = '揚:' #郵件標題
mail_content = "填報成功,祝生活愉快!" #郵件正文內容
# 初始化一個郵件主體
msg = MIMEMultipart()
msg["Subject"] = Header(mail_title,'utf-8')
msg["From"] = msg_from
msg['To'] = ";".join(msg_to)
# 郵件正文內容,第一個參數為內容,第二個參數為格式(plain 為純文本),第三個參數為編碼
msg.attach(MIMEText(mail_content,'plain','utf-8'))
#------------------------------------------------------------------------
except:
#---------------------------發送字符串的郵件-----------------------------
mail_title = '揚:' #郵件標題
mail_content = "填報失敗,請手動補救!"
msg = MIMEMultipart()
msg["Subject"] = Header(mail_title,'utf-8')
msg["From"] = msg_from
msg['To'] = ";".join(msg_to)
msg.attach(MIMEText(mail_content,'plain','utf-8'))
#------------------------------------------------------------------------
finally:
browser.close()
host_server = 'smtp.qq.com' #qq郵箱smtp服務器
smtp = SMTP_SSL(host_server) #ssl登錄
# login(user,password):
# user:登錄郵箱的用戶名
# password:授權碼
smtp.login(msg_from,pwd)
# sendmail(from_addr,to_addrs,msg,...):
# from_addr:郵件發送者地址
# to_addrs:郵件接收者地址。字符串列表['接收地址1','接收地址2','接收地址3',...]或'接收地址'
# msg:發送消息:郵件內容。一般是msg.as_string():as_string()是將msg(MIMEText對象或者MIMEMultipart對象)變為str。
smtp.sendmail(msg_from,msg_to,msg.as_string())
# quit():用於結束SMTP會話
smtp.quit()