python抓取网页内容并进行语音播报的方法

作者:jupeizhong 时间:2021-03-08 14:02:53 

python2.7,下面是跑在window上的,稍作修改就可以跑在linux上。

实测win7和raspbian均可,且raspbian可以直接调用omxplayer命令进行播放。

利用百度的语音合成api进行语音播报,抓取的页面是北大未名BBS的十大。

先放抓取模块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是由程序生成的。

来源:https://blog.csdn.net/jupeizhong/article/details/51231935

标签:python,语音,播报
0
投稿

猜你喜欢

  • 编写SQL Server的扩展存储过程实例

    2009-01-20 15:45:00
  • python封装成exe的超详细教程

    2021-07-30 14:46:20
  • python pandas模块基础学习详解

    2022-11-06 22:45:58
  • python相对企业语言优势在哪

    2021-08-27 23:37:21
  • ThinkPHP5&5.1实现验证码的生成、使用及点击刷新功能示例

    2023-11-17 02:54:39
  • python实现定时自动备份文件到其他主机的实例代码

    2023-04-26 09:30:52
  • MySQL定位并优化慢查询sql的详细实例

    2024-01-25 20:32:16
  • pytorch 常用函数 max ,eq说明

    2023-06-25 11:09:21
  • Python pickle类库介绍(对象序列化和反序列化)

    2021-12-31 00:28:33
  • javascript仿qq界面的折叠菜单实现代码

    2024-06-12 17:12:49
  • 自动更新程序的设计框架

    2009-08-12 13:00:00
  • python画一个玫瑰和一个爱心

    2023-03-24 11:33:28
  • JS获取页面窗口实际大小函数

    2008-01-28 13:18:00
  • sql server 复制表从一个数据库到另一个数据库

    2024-01-18 23:51:55
  • python正则表达式之re.match()与re.search()的用法及区别

    2022-05-14 13:21:46
  • 解析SQL Server中SQL日期转换出错的原因

    2024-01-15 16:34:17
  • AES算法 asp源码

    2009-08-28 13:05:00
  • Python编程中的文件操作攻略

    2022-12-08 10:49:54
  • 前端面试之输入npm run后执行原理

    2024-05-05 09:21:55
  • 设计性能更优MySQL数据库schema

    2024-01-28 22:22:49
  • asp之家 网络编程 m.aspxhome.com