用Python做一個自動填報腳本


背景:

疫情期間學校要求每日上午10點前線上健康打卡,以利於第一時間掌握全體同學的實時動態。但我老忘,因此沒少被輔導員教育。我們可以使用url訪問簽到頁面,這里用一個例子來圖文演示如何實現自動填報!

腳本中使用到的Python庫有:

Selenium:自動化測試工具,可以驅動瀏覽器執行特定的動作。

Time:Python中處理時間的標准庫,會用到其sleep(s)讓程序休眠一段時間。

Smtplib:主要負責發送郵件,是一個發送郵件的動作,連接郵箱服務器,登錄郵箱,發送郵件(發件人,收信人,郵件內容)。

Email:主要負責構造郵件,指的是郵箱頁面顯示的一些構造,如發件人,收件人,主題,正文,附件等。

1. 環境搭建

  • Anaconda

    1. 下載位置

    清華大學的鏡像網:Anaconda ,這里咱下載版本 Anaconda3-2021.04-Windows-x86_64.exe
    清華大學

    2. Anaconda 的安裝

    如果不懂安裝可以看看該篇教程: 安裝教程
    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()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM