新闻(爬取音乐和新闻)"/>
Python 实现Nao机器人点歌和听新闻(爬取音乐和新闻)
寒假放假,被留在实验室玩机器人(其实是偷懒hah),Nao机器人可以用Python写,刚好学了点Python,来来来,搞事,于是想弄个点歌和点新闻的功能(其实是看到别人的小精灵 (*^▽^*) )。首先把思路弄清楚,这两个功能不就是两个爬虫嘛。
在线点歌,先把音乐爬下来,然后再播放。点新闻,就是爬新闻然后处理成文本,让Nao读出来。
Nao点歌
其实重要的是找到音乐的API接口,楼主想加这两个功能的时候只有两天了,只能用别人找到的API(偷懒了,没自己去分析,该打!)。QQ音乐API分析过程,大家看这个分析吧。这是用的QQ音乐的API。
代码如下:
import requests
import os
import re
def play_music(song):URL1 ='=579621905&s='+song+'&limit=1&offset=0&type=song'header = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36",}url = str(requests.get(URL1,headers=header).text)url = str(re.findall(r'\"url\":\".*?"',url)).replace("['\"url\":\"", '').replace("\"\']", '') # 处理获得真实的URLt = requests.get(url, headers=header).contentfile = "music.wav" # 这里最好绝对路径,Nao机器人的路径可不好弄with open(file, "wb+") as f:f.write(t)f.close()os.system(flie) # 开始尝试用系统的播放,但是没有声音,后面会给出解决方法if __name__ == '__main__':play_music("我好想你")
有两个需要注意的地方:
一是文件的路径,Nao机器人不怎么好看路径,不能print, 只能让它读出来。(好多都是让它读出来,所以最好预先写个让Nao说话的函数)
二是音乐文件保存为wav格式,我用的是Nao 的ALAudioPlayer模块,这个必须是.ogg or .wav。不熟悉的可以看Nao alaudioplayer 文档 。
下面这行就是文件的当前路径,建议file改成这个,最好不要变,后面播放歌曲还需要这个路径,
os.path.realpath(__file__)
我们现在已经成功了一半了,把歌曲下载到了Nao机器人内部了,只剩下播放了、
然而,我最后是用指令盒实现的,有点尴尬(这个文档,看的有点累。。) 在好长时间,Nao没有半点发声后,我决定修改指令盒,来实现(本来就有个播放音乐的指令盒,为何不利用呢!)。
因为现在在家,电脑没Nao的那个软件,只能码字说明了,后期有时间会加上来的。
打开Play Sound 这个指令盒,你会发现里面还有两个指令盒,一个是利用图形化界面获取文件的路径,还有一个是播放音乐,所以我们只要偷梁换柱,把路径换掉就行了,直接利用第二个指令盒。我们前面把音乐保存的file 传过去(其实不用传,你每次都用一个路径就好了,还可以覆盖前面的文件)。然后点击开始运行,通过语音控制,说明你想要听的歌,先下载歌曲,然后再播放,达到在线点歌的功能(QQ音乐有的才能点)。
Nao播放新闻
同理和上面一样,一个爬虫。这个我们需要新闻的API,我选择的是网易新闻的API(楼主又偷了别人了API,自己没分析,23333).网易新闻API,大家可去看看这个人的。
新闻分为几类,我们就实现听不同的类的新闻,新闻的个数看自己。这里有坑!!!!
我先把代码放出来吧:
import requests
import os
import re
def find_news(mes):url = ".html"header = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36",}All = {'娱乐' : 'BA10TA81wangning','电视':'BD2A86BEwangning','电影':'BD2A9LEIwangning','明星':' BD2AB5L9wangning','音乐':'BD2AC4LMwangning','体育':'BA8E6OEOwangning','财经':'BA8EE5GMwangning','军事':'BAI67OGGwangning','军情':'DE0CGUSJwangning',}url = "/"+All[mes]+"/0-10.html"# print(url)text = str(requests.get(url,headers=header).text)title = re.findall(r"\"title\":\".*?\"",text) # 找到所有的内容URL = re.findall(r"\"url\":\".*?\"",text) # 找到所有的URLfor i in URL:try:i = str(i).replace("\"url\":", '').replace("\"", '') # 如果网址错误,或者没有相应 则下一个新闻code = requests.get(i,headers=header,timeout=3000).status_code #if str(code) != "200":continueelse:content = str(requests.get(i,header,timeout=3000).text)title = str(re.findall(r"<title>.*</title>",content)).replace('[\'<title>','').replace\('</title>\']','') # 对标题处理content = str(re.findall(r"<meta name=\"description\" content=\".*?\"",content)).replace\('[\'<meta name=\"description\" content=\"','').replace('\"\']','') # 对内容处理print(title)print(content)breakexcept:continueif __name__ == '__main__':find_news("音乐")
你会发现,用Python3跑出来一点问题都没有,但是机器人一读,就出问题!
Nao机器人是Python2.7的版本,而我用的是Python3的版本。然后弄下来的新闻乱码,乱成这样。
\xe6\x9d\xa8\xe8\xb6\x85\xe8\xb6\x8a\xe5\x81\xb6\xe9\x81\x87\xe8\x87\xaa\xe5\xb7\xb1\xe7\x9a\x84\xe4\xba\xba\xe5\xbd\xa2\xe7\xab\x8b\xe7\x89\x8c \xe6\xbf\x80\xe5\x8a\xa8\xe5\x90\x88\xe5\xbd\xb1\xe8\xa1\xa8\xe6\x83\x85\xe8\xb6\x85\xe8\x90\x8c_\xe6\x89\x8b\xe6\x9c\xba\xe7\xbd\x91\xe6\x98\x93\xe7\xbd\x91
开始我以为是编码的问题,改了几种编码,然后准备放弃(其实中途我看到过解决办法,但是感觉不是我这种情况,就退出了,气死),原因就是Python2.7的列表转字符串有问题,Python3可以正常使用!我用了正则表达式,把信息变成了列表,然后再转字符串就出问题。(大家可以试下一步一步的让机器人读出来你需要的信息,大家最后可以把标题和内容连接在一起让Nao读出来)
只需要修改一点点,原本是把列表变成字符串,现在我们用第0个,例如:str(title[0]),正则表达式也稍微修改下就好了,因为源代码没带回来,所以修改后的不能发,下回补上。
总结:
在线点歌貌似还需要完善,因为我是先缓存下来,然后播放,如果可以边接收数据边播放就更好了(悄咪咪的说句,音乐播放完了,我好像不记得删除了,占了内存(*^▽^*) ),总的来说我是利用了爬虫。
播放新闻,其实也需要改善,对众多新闻的处理,要是能实现对某个人或者某件事特定新闻的播放就好了,还需要完善。
另外我们Nao机器人舞蹈也太low了,被别人嘲笑的(我们也是用了一点心呢,好歹有几个节拍对上了),加油!!!
最后我不会忘记要学算法的, 加油ヾ(◍°∇°◍)ノ゙!!!
更多推荐
Python 实现Nao机器人点歌和听新闻(爬取音乐和新闻)
发布评论