python2.7,下面是跑在window上的,稍作修改就可以跑在linux上。
实测win7和raspbian均可,且raspbian可以直接调用omxplayer命令进行播放。
利用百度的语音合成api进行语音播报,抓取的页面是北大未名BBS的十大。
先放抓取模块BDWM.py的代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
# -*- 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十大的版面信息与标题。
下面放语音播报模块,也是整个程序的入口:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
# -*- 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文件,便于记录和修改,格式如下:
1
2
3
4
5
6
7
|
[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抓取网页内容并进行语音播报的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/jupeizhong/article/details/51231935