用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