Python 基于Selenium的考勤记录自动查询工具

工作日基本每天都需要查询打卡记录,以防止打卡异常导致工资异常问题出现。。。公司的IT系统使用起来并不方便,每次查询都需要重复性的输入账户信息,然后机械式的点击多个链接进行一个又一个下一步,特别是网络异常的时候还需要等待几分钟。学了python爬虫后,一直觉得没有实际有价值或有意思的项目做,然后突然想起来自己为什么不开发一个自动查询考勤记录的工具,每天把考勤信息像便签一样显示在桌面一角?嗯,功能如上就是这么简单,但第一次觉得学的爬虫有了意思和意义。


目录

一.技术方案

二.开发笔记

2.1 需求明确

2.2 Selenimu的frame切换功能

2.3 浏览器无窗模式

2.4 Pyinstaller打包后弹出命令窗口问题

2.5 多线程使用

2.6 面向对象思想的运用

三. 总结与感悟


 

一.技术方案

模拟登陆:登陆机制比较简单,不涉及验证码识别等问题,因此使用Selenium实现模拟登陆操作(输入账户信息)就行了。

网页解析:利用Selenimum自带的网页解析功能对网页进行解析、提取需要的数据,不需要pyquery\BS等工具。

浏览器:开发时使用IE11/Chrome以方便研究网页源码、调试测验,打包发布时使用PhotamJS/Chrome以实现无窗口化操作。

UI设计:pyqt5 + QtDesigner

开发环境:Python3.7版本,IDE为Visual Studio Code,打包工具为pyinstaller。

二.开发笔记

2.1 需求明确

核心需求:

  • 定时自动查询任务(比如早晚指定时间)
  • 手动查询(按需查询)
  • 窗体显示查询结果(类似便签)

可选需求:

  • 修改自动查询任务的时间(按需定制)
  • 输入账户信息(密码有时会动态变化)

2.2 Selenimu的frame切换功能

公司的系统基于.net开发,使用了大量的frameset/frame,使用selenium进行网页解析和元素定位时,需要多次进行frame切换(进入进出、嵌套;APIs比较简单,此处不在赘述),否则无法定位到其中元素。这个在一开始没有注意或者想到,而是在尝试定位元素失败后再去回查资料和百度后才解决。所以,使用一个库时,前期对其API的足够熟悉很重要,否则后期会浪费一些不必要的时间和精力。

2.3 浏览器无窗模式

由于想要将工程打包成exe文件以方便使用,结果发现最新版本的Selenium已经不支持无窗模式了,但又不想新装Chrome(如果给同事试用这个工具,他们显然会闲麻烦的~),于是只能回退Selenium版本为3.10。另外,也尝试了一下Chrome的headerless模式,在此过程中便发现了下面这个问题……

2.4 Pyinstaller打包后弹出命令窗口问题

在开发模式下,无论使用何种浏览器(IE/PhotamJS/Chrome),一切正常。但当使用Pyinstaller打包文件后,再次软件运行时总会弹出一个命令窗口(俗称黑框),很影响观感……第一反应是浏览器问题,结果发现从IE到PhotamJS再到Chrome,问题都一样。于是,怀疑是Pyinstaller问题,各种百度谷歌,无解。在快要放弃的时候,发现有人说是Selenium的问题:【https://blog.csdn.net/weixin_34144450/article/details/94185559】。于是修改了一下Selenium里的一行代码,亲测果然有用!!原来是Selenium自身的“问题”!!可惜的是,在相似的帖子里也并没有看到对这个问题的原因解释。由于不使用Pyinstaller打包文件时并不会出现上述问题,因此目前怀疑应该不仅仅是Selenium自身问题。

2.5 多线程使用

第一次开发完成初版时,由于觉得功能简单便没有想到去用多线程。但使用测试时,发现点击查询按钮时主界面UI会阻塞,感觉不太友善,遂在更新版里使用了多线程:分别为按钮事件、自动查询任务各自添加了一个线程。

2.6 面向对象思想的运用

之前的Python运用主要侧重于数据科学,没有太注重面向对象的思想和应用。这次刻意体验了一下封装、继承、数据对象传输的手法和特点,但由于项目比较小,说实话没有什么特别的感受……

三. 总结与感悟

  • 实践是检验真理的标准。理论是一方面,结合项目应用和实际体验,不断的发现问题并找到问题的解决思路和方案则是更重要的一方面。
  • 兴趣是最大的动力。该工具利用上下班的业余时间,累计花了大约两三天时间。虽然没有涉及复杂高深的技术,但从代码编写到UI简单设计再到最后打包发布,完整的走完了一个小软件工具开发的生命周期。虽然商业价值为0,但感觉比工作所做更令人快乐!

 

 

 

你可能感兴趣的:(爬虫)