下载小说并转成语音

最近迷上听小说了,但几个app上有声小说更新太慢,自己看小说的话不能同时去做其他事情,所以想了个办法从网上下载小说并将文字转换成语音。以后其他小说只需要改改下载小说地址即可。故写在博客上供以后使用。

一、main.py

from spider import Spider
from txt import Txt
from mp3 import Mp3

if __name__ == '__main__':
    clsSpider = Spider()
    clsTxt = Txt()
    clsMp3 = Mp3()
    dictTitle = clsSpider.getTitle()
    print(dictTitle)
    i = 0
    filename = ''
    for title in dictTitle:
        filename = '%05d-%s' % (i, dictTitle[title])
        if clsTxt.existTxt(filename) and clsMp3.existMp3(filename):
            i = i + 1
            continue
        content = clsSpider.getContent(title)
        if (content is None) or (len(content) == 0):
            i = i + 1
            continue
        if clsTxt.existTxt(filename) is False:
            clsTxt.writeTxt(filename, content)
        if clsMp3.existMp3(filename) is False:
            clsMp3.writMp3(filename, content)
        i = i + 1

二、spider.py

import requests
from bs4 import BeautifulSoup

class Spider(object):
    def __init__(self):
        self.session = requests.session()

    def __del__(self):
        self.session.close()

    def getTitle(self):
        dictTitle = {}
        soup = None
        try:
            req = self.session.get('https://www.xxxxxx.com/xx/x/xxx/')
            req.encoding = 'utf-8'
            soup = BeautifulSoup(req.text, 'html.parser')
            for a in soup.select('#list dd a'):
                dictTitle[a['href']] = a.text.strip()
            return dictTitle
        except:
            print('获取章节列表失败!')
            dictTitle.clear()
            return None
        finally:
            if soup != None:
                soup.clear()

    def getContent(self, url):
        soup = None
        try:
            req = self.session.get('https://www.xxxxxx.com/xx/x/xxx/' + url)
            req.encoding = 'utf-8'
            soup = BeautifulSoup(req.text, 'html.parser')
            return soup.select_one('#content').text.strip()
        except:
            print('获取[https://www.xxxxxx.com/xx/x/xxx/%s]内容异常!' % url)
            return None
        finally:
            if soup != None:
                soup.clear()

三、txt.py

import os

class Txt(object):
    def __init__(self):
        if os.path.exists('txt') is False:
            os.mkdir('txt')

    def existTxt(self, title):
        return os.path.exists('txt\\%s.txt' % title)

    def writeTxt(self, title, content):
        try:
            with open('txt\\%s.txt' % title, 'wb') as f:
                f.write(content.encode('utf-8'))
        except:
            print('写入文件txt\\%s.txt异常!' % title)

四、mp3.py

import os
from aip import AipSpeech

class Mp3(object):
    def __init__(self):
        self.client = AipSpeech('xxx', 'xxx', 'xxx')
        if os.path.exists('mp3') is False:
            os.mkdir('mp3')

    def existMp3(self, title):
        return os.path.exists('mp3\\%s.mp3' % title)

    def writMp3(self, title, content):
        try:
            pos = 0
            msg = ''
            while(pos < len(content)):
                msg = content[pos:pos+1000]
                while(True):
                    try:
                        result = self.client.synthesis(msg)
                        if not isinstance(result, dict):
                            with open('mp3\\%s.mp3' % title, 'ab+') as f:
                                f.write(result)
                                break
                        else:
                            print(result)
                    except:
                        print('1')
                pos = pos + 1000
        except:
            print('写入文件mp3\\%s.mp3异常!' % title)

 

posted @ 2019-06-30 12:54  七月流光  阅读(1219)  评论(1编辑  收藏  举报