标签 验证码 下的文章

需求

从特定网站抓取数据,存入exel文件! 因为有几万条,并且这些数据定期会更新,人工抓取显然效率太低了,所以有必要编写一些简单的工具自动抓取
目前这些网站数据免费,也不需要注册,处理器起来比较简单,有一些可能还需要验证码稍微复杂一些
但实现的基本思路都是一样的,只要人能做标准化流程的,机器就能自动化实现;人工重复操作的,有必要实现程序自动化

基本思路

  1. 使用selenium模拟浏览器操作
  2. OpenCV图形处理,验证码识别与匹配
  3. selenium控制浏览器,模拟鼠标、键盘操作
  4. 最后用PyQt6包装个GUI界面,让一般用户也比较好使用
  5. 最最后一步就是使用pyinstaller,将python脚本打造成可以独立运行的程序
python脚本好处是跨平台,同样的代码在Linux,Windows,Mac上都可以运行,同样用pyinstaller分别打包不同平台的独立可执行程序,分发给普通用户使用,非常便利

实现效果

只是普通的工具,所以也没有所谓漂亮的外表,简单易用就好,开始没想好,界面上多了一些无用的组件,暂时没有禁止;实际使用也就涉及2~3次点击,即可抓取需要的数据
编写类似小工具,稳定性、速度、普通用户使用便捷性是我主要考虑的三大要素

截图 2023-04-15 11-39-56.png

实现过程

为了生产率,就算这样简单的小工具,也不应该重零开始编写;最近ChatGPT非常火,我也一直在使用,所以自然第一次接收到这个需求,我就想到使用#AGI帮助我完成;结果是显而易见的,感觉至少10x生产力提升

  • 首先,第一次接触网络数据抓取实际开发,虽然有所了解,但毕竟不是这方面的专家,透过和AGI聊天,我快速熟悉了selenium
  • 其次,让ChatGPT使用PyQt帮助我构建了GUI的几乎全部代码,剩下的就是一些简单的微调
  • 最后,透过ChatGPT聊天,熟悉了如何处理验证码,目前只处理了slider (滑动)验证码 - 移动拼图

涉及这三部分技术,如果靠传统的搜索,我也能搞定,但明显效率不会如此之高。 第一次给出的GUI代码,基本上就没有修改,直接能用,并且我只是使用很自然的语言,比如:

使用PyQt6构建这样一个GUI应用,包含两个combox,一个里面输入网址,‘xxxx1.com’, 'xxxx2.com'等等,一个combox输入设备类型,比如‘起重机’,‘吊车’ 等等,包含一个程序日志输出窗口,包含一个按钮...

对于selenium模块的使用,一开始并不知道这个东西的存在

selenium自动化操作浏览器

关于网络数据抓取,给ChatGPT的第一个问题是:

>我想编写python脚本,自动抓取某个特定网址的数据

balabal...
ChatGPT就给我输出一大堆相关的背景知识
截图 2023-03-26 16-07-53.png

我接下来是要求给一些代码,这样我可以快速 验证

模拟鼠标点击、选择的问题发出之后,很快selenium就进入了视野

比如我想定位网页上某个元素,比如‘查找按钮’、‘下一页’或者‘跳转’按钮等,这些AGI都能直接给出答案
截图 2023-03-26 16-08-29.png

opencv验证码处理

基本的思路是图形处理,轮廓识别与匹配

这部分可能是最花时间的,有一定的技术门槛,细节以后再深入探讨
截图 2023-03-26 16-10-21.png

PyQt6与pyinstaller

使用ChatGPT构建GUI确实非常方便,不过给出的一些例子代码可能有版本匹配的问题,不过如果出现类似错误,直接将错误作为问题继续对ChatGPT提问,往往很容易得到答案,如果经过几次尝试得不到答案,我一般还是选择人工google一下(这种情况有,不是很多)

小结:

这个工具断断续续利用周末的时间不断完善,也花了好几天,其实第一次使用ChatGPT基本构建了程序的原型,后面的工作主要作了一些优化:

  • 增加程序的稳定性,出错的处理和重试机制
  • 分块抓取,多线程抓取
另外还有一个坑,最开始使用PyQt5,使用pyinstaller打包始终不成功,大概率是opencv相关的版本冲突导致,果断切换到PyQt6,顺利解决问题
使用ChatGPT解决编写代码的问题,相关的prompt engineering 也是有一定的模式可遵循,多多练习就能让ChatGPT快速、精准提供可用的答案

参考代码

截图 2023-04-15 12-19-02.png