农历正月是十五元宵节,在这一天看花灯、猜灯谜是我们的传统习俗,现在很多商家都会在这几天借势营销,搞一些猜灯谜的活动吸引顾客。可惜灯谜真的很难猜,当场拿出手机百度又会略显尴尬而且也未必会找到答案,于是我想到写一个远程答题小助手,通过手机发送谜面就能自动返回谜底。
1
- 建立题库 -
对于灯谜这种深负中华文化的东西,很难通过机器分析谜面的方法找答案,所以我们要提前搜集灯谜题目,将谜面和谜底都存到文件(或数据库)中,以便后期查询调取。
灯谜的搜集可以使用爬虫爬取网络题库,这类网站通常没什么反爬措施,甚至都没使用js动态加载,爬取难度比较小。以汉迷网为例,进入灯谜主题页面后,只需要依次获取每个谜题的详情页url,然后逐一获取谜面和谜底即可。
唯一需要注意的是部分灯谜详情页中会有一栏小贴士(下图红框中内容),而有些灯谜没有这一栏,这会造成页面内容结构的不统一,在爬取内容的过程中需要加以甄别,否则可能导致取不到准确的数据。
由于这个爬虫很简单,就不做详细说明了,直接上代码:
以上就是爬虫类的主要代码,获取到的数据样式如下:
目前我只爬取了汉迷网中的灯谜题目,总计2687条灯谜,如果想使答题小助手更加强大,还可以到其他网站获取更多的题目,然后进行数据清洗合并即可。
2
- 数据收发 -
建立完题库就要考虑如何实现手机与服务端的数据交互,开发APP、搭建网站这种方式有些牛刀小用,我们知道python可以实现邮件的自动化收发服务,可以借助电子邮件实现这一功能。
1)接收
利用python的poplib模块可以实现目标邮箱的自动登陆,并读取收件箱中最新的一封邮件,但是读取到的邮件信息中有些数据是经过编码处理的,因此需要对其进行解码。邮箱登陆和邮件读取部分的主要代码如下:
其中,receive_email函数的返回值就是收件箱中最新一封邮件的标题。
2)发送
再来说下邮件的自动发送,与邮件的自动接收类似,要实现这一功能也要先进行自动化登陆,不同的是这次用到的是smtplib模块。
要发送邮件需要填写发件人、收件人和主题(内容可以不写)三项内容,发件人当然是我们设置好的邮箱,收件人和主题可以自行指定,其中收件人信息可以使用上一步中接收到邮件的发件人,这样就能实现类似自动回复的功能。邮件自动发送部分的主要代码如下:
神操作!发个邮件用Python实现远程自动关机
3
- 系统搭建 -
题库和数据传输的问题解决后就可以着手建立答题系统了。先说下设计思路:
-
建立一个进程持续接收邮件信息,如果接收到标题以“谜面”开头的邮件则提取邮件标题中的谜面题目;
-
将提取到的题目与题库中的谜面进行匹配,若匹配成功则说明题库中有这道题目,返回题目的答案;
-
将匹配到的答案放到邮件自动发送系统中,发送给第一步中发送谜题的发件箱;
-
给自己发送一封标题为“已发送答案”的邮件,以避免同一条谜题被重复处理。
主进程的建立非常简单,一条while循环即可:
下面这段代码用于对自动接收到的邮件进行识别,如果该邮件以“谜面”开头,则提取灯谜题目并到题库中搜索答案:
下面这段代码会以固定格式(答案:谜底-谜面)返回匹配到的谜底:
到目前系统就搭建完成了,需要注意一点:如果要成功得到谜底,必须以固定格式发送邮件,例如:“谜面:春节一天作灯谜 ”,当然这个格式可以根据自己的习惯自行设置。
现在启动程序,尝试向目标邮箱发送标题为“谜面:典籍选载千古对”的邮件,几秒钟后会收到一封目标邮箱发送的邮件,给出的“联名上书”即是灯谜“典籍选载千古对”的谜底了。
近期热门:
不废话,学Python就是这条捷径
本篇文章来源于: 菜鸟学Python
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ python线程安全的两个案例12/30
- ♥ python迭代器和生成器有什么区别08/17
- ♥ python开发过程中常用的9个tips12/22
- ♥ 如何在python中将变量写入文件09/21
- ♥ python插入排序的性能问题10/31
- ♥ python的os模块是什么09/23
内容反馈