最近学校要求我们每天通过一个在线表单打卡自己在家做的体育课项目,在提交的时候我突然想了下如果能有一个自动的系统每天帮我自动打卡岂不是能省很多时间?而且我一直很想学Python的网络爬虫以及服务器后端的知识,所以开始着手开发这个项目。
首先附上项目地址:
https://github.com/MohaElder/AutomaticClockInSHSIDgithub.com项目用到的语言:
HTML,CSS,Javascript(用于编写前端交互页面)
Python:后端服务代码
项目第三方依赖:
Jquery, Flask, APScheduler, CORS, selenium, yagmail
项目文件结构:
server.py:后端服务(本来还加了一个tornado用来host,但是发现apscheduler要重新写就丢弃了)
index.html:前端网页
style.css:前端网页样式文件
项目功能:
实现提交相关信息后在特定网页上每隔24小时按照相关信息提交一次表单, 并且发送邮件告知用户表单提交结果(网页截图方式)
下面来讲一下项目的整体实现过程:
我花了大概六个小时在这个项目上面。在这六个小时中,我从0学习了Flask和Selenium并且花了很大一部分时间在探索Requests,Beautiful Soup以及RoboBrowser这些库上面。
首先我们来看一下需要自动提交的表单:
表单提供商是金数据公司,表单格式我们通过检查元素后发现是基本的<form>
通过Postman上的提交尝试后,我发现表单提交需要验证token。
对于这个项目我一开始有两个思路:
1. 使用Requests和RoboBrowser实现抓取表单并自动提交表单
优点:速度快,调用资源少
缺点:token验证较麻烦
2. 使用Selenium+Headless Browser(这里我使用了chrome)模拟用户点击并自动提交表单
优点:简单直白,不需要应付token验证
缺点:调用资源较多
在尝试方法一时,我发现这个表单选择班级的下拉框里面的内容是根据选择第一个年纪下拉框后自动生成的,所以我并不能通过robobrowser一次性提交。因为第二个下拉框的options会检测不到我的value并报错。经过反复尝试还是不行,所以我准备使用方法2。
方法2的Selenium真的是简单爽快,一行代码就是一次操作。我花了10分钟就写好了提交表单的逻辑代码。
在实现了自动提交表单这一操作后,我决定把它做成在线版。于是我使用了Flask作为web框架并创建了/clockin (method:POST)这个方法用来从前端提交表单相关信息。
这里我还使用了全局变量来动态添加新的用户并放入接下来提到的定时执行数组
在定时执行这一块,我使用了APscheduler作为执行库,设置的是每30秒(方便测试)运行一次循环自动提交表单。
在发送邮件方法中,我使用了yagmail这个库调用我的qq邮箱发送邮件给用户。使用这个库的原因是因为它的调用方式很简洁,比原生的要方便很多。
以上就是这个项目所有的重点部分,我通过这个项目收获了很多,学会了flask和爬虫的基础。希望大家能够在看完这篇日记后也有所收获~
欢迎各位在评论区留下反馈建议