背景
七八月份,正是各个高校录取发放的时间段,正好我这个学校的录取通知书发的比较晚,心里也蛮迫切想要录取通知书的,一无聊就刷新一下学校的招生信息网查看录取通知书的快递单号,突然想起我是学计算机的,那我就用python完成录取通知书的的监控。
任务
使用编程语言配合Linux服务器对招生网站的数据进行监控,如果更新了快递单号,则将录取单号推送微信信息到我的微信上,并关闭监控。具体看下图:
获得数据
一共有四个表单需要输入数据,然后登录查询,可头疼的是他有一个让无数个爬虫仔都恶心的东西——验证码,其实到这一步我是有点想放弃的了,但是既然咱有这个想法,那我们就去行动,那我就抱着试试的心态对请求数据和js进行分析。
通过开发者检查工具我们可以看到对应的数据执行函数check_form_submit(),有一点点英语知识的我看得出来这个函数是检查表单的函数,哈哈有时候开发者的代码语义化也对我们有些许帮助。我们通过函数名找到对应代码进行分析。(题外话:我寻思你都用jq了 为啥还用原生写表单检查呢,不累吗)
原来是将input数据放到一个数组里,然后下面进行遍历
核心代码分析
input_node = document.querySelector(inputs[i]);
if(!input_node){
continue;
}
代码整体的意思就是,你不把东西写完,我不给你发送数据,唉 就是玩。我们将代码改一下,跳过输入检查。上代码
check_form_submit=()=> true;
这个使用箭头函数直接让他返回值为true ,就可以跳过表单检查了。
输出函数返回值也是ture,成功绕过表单检查。
成功绕过验证码,下一步使用编程语言构建数据请求包。
这里我们用python进行数据构造,看能不能成功请求到数据
注:构造payload时需要把请求key的imagecode改成none。这里打码部分涉及一点隐私,就先打码了
python构建请求数据包完成,再不输入验证码的情况可以成功获取到数据。但是数据还是html形式,如果要对其进行操作的话 需要进行解析。
这里我用到python的BeautifulSoup进行数据解析,解析出来的数据可以得到数组形式,很方便。
from bs4 import BeautifulSoup
具体操作 请移步到官方文档,Beautiful Soup 4.4.0 文档
由于本文章是录取通知书发放后写的,所以得到了单号,没有发录取通知书的内容是‘暂无数据,请耐心等待“
这里得到录取通知书的ems地址 位置也就是18,但是Python中数组是从0开始的 这里就是17,上代码
res=response.text
html=BeautifulSoup(res,'html.parser').select('td')[17]
return html.string
这里我们直接将录取单号return出来,方便操作
get_ems()算正式完成了
成功得到单号,解析完成。
判断是否更新录取通知书单号
这里使用if语句, 并且做个错误异常处理,完成数据异常或者请求异常的情况。也可以以免程序出现错误等情况导致监听失败
# 开始执行之前先微信通知书。
send_tom_wx('开始运行','[汤姆猫个人录取通知书动态监控]已启动')
while True:
try:
emsnumber=get_ems()
except:
send_tom_wx('数据异常','数据异常')
print('数据异常 二十分钟后重试')
time.sleep(1200)
continue
if emsnumber !='暂无数据,请耐心等待':
print('录取通知书已发出')
# 录取数据发生变化 开始跳出循环 进行单号发送
send_tom_wx('[汤姆猫个人录取通知书动态监控]你的录取通知书已发出 单号为:'+str(emsnumber),'[汤姆猫个人录取通知书动态监控]你的录取通知书已发出')
break
else:
print('未发出,请耐心等待')
# 二十分钟再发送一次请求
time.sleep(1200)
send_tom_wx是我自己封装的函数,使用之前请自行配置相关代码,我用的是wx_push消息推送平台,请自行百度其文档
当程序将录取通知书快递单号通过微信推送给我后,就break退出监控,咱不能一直访问吧。哈哈(就到此为止吧,再请求就不礼貌了)。
每二十分钟就获取数据判断一次,这样既可以避免服务器资源的浪费也可以避免学校服务器不堪重负,对校方招生工作的影响。(注:这种情况单线程就ok 如果是多线程+不延迟那容易吃牢饭)
使用linux服务器监听数据变化
我电脑不可能开一整天吧,这时候需要一台云服务器进行监控,服务器是国外的一台4h+4g 50m 的centos机子,足已完成相关需求,如果你问我为什么要专门花钱去一台服务器,不心疼吗。我的答案是 这服务器我蹭的。
linux跟windows服务器不同,linux如果命令行窗口关闭或者服务器断开连接都会导致程序关闭,这里我们使用SCREEN把程序挂到后台。
在文件中新建属于自己的文件夹,以免程序混乱或者自个找不到
mkdir your file_name
这里原来我已经新建过tom文件夹了,直接将我们的代码文件用sftp的方式传输进去
如果嫌麻烦可以通过vim的方式将代码粘贴进去(代码少时)
touch your_code_fime_name.py
sudo vi your_code_fime_name.py
:!Wq
上传好之后,我们就可以把挂载到后台了
screen -S 你的进程名
screen
进入screen后就可以在这里面执行程序了
执行我们的Python代码
python main.py
这是后台执行后输出代码的界面,最后也是执行完监控任务了,将录取单号输出到界面,并且将单号发给了我
退出来后发现程序已经成功挂载到了后台
命令行总结
screen -S
scrren -ls
screen -r
screen
kill 9 进程号
云端监控的也成功的完成了。
成果演示
以上是完成监控任务的截图
当开始执行程序后推送的信息
send_tom_wx('开始运行','[汤姆猫个人录取通知书动态监控]已启动')
你说巧不巧,正好遇到了莫名其妙的错误,我们做得错误异常抛出处理也产生了作用
在出现异常后也是及时的通知我了,在出现异常后也自动休眠二十分钟,休眠完后继续监听
到18.30的时候,校方导入的快递单号信息到招生平台,我也第一时间的得到了通知
任务完成!!! 去拿通知书啦
我的个人博客博客:tomsir.top
原文地址:https://www.tomsir.top/2022/08/03/Tompost1/
注!因特殊原因(避免恶意爬取校方信息或者爆破等),绕过验证码的后端部分没有详细说明。