Python实现网页抓取与百度语音合成播报教程
本文介绍如何使用Python 2.7编写程序,从北大未名BBS抓取十大热门帖子标题,并利用百度语音合成API将文本转换为音频文件进行自动播报。文章提供了完整的抓取模块代码、语音合成入口脚本及配置文件示例,详细说明了Token获取与音频播放的实现细节,适用于Windows和Linux系统。
本示例基于Python 2.7环境开发,当前演示在Windows操作系统下运行,若需迁移至Linux平台,仅需对部分系统调用进行少量适配修改即可。
经实际测试,该方案在Windows 7及Raspbian系统上均能正常运行。特别是在Raspbian系统中,可直接调用omxplayer命令实现音频播放功能。
程序核心逻辑包括两部分:首先通过Python脚本抓取北大未名BBS(BDWM)的十大热门帖子列表,随后利用百度语音合成API将抓取到的文本内容转换为语音进行播报。
以下是负责网页数据抓取的模块代码,文件名为BDWM.py:
# -*- coding: utf-8 -*-
import urllib2
import 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 Ju
Latest Update : 2016/4/21
Function : Use Baidu Voice API to speak
'''
import urllib, urllib2
import json
import ConfigParser
import 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 it
except Exception as e:
print "ERROR!"
print e
程序中引入了config配置文件用于存储关键参数,以便于后续记录和修改配置,其标准格式如下所示:
[Baidu] client_id = HWWuh7dee6EBSAvzrOGaGNvX client_secret = G3PwLHC5aCN2TQn3GcYjhn3BmH6xgxtR token = 24.533d59e6554d133ea6bf02125bc6fa30.2592000.1463760851.282335-5802050 [Dir] mp3 = C:\Users\jupeizhong\Desktop\python2\baiduVoice\hello.mp3
配置文件中的token字段由程序自动获取并生成,用于调用百度语音接口。
以上即为利用Python抓取网页内容并结合百度API实现语音播报的完整方法分享,希望能为读者提供有价值的参考,欢迎继续支持本站获取更多技术内容。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









