专栏首页伟大程序猿的诞生python实现百万英雄答题神器

python实现百万英雄答题神器

最近百万英雄之类的答题软件广受大家的喜爱,不过对于我这菜鸟基本没有拿过奖。 但是作为一名码农怎么能忍,于是研究出了即将要与大家分享的答题神器。

流程:

首先,带着大家捋一遍流程:

first:将手机屏幕投影到电脑上,或者开启模拟器,在电脑上,将问题和答案截图 second:进行图像识别,将问题和答案转换成文字 third:百度搜索问题和答案并爬取数据 fourth:进行数据分析,给出答案

投影/模拟器

本人使用的iphone和Mac进行投影,只需要通过quickTime即可。

如果是安卓机,你也可以使用vysor

如果不想投影的小伙伴可以下载夜神模拟器或者Genymotion模拟器。 ok,这一步太简单了,就不多说了。

图像识别

其实我的上一篇文章就是为了这一篇做铺垫,我在python人工智能-图像识别文章中已经详细介绍了如何通过PIL截取图片,并通过pytesseract进行文字识别。这里我就不详细讲述了,同学们可以看上一篇。 这里直接上代码:

#这里根据个人电脑截取投影到电脑的问题和答案区域:
image = ImageGrab.grab(bbox=(50, 410, 750, 1100))
image.save(IMAGE_PATH)

image = Image.open(IMAGE_PATH)
character = pytesseract.image_to_string(image, lang="chi_sim+eng", config="-psm 4")
print(character)
list = character.split('\n\n')

question = list[0]
answerOne = list[1]
answerTwo = list[2]
answerThree = list[3]

这里我们使用config="-psm 4",因为我们这里问题和答案相当于一个文本列.

例如下列问题:

image = ImageGrab.grab(bbox=(50, 410, 750, 1100))
image.save(IMAGE_PATH)

通过上面的代码,我们会先获得到问题和答案的截图:

然后通过下面的代码识别图中的文字,并保存到变量中,后面会用到:

image = Image.open(IMAGE_PATH)
character = pytesseract.image_to_string(image, lang="chi_sim+eng", config="-psm 4")
print(character)
list = character.split('\n\n')

question = list[0]
answerOne = list[1]
answerTwo = list[2]
answerThree = list[3]

运行后

question : 4'人民日报海外版侠客岛的作者_般自称自己为岛叔和?
answerOne : 岛妹
answerTwo : 岛婶
answerThree : 岛姨

这下我们的到来问题和答案,接下来就去搜索答案,由于我门没有强大的后台,所以只能自己去百度爬取数据。

搜索答案

这里我们用到了python库中的requestsBeautifulSoupurllib.request 这篇文章就不具体讲解爬虫的基本知识了。

import requests
from bs4 import BeautifulSoup
import urllib.request

#百度知道网
BASE_URL = 'https://zhidao.baidu.com/search?ct=17&pn=0&tn=ikaslist&rn=10&fr=wwwt&word={}'

#将上面图像识别后的问题放到百度知道去搜索答案
questionParm = urllib.request.quote(question)
url = BASE_URL.format(questionParm)

上面的代码运行后会得到如下链接 https://zhidao.baidu.com/search?ct=17&pn=0&tn=ikaslist&rn=10&fr=wwwt&word=4%27%E4%BA%BA%E6%B0%91%E6%97%A5%E6%8A%A5%E6%B5%B7%E5%A4%96%E7%89%88%E4%BE%A0%E5%AE%A2%E5%B2%9B%E7%9A%84%E4%BD%9C%E8%80%85_%E8%88%AC%0A%E8%87%AA%E7%A7%B0%E8%87%AA%E5%B7%B1%E4%B8%BA%E5%B2%9B%E5%8F%94%E5%92%8C%3F%0A%0A%E5%B2%9B%E5%A6%B9%0A%0A%E5%B2%9B%E5%A9%B6%0A%0A%E5%B2%9B%E5%A7%A8

接下来就通过我们的BeautifulSoup去解析页面

html = requests.get(url)  # requests 请求页面内容 由于百科搜索没有限制爬取,所以不用设置伪请求头
soup = BeautifulSoup(html.content, "html.parser")  # BeautifulSoup解析页面内容
items = soup.find_all("dl", "dl")  # 获取所有的答案内容

for i in items:
    firstResult = i.find("dd", "dd summary") #百度知道的问题
    secondresult = i.find("dd", "dd answer") #百度知道的答案

数据分析

到这里我们已经有了如下的数据:

for i in items:
    firstResult = i.find("dd", "dd summary")
    secondresult = i.find("dd", "dd answer")
    if firstResult is not None:
        countAnswerOne += firstResult.text.count(answerOne)
        countAnswerTwo += firstResult.text.count(answerTwo)
        countAnswerThree += firstResult.text.count(answerThree)
        print(firstResult.text)
    if secondresult is not None:
        countAnswerOne += secondresult.text.count(answerOne)
        countAnswerTwo += secondresult.text.count(answerTwo)
        countAnswerThree += secondresult.text.count(answerThree)
        print(secondresult.text)  

通过统计答案在搜索结果中的次数来给出推荐答案(较为复杂的推荐结果尚在完善之中,敬请期待)

至少我们心中可以快速的检索到答案,并且有推荐答案,提高了答题正正确率,哈哈。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 安卓直播详细教程(三)-----ijkplayer打造个性化控制界面

    例子中AndroidMediaController的功能主要是支持将顶部的toolbar和MediaController绑定在一起,一起show/hide.

    先知先觉
  • Kotlin实战【四】迭代事物:while和for

    区间本质:两个值之间的间隔。这两个值通常是数字:一个是起始值,一个是结束值。使用 ..来表示

    先知先觉
  • Kotlin实战【一】Kotlin定义与目的

    本系列文章适合有一定java经验的开发者,文章主要内容来自于Dmitry Jemerov的《Kotlin实战》,并加以自己学习过程中的感悟,总结以及实战中的经验...

    先知先觉
  • 算法02 七大排序之:直接选择排序和堆排序

    上一篇总结了交换排序的冒泡排序和快速排序。这一篇要总结的是选择排序,选择排序分为直接选择排序和堆排序,主要从以下几点进行总结。 1、直接选择排序及算法实现 2、...

    nnngu
  • <算法入门>快速理解7种排序算法 | python3实现(附源码)学习难度:桶排序(简化版)冒泡排序选择排序插入排序快速排序(面试常用算法)归并排序(先分后和, 分而治之)希尔排序

    算法是程序的灵魂,而排序算法 是算法的入门经典,作者在此用python亲自实现了7种主流的排序算法,并做简短的说明. ? 排序算法 学习难度: 桶排序 < 冒泡...

    zhaoolee
  • Python-列表+-01-两个列表各元素合并

    系统:Windows 7 语言版本:Anaconda3-4.3.0.1-Windows-x86_64 编辑器:pycharm-community-2016.3....

    zishendianxia
  • python将字符串类型list转换成list

    python读取了一个list是字符串形式的'[11.23,23.34]',想转换成list类型:

    机器学习和大数据挖掘
  • 经典排序算法和python详解(二):冒泡排序、双向冒泡排序、插入排序和希尔排序

    一、冒泡排序(Bubble Sort)二、冒泡排序法改进三、双向冒泡排序法四、插入排序五、希尔排序(插入排序改进)

    Minerva
  • python自学——集合

    py3study
  • Python基础(list类)

    5、pop([i]) #删除并返回位置为 i 的元素,若省略参数,则表示删除最后一个元素 栈:LIFO(后进先出)

    py3study

扫码关注云+社区

领取腾讯云代金券