📖 历程
✅️ 缘起
若干年前,曾经有那么一个古怪无比的系统。
它的业务逻辑相当奇葩,界面设计无法理解,运行速度时快时慢,错误处理若有若无。
很不幸,这个系统每年要举办若干活动,用过的人都怨声载道。
更不幸的,本人就是这个系统的管理员之一。
每当活动开展,案头的电话每天都被打爆。
为了处理收集回来的数据,还要请几位实习生人工整理一个星期。
简单来说,这是个让生产效率倒退的工具。
忍无可忍,本人怒学自动化,以将自己从苦逼的繁重劳动中拯救出来。
✅️ 入门和发展
网上翻了一下,selenium 是当时最热门的网页自动化工具,于是边学边用,就此开始接触自动化之路。
一开始,感觉 selenium 简直神奇,十几行语句就能够搞定以前要干大半天的活。
随着了解的深入,逐渐觉得 selenium 就像毛坯房,它只提供了最基础的工具,但要用起来,还要自己进行相当规模的封装。于是就学会了 POM 模式,开始捣鼓自己的 page 对象。
但是,新手入门,各种奇奇怪怪的报错让人无所适从,各种不稳定情况不知如何入处置。甚至还有一些自带的坑难以处置。这段时间,踩了无数的坑,也花了无 数精力,填了无数的坑。
慢慢地,自己封装的工具逐渐成熟起来,随着使用场景的增加,也有了更多的需求。
✅️ 诞生
根据经验和需求,我总结出以下需求:
首先,selenium 的语句实在是太啰嗦了,隐式等待适用范围太窄,显式等待语句复杂得过分,查找元素语句冗长,链式操作显得很难看等等,令我这个极简主义者难以忍受。
其次,查找元素的方式太不友好了,这是最常用的操作,但经常写得又长又臭,我希望创造一套简洁高效的查找元素语法。
还有,我希望把浏览器和 requests 组合起来,各取所长,兼顾写得快和跑得快。
最后,我已经封装了一批好用的方法,填了 selenium 本身不少坑,我希望能够走到哪里都能方便地用到自己顺手的工具。
所以,就有了这个库的诞生。
Drission 这是本人自创的词。是 Driver 前半部分和 Session 后半部分的组合体。
因为 selenium 控制浏览器的对象叫WebDriver
,requests 用于收发数据包的对象叫Session
,Drission 就是对它们组合的一个尝试。
而 Page,表示本库以页面为单位,使用 POM 模式封装。
✅️ 版本迭代
本人虽有编程和前端的基础,但 python 也是自学,属于摸着石头过河。
好在项目驱动的学习方式进展确实快,项目需要什么,就去学什么知识,就像拼图一样,慢慢地把各种知识补全了。
开始时 还是太多东西不懂,就去找现成的库来用。v0.x 至 v1.4 版本是基于 selenium 和 requests-html 制作,前者负责控制浏览器部分,后者负责收发数据包部分。
这一阶段,实现了控制浏览器和收发数据包两者 api 的统一,cookies 的互通,建立了基本的使用逻辑。
但用 request-html 作为底层毕竟有点太重了,在逐渐摸清了它的运行原理之后,本人对这部分底层代码用 requests 和 lxml 进行了重构。来到了第二阶段。
第二阶段是 v1.5 至 v2.x 版本,控制浏览器部分依然基于 selenium,收发数据包和解析功能则完全自己开发。这时跑起来感觉轻松了许多,也增加了更多实用功能和优化。但瓶颈转移到 selenium 这边。
用得越多,了解得越深,对 selenium 的不满就越发增加。selenium 受限于 chromedriver,我的很多想法都无法实现。比如无法对整个网页截图;比如一个 Driver 对象同一时间只能操作一个标签页或页面框架,来回切换标签页的时候,原来已获取到的元素会失效;比如要为不同版本浏览器下载对应 chromedriver,浏览器自动升级最新版时可能没有新驱动而无法使用等等。
还有最重要的一点,近年来我们国家被老美各种打压,本人心中早就憋了一股气,也很想为国内开源事业贡献一点点微薄的力量。
于是来到了第三阶段。
经过 2-3 年的使用,本人踩了足够多的坑,对自动化已颇有些心得,抱着试一试的心态,大胆地迈出了自研底层的一步。在 3.x 版本,DrissionPage 完全放弃了对 selenium 的依赖,自己对底层进行了重构。
真是自研一念起,刹那天地宽。摆脱了 chromedriver 框架的制约,顿时感觉自由的气息扑面而来。从此,DrissionPage 不仅比 selenium 跑得快,还可以实现各种黑科技。这些,用过的各位应该有所体会,这里就不 再啰嗦。
对了,值得一提的是,DrissionPage 有一个副作用。它竟然能够通过 cloudflare、Google 等人机检测工具,这个是作者都没有想到的。也许是自己写的小众玩意,这些大厂还不认识吧。
✅️ 碎碎念
不知为何,3.x 之后,几年来默默无闻的 DrissionPage 竟然有点热闹起来了,Gitee 给发了个 GVP。GitHub 的星星直线上升。有点惊喜,感谢大家的厚爱。
其实作者是个很佛系的开发者,本职并非开发,写库只是业余爱好。事实上,随着功能日渐丰富,许多功能自己都用不到,持续开发更多是来自于兴趣。自己细心雕刻的一个作品,希望能够尽善尽美。自己写的代码在世界上运行着,就像延续了我的生命。更重要的,是感觉自己给国内软件业做了一点点贡献,感到有意义。
但是,自动化的软件往往是一把双刃剑。在这里作者得叠一下甲。请勿将 DrissionPage 应用到任何可能会违反法律规定和道德约束的工作中。请友善使用 DrissionPage,遵守蜘蛛协议,不要将 DrissionPage 用于任何非法用途。如您选择使用 DrissionPage 即代表您遵守此协议,作者不承担任何由于您违反此协议带来任何的法律风险和损失,一切后果由您承担。
最后,回收一下开头,能够曾经令我深恶痛绝的系统,开发团队非常负责,虽然起步不好,但他们积极参与到业务中,不断也迭代产品,经过几大版本的更新,现在那个系统已经好用得不得了。因此,本人对中国软件充满希望,未来会更好。