教你如何实现只需一个MP3就能达到看小说的效果

原标题:运用Python爬虫下载有声小说

前言:

小编开头这样写除了是为了吸引读者的眼球之外,事实上也是如此,我们只需把我们自己想听的小说mp3下载到内存卡中,然后准备一个耳机和MP3就行了。为什么是MP3呢?小编觉得MP3虽然没有手机功能多,但是它的质量比较轻,便于携带。

在这里插入图片描述

1.需要的几个Python模块

seleniumrequests(urllib也可)、lxml(bs4也可)、os模块,用到了selenium模块,是为了得到一个.mp3文件的下载网址。

2.实现过程

首先,需要来到这个网址:有声网
读者可以在输入框中输入关键字,并进行搜索,最终来到的那个界面网址如下,小编输入的是 : 斗破苍穹
https://www.tingshubao.com/search.asp
很显然,这里这个网址是不变的。
在Network打开这个网址,发现,这是一个post请求
在这里插入图片描述
在这里插入图片描述
因为小编对于post请求还不是很理解,所以小编这里直接用selenium来得到这个界面的内容。
参考代码如下:

driver=webdriver.Chrome()
driver.get(url='https://www.tingshubao.com/')
driver.implicitly_wait(30)

keyword=input('请输入想听的书的名称:')
driver.find_elements_by_xpath('.//form[@id="formsearch"]/input')[0].send_keys(keyword)  # 输入框

driver.find_elements_by_xpath('.//form[@id="formsearch"]/input')[1].click()  # 搜索按钮

text=driver.page_source  # 搜索得到的内容

driver.close()  # 关闭浏览器

通过这样就可以搜索结果界面的内容了。
之后就是将搜索得到的内容进行解析了,如下:
在这里插入图片描述
参考代码如下:小编用的是xpath

html=etree.HTML(text)

L2=html.xpath('.//ul[@class="list-works"]/li')  # 列表类型

L3=list()
for i in range(len(L2)):
    L3.append(L2[i].xpath('./dl[@class="list-works-dl"]/dt/a/@href')[0])   # 进入这本书的网址
    print('【{}】----{}'.format(i+1,L2[i].xpath('./dl[@class="list-works-dl"]/dt/a/text()')[0]))  # 标题
    print(L2[i].xpath('./dl[@class="list-works-dl"]/dd[@class="list-book-des"]/text()')[0]) # 书的简介
    text2=L2[i].xpath('./dl[@class="list-works-dl"]/dd[@class="list-book-cs"]/span/text()')  # 书的作者,完结与否 等信息,
    print('作者:{}  录制人:{} 状态:{} 出版时间:{}'.format(text2[0],text2[1],text2[2],text2[3]))
    print('*'*86)

运行结果如下:
在这里插入图片描述
是不是和网址上面的内容一摸一样啊!
然后,我们就可以进到这个界面了
在这里插入图片描述

在这里插入图片描述
通过比较,可以发现不同集数之间的网址只不过一两个数字不同而已,这可以用到字符串的拼接和格式化操作即可,参考代码如下:

id=int(input('请输入你想听的序号:(只能1~~{})'.format(len(L2))))

#### 爬取想听的书的的内容

url='https://www.tingshubao.com'+L3[id-1]
headers={
    
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3756.400 QQBrowser/10.5.4039.400'}
html2=requests.get(url=url,headers=headers)
html2=etree.HTML(html2.text)
L4=html2.xpath('.//div[@id="playlist"]/ul/li')  # 列表类型,列表的长度即为总集数

url2=L4[0].xpath('./a/@href')[0]
url3=url2[:url2.rfind('-')+1]


## 下载阶段

id=input('请输入你想下载的集数范围(如1~{})基本格式为 1,10 表示下载1·10集 :'.format(len(L4)))
id=id.split(',')
id1,id2=int(id[0]),int(id[1])

url5='https://www.tingshubao.com'+url3+'{}.html'.format(id1-1)

在这里插入图片描述

2.1 怎样才能使自己选择的内容全部下载成功

我们选择其中的一集进行播放,可以发现,在代码中含有这一集.mp3的下载网址,如下:
在这里插入图片描述
但是如果我们点击查看源代码却搜索不到这个下载网址,可以想到这里应该用到了动态加载,我们点击Network里面的XHR,按F5刷新,可以发现这里有这个.mp3的下载网址,但是这个不容易得到。
在这里插入图片描述
于是小编想到了应用selenium来得到这个.mp3文件的下载网址,不过,在具体代码运行的过程中又出现了有个时候得不到这个网址的情况,本来是想直接运用 for循环 ,然后里面调用已经定义好的方法(这个方法是为了得到网址内部的.mp3文件的下载地址),最后当然还需要关闭那个浏览器,不然自己电脑的任务栏上就会又许多浏览器的图标。
总觉得这种方式有缺点,那就是有个时候哪个.mp3的下载地址还没有获取,就已经关闭浏览器了,这或许就是上面为什么得不到那个下载网址的原因了吧!但是,怎么解决呢?小编想了一会,觉得这样可以应该可以,后面测试好像也的确还行,但就是代码量会比之前的多一些罢了。
那就是首先打开一个浏览器,进行得到.mp3文件下载网址的操作,不要急着关闭浏览器,然后进到 for循环里面,继续进行得到.mp3文件下载网址的操作,然后关闭之前的那个浏览器,并将 变量e 重新赋值为此时的这个浏览器,当 for循环结束后,关闭最后的那个浏览器。
参考代码如下:

L5=getDownload_url(url=url5)
href=L5[0].get_attribute('src')
e=L5[1]
Download(url=href,path=path+'./第{}集.mp3'.format(id1))
print('---已下载第{}集'.format(id1))

for i in range(id1,id2):
    url4='https://www.tingshubao.com'+url3+'{}.html'.format(i)  # 字符串的拼接
    L5=getDownload_url(url=url4)
    e.close()
    href=L5[0].get_attribute('src')
    Download(url=href,path=path+'./第{}集.mp3'.format(i+1))
    print('---已下载第{}集'.format(i+1))
    e=L5[1]

e.close()  # 关闭最后一次打开的浏览器
print('下载完毕!')

注意:如果第一次运行出错了,那么应该重新运行程序。

3. 参考代码和运行结果

参考代码已经上传到github,代码链接为:有声网.py
运行结果如下:

运用Python爬虫下载有声小说

4.总结

注意:下载内容的文件夹和运行程序在同一个文件夹下面。
这是小编写了一上午的内容,如果读者觉得小编的这篇文章还不错的话!记得给小编点上一个小小的赞,小编在此谢谢了,同时,如果有读者对于代码有不懂的地方,也可以留言,如果小编看到,会第一时间进行解答的,当然,或许这个解答小编不是很全面,但小编会努力的。

猜你喜欢

转载自blog.csdn.net/qq_45404396/article/details/108043455