设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 3655|回复: 0
打印 上一主题 下一主题

直播答题?Python助你自动搜题之新手篇!

[复制链接]

169

主题

1

好友

733

积分

版主

Rank: 7Rank: 7Rank: 7

跳转到指定楼层
楼主
发表于 2018-7-13 22:33:15 |只看该作者 |倒序浏览

承接前文关于Python自动搜题的介绍https://zhuanlan.zhihu.com/p/32828411,此篇面向新手小白进行解析,助你成功运行自动搜题的python程序。

A部分是介绍思路,可以先跳到B部分去下载包,装中文包时耗时蛮长,可以再来细看A部分~

A 思路:如前文所述,代码大致分三步。

1. 获取手机直播答题界面截图

注意:我们这里只关注题目,不管选项,通过搜索题目内容获取辅助线索,所以截图我们只定位在显示题目的位置就足够了,这样图片中读取文字的速度快精度也高一些,例如中午1点直播答题测试时截图第六题:

2. 读取截图中的题目文字内容

这里我们在shell处将读取到的题目内容输出展示,同时也显示代码耗时:

3. 打开浏览器执行对题目搜索

单论每一步,实现方法有很多,但考虑到时间,我们只选取耗时尽量少的方法来实现各部分功能。经过1月11日中午1点百万英雄直播答题时的测试,网络良好时,搜完结果剩余答题时间仍有5秒,完全达到预期效果(但由于中午醉心于搜索、录影,忘了答题了,一心不可二用啊T.T)

B 下载相关功能包:由于我也算是刚入门的新手,基本各种功能模块都是按着搜来的网上教程来的,所以大家只要能保证各个模块都配好,最终程序跑通还是不难的。

执行代码时,我用的是Windows10系统电脑,Python3.6,安卓手机数据线连电脑。

1. 无论什么手机、电脑系统,要做的是实现把手机屏幕内容实时显示在电脑屏幕上,我是用的360手机助手的'演示'功能完成了对安卓和windows的连接,其余型号手机电脑可以自己搜一下来解决。

2. 接下来我们通过电脑截屏来实现截取屏幕上手机直播内容,由于Windows API获取截图的耗时极少,我们选择了它。由于Python没有自带访问windows系统API的库,需要下载pywin32库来实现,pip 安装的命令是: pip install pypiwin32(注意安装时是pypiwin32,不是pywin32)。这里关于windows通过python截屏函数,参考Python实现屏幕截图的两种方式 - weiyinfu - 博客园

3. 拿到题目的截图后,要完成对题目中文字的读取,就需要安装PIL和pytesseract,同时还需要简体中文识别的引擎包tesseract-ocr,相关安装检测参考链接:Python人工智能之图片识别,Python3一行代码实现图片文字识别 - 邱石的专栏 - CSDN博客 注意:安装引擎包时最好按照链接中保存到C盘相似的路径,我和朋友安到E盘都有报错,也没搞清具体原因,把文件剪切到C盘就解决了。另外,请官方下载最新版或者通过我这网盘分享的4.0.0版本的,链接中的版本有点低,准确率也较差https://pan.baidu.com/s/1bpVvjUB

4. 打开浏览器的时webbrowser模块,自带不用下载。

C 接下来是校准工作,调整代码中w,h值来改变截图大小,(20,140)处的两个值改变截图初始位置坐标,对应着你个人手机屏幕在电脑屏幕中的显示位置,调整以上的值使截图恰好落在手机屏上直播时显示题目的位置。

D 代码解析
  1. def window_capture(filename):
  2.     hwnd = 0
  3.     hwndDC = win32gui.GetWindowDC(hwnd)
  4.     mfcDC = win32ui.CreateDCFromHandle(hwndDC)
  5.     saveDC = mfcDC.CreateCompatibleDC()
  6.     saveBitMap = win32ui.CreateBitmap()
  7.     MoniterDev = win32api.EnumDisplayMonitors(None,None)
  8.     #下面的#w=...和#h=...都是链接中源代码对其赋值,获取的是电脑截屏的宽和高
  9.     #w = MoniterDev[0][2][2]
  10.     #h = MoniterDev[0][2][3]
  11.     #我针对自己手机的屏幕大小以及显示题目的位置重新对其设置
  12.     w = 380
  13.     h = 150
  14.     saveBitMap.CreateCompatibleBitmap(mfcDC,w,h)
  15.     saveDC.SelectObject(saveBitMap)
  16.     #here的正下方(20,140)是截图的起点坐标来定位截图位置,这些根据个人情况调整
  17.     #--------------------------------here--------------------
  18.     saveDC.BitBlt((0,0),(w,h),mfcDC,(20,140),win32con.SRCCOPY)
  19.     saveBitMap.SaveBitmapFile(saveDC,filename)
  20. #获取开始执行代码的时间
  21. start = time.time()
  22. #获取截图为'haha.jpg'
  23. window_capture('haha.jpg')
  24. #识别截图中的简体中文
  25. text=pytesseract.image_to_string(Image.open('haha.jpg'),lang='chi_sim')
  26. #识别的字符串是'你 好 吗'带空格的格式,这里去除这些空格生成新的字符串list即题目内容
  27. new_text =''.join(text.split())
  28. print(new_text)
  29. #将题目内容作为搜索关键词加到百度搜索的网址
  30. url = 'http://www.baidu.com/s?wd=%s' % new_text
  31. #打开浏览器获取搜索结果
  32. webbrowser.open(url)
  33. #获取代码结束时的时间
  34. end = time.time()
  35. #计算代码执行时间,搜索结果出现的时间还要取决于网络状况。。。
  36. print(end-start)
复制代码
E 直播答题实测:

文中提到的第六题:
   https://www.zhihu.com/video/934868742274408448  
代码功能介绍:
   https://www.zhihu.com/video/935150865682132992  
成功的第一题:
   https://www.zhihu.com/video/935149969132904448  
忘记答题的第二题:
   https://www.zhihu.com/video/935150275946283008  
彻底GG的第三题:
   https://www.zhihu.com/video/935151057739374592  


希望当你看到这里时,能够成功运行代码咯~ 有问题可以留言,或者关注公众号TEDxPY留言,希望能认识更多喜欢Python的朋友~!

补充:

1.本代码只是简化百度搜索题目的过程,美其名自动搜题,只作答题参考,有优化的想法欢迎来建议。

2.代码运行后,文件夹中会生成截图图片,可以根据图片内容去调整代码中关于截图位置、大小的设置,百万英雄的题目是白底黑字,只要截图准确,一般精确度都很高的。

3.为了方便答题时运行代码,可以用python自带的IDLE打开py文件置于屏幕下方,出题目时在py文件上按F5运行即可跳出浏览器界面;同时提前打开好浏览器,调整好位置,避免答题时跳出的窗口挡住手机屏幕位置影响截图。

4.关于win32模块,谢谢评论提醒,并不是因为win10系统自带,而是我之前运行其它程序时预装过pypiwin32,所以如果找不到win32的模块,可以pip install pypiwin32

5.关于OCR版本,版本低的话可能准确度比较差,这里提供4.0.0版本的安装文件,别用链接里的版本了https://pan.baidu.com/s/1bpVvjUB 抱歉哈

原创代码pengfexue2/TEDxPY





回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-4-25 15:14 , Processed in 0.024145 second(s), 22 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部