欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-05-07 23:53:03
python2.7,下面是跑在window上的,稍作修改就可以跑在linux上。 实测win7和raspbian均可,且raspbian可以直接调用omxplayer命令...

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是由程序生成的。

以上这篇python抓取网页内容并进行语音播报的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。