写程序小记2018.1.31-2.1

这两天写一个自动下载的程序。

主要分这几块:

1.自动登陆有验证码的登陆界面

2.找到地址,自动下载

3.下载几页后,自动清除浏览器缓存和cookie,并通过切换高匿代理来改变ip地址,跳到1。

其中1,3是主要难点。

昨天主要是做1

几个问题:

1)如何下载验证码图片

先是用webbrowser控件实现,因为base64编码的方式仅适用于ie 10以上,故不采用,还是用剪贴板的方式。

2)如何识别

2.1 因为“只要够用就行”的思想,所以没用最新版本,而是先用tesseract 2.0,找到一个wrapper dll,可以执行,但识别率不高。

2.2 考虑用tesseract的训练功能,提高识别率

2.3 先写程序,用webclient下载了一批验证码图片作为训练样本。

2.4 下载jTessboxeditor这个工具

2.5 先用Irfanview将下载的jpg转成tif,然后用jTessboxeditor合并

2.6 命令行下执行tesseract命令生成box并训练tesseract。

2.6.1 先是发现2.0版不生成box文件,需要手工改名为box后缀,然后发现2.0不支持多页tif,只处理第1页

2.6.2 折腾了不少时间,最后发现训练不能累加式地执行。虽然可以写程序将多个tif合并成只有1页的tif,感觉麻烦,放弃了。

2.6.3 放弃2.0,这时发现jTessboxeditor自带了tesseract 3.05,用它生成box文件,成功。但发现很多页都识别不了,提示页面为空。

2.6.4 折腾了不少时间,最后换用Irfanview合并tif,再生成box文件,这下基本正常识别。

2.6.5 编辑box文件,校对了总共60页

2.6.6 花了不少时间搞懂了如何执行训练,终于生成最终的traineddata文件。

2.7 找wrapper

2.7.1 发现最新的wrapper dll需要visual studio 2015,没装,暂时放弃。

2.7.2 找到一个3.0的wrapper dll,无文档,不知道如何用,放弃

2.7.3 又找到一个3.0的wrapper dll,执行时出错,可能是只支持3.01的tesseract,下载了这个版本,重新训练,但发现识别率和3.05差别太大,放弃

2.7.4 找不到其他好用的wrapper dll,暂时放弃用wrapper,直接命令行调用tesseract

2.8 试了abby finereader的命令行方式,发现识别率不高,放弃

2.9 写好自动登陆的程序,剪贴板方式下载验证码图片,然后命令行调用tesseract进行识别,如识别结果为空就重新下载图片,重新识别,直到有东西识别出来,填到网页上,登陆

3.0 出错时网页会弹出提示窗,用FindWindowEx, SendMessage等windows api进行检测和关闭。弹出提示窗,说明识别错误,重新下载图片,重新识别

3.1 测试多次,如果识别结果不为空,大致最多3次可识别正确。暂时做到这里,休息了。

今天做的


因为考虑到用webbrowser控件,清缓存和cookie,等于是清空机器上装的ie的缓存和cookie,这不是好的做法,所以放弃webbrowser控件,改用selenium webdriver

1. 先用chrome driver,结果浏览器窗口闪了下就关闭了。开始以为是公司的电脑装了什么东西,无法用chrome webdriver。

2. 换用firefox,结果竟然不会navigate

3. 换用ie,问题多多,原来检测弹出提示窗的代码失效,等等问题

4. 换回chrome,这里怀疑是版本问题。根据过去经验,selenium常有版本问题。下载了最新版,果然好了。

5. 用base64编码的方式下载图片,成功;用alert判断弹出提示窗,也行,粗粗调试,可以成功登陆。但主要问题是tesseract要识别很多次,才会识别出东西来,很多时候都是识别结果为空。

6. 解决这个问题

6.1 估计是图片质量的问题,试了很多种办法。先是换用截屏方式,没用

6.2 改格式存储,bmp, tif, jpg都试了,没用

6.3 放大图片,识别错误多了,没用

6.4 先将图片二值化,没用

6.5 最后手工保存图片再识别,可以了。

6.5.1 于是用Action来模拟“另存图片为”,开始能成功点开右键,但无法点菜单项

6.5.2 先试快捷键,无效

6.5.3 再试图设置鼠标位置,花了不少时间,还是无法把鼠标定位到菜单上,放弃

6.5.4 最后想到可能是当前窗口的问题,先用SetForegroundWindow将浏览器窗口激活,然后点右键,再SendKeys发快捷键,成功打开文件保存窗口

6.5.5 又一个问题,不管download.default_directory怎么设,始终是Downloads目录。用输入完整路径的方法解决。

6.5.6 调试了不少时间,Thread.Sleep和Environment.TickCount两种延时方式并用,终于成功保存图片。

6.6 调试了一下,效果基本满意,基本上每次都能识别出东西。识别率也比较高,差不多接近每次都能识别正确。

今天暂时做到这里。明天修改下载的代码和测试代理切换。另外还要做个自动下载高匿代理列表的程序。

不少时间花在了选择合适的工具/库上,否则还可快些。对tesseract的使用稍微增加了点经验。因为不想钻研图像处理,所以只停留在用ocr工具。我怀疑网上能找到的简单的图像处理/ocr代码,识别效果可能不如ocr工具。毕竟识别效果是最重要的。

posted @ 2018-02-02 05:59  平静寄居者  阅读(120)  评论(0编辑  收藏  举报