python抓取网页内容并进行语音播报的方法
Python  /  管理员 发布于 6年前   229
python2.7,下面是跑在window上的,稍作修改就可以跑在linux上。
实测win7和raspbian均可,且raspbian可以直接调用omxplayer命令进行播放。
利用百度的语音合成api进行语音播报,抓取的页面是北大未名BBS的十大。
先放抓取模块BDWM.py的代码:
# -*- coding: utf-8 -*-import urllib2import HTMLParser class MyParser(HTMLParser.HTMLParser): def __init__(self): HTMLParser.HTMLParser.__init__(self) self.nowtag = '' self.count = 0 self.flag = False self.isLink = False self.count2 = 0 self.dict = {} self.temp = '' def handle_starttag(self, tag, attrs): if tag == 'span': for key, value in attrs: if key == 'class' and ('Rank1AmongHisBoard' in value): self.count += 1 if self.count < 11: self.flag = True if tag == 'a': self.isLink = True else: self.isLink = False def handle_data(self, data): if self.flag and self.isLink: self.count2 += 1 if self.count2 == 1: self.temp = data if self.count2 == 3: self.flag = False self.count2 = 0 self.dict[self.temp] = data res = urllib2.urlopen('https://www.bdwm.net/bbs/main0.php')my = MyParser()my.feed(res.read().decode("gbk"))result = ''str = " 版 "str = str.decode('utf8')for i in my.dict: result += i + str + my.dict[i] + '\n'print result
F5运行,抓取结果如下:
>>> ======================= RESTART =======================
>>>
化学与分子工程学院 版 不喜欢做实验怎么办
三角地 版 烈士旅正在对对研究生会实施最高军事占领的
十六周年站庆 版 ★★毕业季 | 未名BBS历年纪念品特卖会★★
遗迹保卫 版 母校两日游,想借个饭卡
别问我是谁 版 遇到性骚扰,打电话跟男朋友倾诉……
美食天地 版 请问北大附近哪里有好吃的饺子
男孩子 版 被戴绿帽,万念俱灰!
鹊桥 版 医生mm征GG(#征男友#代征)
谈情说爱 版 # 感觉身边都是嘴上急着脱光但心里不急的人 #
北京大学研究生会 版 农园一层和自称“常代会”的占座女吵起来了(转载)(转载)
可以看到我们成功抓取到了未名BBS十大的版面信息与标题。
下面放语音播报模块,也是整个程序的入口:
# -*- coding: utf-8 -*-'''Author : Peizhong JuLatest Update : 2016/4/21Function : Use Baidu Voice API to speak'''import urllib, urllib2import jsonimport ConfigParserimport BDWM config = ConfigParser.ConfigParser()config.readfp(open('config.ini'))TOKEN = config.get('Baidu', 'token')local = config.get('Dir', 'mp3')words = '' def GetVoice(): text = urllib.quote(words) url = 'http://tsn.baidu.com/text2audio?tex=' + text + '&cuid=b888e32e868c&lan=zh&ctp=1&tok=' + TOKEN rep = urllib.urlretrieve(url, local) CheckError() def GetAccessToken(): client_id = config.get('Baidu', 'client_id') client_secret = config.get('Baidu', 'client_secret') rep = urllib2.urlopen('https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id='+client_id+'&client_secret='+client_secret) hjson = json.loads(rep.read()) return hjson['access_token'] def CheckError(): global TOKEN file_object = open(local) try: all_the_text = file_object.read() if (all_the_text[0] == '{'): hjson = json.loads(all_the_text) #print hjson['err_no'] if (hjson['err_no'] == 502): print 'Getting new access token...' TOKEN = GetAccessToken() config.set('Baidu', 'token', TOKEN) config.write(open('config.ini', "r+")) GetVoice() else: print all_the_text else: print '[success] ' + words finally: file_object.close() try: words = BDWM.result.encode('utf8') GetVoice() # use other software to play itexcept Exception as e: print "ERROR!" print e
当中我们用到了config文件,便于记录和修改,格式如下:
[Baidu]client_id = HWWuh7dee6EBSAvzrOGaGNvXclient_secret = G3PwLHC5aCN2TQn3GcYjhn3BmH6xgxtRtoken = 24.533d59e6554d133ea6bf02125bc6fa30.2592000.1463760851.282335-5802050 [Dir]mp3 = C:\Users\jupeizhong\Desktop\python2\baiduVoice\hello.mp3
其中token是由程序生成的。
以上这篇python抓取网页内容并进行语音播报的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..路人 在
php中使用hyperf框架调用讯飞星火大模型实现国内版chatgpt功能示例中评论 教程很详细,如果加个前端chatgpt对话页面就完美了..Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号