背景:
疫情期间学校要求每日上午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()