最近学校要求我们每天通过一个在线表单打卡自己在家做的体育课项目,在提交的时候我突然想了下如果能有一个自动的系统每天帮我自动打卡岂不是能省很多时间?而且我一直很想学Python的网络爬虫以及服务器后端的知识,所以开始着手开发这个项目。

首先附上项目地址:

https://github.com/MohaElder/AutomaticClockInSHSID​github.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>

顺便我要吐槽这个token怎么是存在一个hidden input上面的

通过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和爬虫的基础。希望大家能够在看完这篇日记后也有所收获~

欢迎各位在评论区留下反馈建议

ajax form表单提交_开发日志:金数据表单自动提交脚本相关推荐

  1. java mysql 自动提交_详解MySQL与Spring的自动提交(autocommit)

    1 MySQL的autocommit设置 MySQL默认是开启自动提交的,即每一条DML(增删改)语句都会被作为一个单独的事务进行隐式提交.如果修改为关闭状态,则执行DML语句之后要手动提交 才能生效 ...

  2. mysql表的组成_数据库中的数据表由什么组成?

    在数据库中,数据表是由表名.表中的字段和表的记录三个部分组成的.在建立表之前都必须先设计它的结构,表结构描述了一个表的框架.设计表结构实际上就是定义组成一个表的字段个数,每个字段的名称.数据类型和长度 ...

  3. Oracle 外部表加载监听日志,使用外部表访问监听日志

    某天工作是使用外部表加载监听日志信息,观察并分析用户连接数变化趋势 按照eygle循序渐进oracle的教程一步步进行: 测试使用外部表先创建目录: connect  / as sysdba crea ...

  4. php 导出mysql 数据库表结构图_导入和导出数据表的图文介绍(phpMyAdmin的使用教程5)...

    导入和导出数据表的图文介绍(phpMyAdmin的使用教程5) 导入和导出数据是互逆的两个操作,导入数据是通过扩展名为.sql的文件导入到数据库中,导出数据是将数据表结构,表记录储存为.sql的文件, ...

  5. mysql数据表中取几列_MySQL查询数据表中数据记录(包括多表查询)

    MySQL查询数据表中数据记录(包括多表查询) 转自:http://www.baike369.com/content/?id=5355 在MySQL中创建数据库的目的是为了使用其中的数据. 使用sel ...

  6. MySQL之数据表(数据库的创建与删除、数据表的创建与删除)

    MySQL之数据表 创建数据库 删除数据库 认识数据表 创建数据表 删除数据表 创建数据库   在创建表之前,一定要先创建用来存储表的数据库.数据库中包含数据表.视图.索引.查询.规则.默认值等数据库 ...

  7. SQL数据库不用SQL语句能显示全表的内容_阿里巴巴数据库分库分表的实践

    在2006年阿里巴巴B2B团队以开源方式研发了Cobar这一关系型数据的分布式处理系统.该系统在很大程度上解决了最初使用Oracle数据库因为存储数据变得越来越大带来的扩展性问题,并且为开发人员提供了 ...

  8. 维度表创建规范_数据仓库维度建模-维度表设计

    1 维度表的定义 在维度建模中,通常将指标的度量称之为"事实",将产生度量的环境称之为"维度".将描述同一个业务实体的的多个维度列组合在一起,就是常说的&quo ...

  9. c语言单链表_突破C语言难点之单链表?一绘图即可

    数据结构之单链表 单链表是一种链式存取的数据结构,用一组地址任意的存储单元 存放线性表中的数据元素 .链表中的数据是以结点来表示的,每个结点的构成:元素( 数据元素 的映象) + 指针 (指示后继元素 ...

最新文章

  1. 删除本地文件后 Git pull从远程仓库重新获取不到解决办法
  2. Hydra 8.4/8.5新增功能
  3. redis中的list
  4. 句柄与指针的区别与联系
  5. 重磅!李宏毅教授机器学习训练营
  6. 基于WDF的PCI/PCIe接口卡Windows驱动程序(3)- 驱动程序代码(头文件)
  7. matlab vec2ind,MATLAB函数ind2vec的作用
  8. ASP.NET WebService 中使用 ASP.NET_SessionId
  9. 7.2.5 dps 测试软件,7.2.5冰DK萨墓六大DPS饰品测试:属性机制及分析
  10. otn与stn网络_mstp和stn的区别
  11. 神来之笔--图解JVM内存分配及对象存储
  12. win10 搜索本地应用没反应,Cortana显示已挂起 的解决办法
  13. 数字图像处理:频域滤波-高低通滤波
  14. 养胃有道——送给胃不好的人
  15. 监控平台(J2EE)声音告警程序功能设计与实现
  16. JavaScript # 前端 js、html中的单引号、双引号及其转义使用
  17. 2019-2021届蓝桥杯——java真题集锦
  18. CART分类与回归树的原理与实现
  19. 国产智能AI对话:技术狂潮之下,要有梦元宇宙正在改变世界
  20. 网络协议 -- ICMP协议(1) 报文格式

热门文章

  1. 【数据结构-图】2.多图详解最小生成树(多图详解+实现代码)
  2. 惊呆了,JDK中这些常用方法也有Bug?
  3. 同事写了一个update,误用一个双引号,生产数据全变0了!
  4. 解决错误: Failed to load class “org.slf4j.impl.StaticLoggerBinder“
  5. Spring IOC的理解总结
  6. 算法--微软面试:指定数字在数组中出现的次数
  7. 剑指offer(34-40题)详解
  8. 头文件包含【预处理】(58)
  9. Servlet3.1 新增的非阻塞式IO
  10. iOS - 利用 UIBezierPath 绘制圆弧