前言:

朋友最近迷上了听有声小说,可是因为很多的有声小说网站都需要vip才能听,所以他想让我帮他把小说弄下来,方便他可以随时在手机上听。我在网上搜了一下他听的这部小说,的确有很多大的听书网站都需要vip才能听,所以我就找了一个小的网站,帮他把小说爬取了下来。因为他听的小说是一个很有名的作者的,为了保护作者的权益,本文的案例就没有拿这个作者的小说来进行爬取,用了另一部小说来进行爬取讲解,大概的爬取思路都是一样,所以可以借鉴本文的思路。

本案例网址:https://www.88tingshu.com/29101/

一、分析网页

本案例的这部小说一共有178个章节,所以也就对应了178个音频数据,我们需要爬取到小说的名字,每一个章节的链接地址,然后在分析每一个链接地址,找到真实的音频数据地址。如图:

网页的链接通过查看开发者工具,可以分析出网页是个html的数据网页,数据也就在html网页源码中,继续分析,随便点开一个章节链接,网页跳转到了另一个窗口,然后会自动播放该章节的小说,如图:

其实要找到该音频文件很简单,只要定位到network下的media选项就可以看到正在播放的音频数据了,如图:

从图中可以看出,该音频数据是一个m4a格式的音频数据,这个网址就是真实的音频地址,那么问题来了,只有这一个网址,也只能爬取一个章节的小说,我们的目的是爬取所有章节的小说,所以显然只知道这个小说的音频地址是没用的,下面我们就需要把这个音频地址的出处找出来,通过经验,我们可以搜索这个音频地址的后面的文件名字,

通过搜索该名字我们定位到了一个新的网页链接,如图:

可以很明显看出,和真实的音频地址是一样的,只不过缺少了**.m4a**这几个字,我们大概断定这个网页就是包含了真实音频数据的地址网页,可是这是一个新的网页地址,那么这个地址又是那里来的呢,没关系,我们继续搜索该地址试试,

可以看出我们通过搜索又定位到了一个新的网页,里面有一个iframe的标签,该标签下有一个src的属性,里面的网址和我们之前搜索的网页网址大概是一样的,只不过这个网址不全,只有网址的后半段,缺少前半段,我们只需要补全前半段就可以了,通过这一系列的分析,大概确定了,该网址就是包含了上面网址的数据网址,最后只要确定该网址是哪一个网址就行了,经过确定,该网址就是每一个章节链接的地址,这整个分析过程就算完成了,基本就可以把这个小说的有声书给爬取下来了。

现在大概说一下爬取思路,先通过小说首页把每一个章节的链接地址和小说名字给爬取下来,然后在通过爬取下来的每一个章节的链接,找到该链接地址里面的包含的另一个包含真实音频数据的小说链接,在通过这个链接找到真实的音频数据,最后保存数据。

本案例所用到的模块:

import requests
import parsel
import re
import os
from urllib.request import urlretrieve
from tqdm import tqdm

二、发送请求,获取响应数据

    def parse_url(self, url, headers):"""发送请求,获取响应数据的方法:param url::param headers::return:"""response = requests.get(url, headers=headers)if response.status_code == 200:return response.textelse:print('请求失败')

三、提取小说每个章节的链接地址

  def get_chapter_url(self, html_str):"""提取小说章节的url的方法:param html_str::return:"""html = parsel.Selector(html_str)# 提取小说章节地址列表chapter_urls = html.css('#playlist>ul>li>a::attr(href)').extract()chapter_urls = [self.SHU_TEMP_URL.format(i) for i in chapter_urls]# 提取小说名字audio_shu_name = html.css('.book-title::text').extract_first().strip()return chapter_urls, audio_shu_name

四、提取含有小说真实音频地址的链接地址

    def get_audio_temp_url(self, html_str2):"""提取含有小说真实地址的url的方法:param html_str2::return:"""html = parsel.Selector(html_str2)audio_temp_url = html.css('iframe::attr(src)').extract_first()audio_temp_url = self.SHU_TEMP_URL.format(audio_temp_url)return audio_temp_url

五、提取该地址下的真实音频数据地址

    def get_audio_url(self, html_str3):"""提取小说真实的url地址的方法:param html_str3::return:"""audio_url = re.findall("mp3:'(.*?)'", html_str3, re.S)[0]if 'm4a' in audio_url:return audio_urlelse:return audio_url + '.m4a'

六、保存音频数据

    def down_audio(self, audio_url, audio_shu_name, num):"""下载有声小说的方法:param audio_url::param audio_shu_name::param num::return:"""path = f'{audio_shu_name}'isExists = os.path.exists(path)file_path = os.path.join(path, f'{audio_shu_name}_{num}.mp3')if not isExists:os.makedirs(path, exist_ok=True)urlretrieve(audio_url, file_path)print(f"{audio_shu_name}_{num}---下载完成")else:urlretrieve(audio_url, file_path)print(f"{audio_shu_name}_{num}---下载完成")

七、具体实现逻辑思路的代码

 def run(self):"""实现主要逻辑思路:return:"""# 1.发送请求,获取响应数据html_str = self.parse_url(self.SHU_URL, self.headers)# 2.提取小说章节的urlchapter_urls, audio_shu_name = self.get_chapter_url(html_str)tqdm_chapter_urls = tqdm(chapter_urls)for num, chapter_url in enumerate(tqdm_chapter_urls):# 3.对小说章节url发送请求,获取响应数据html_str2 = self.parse_url(chapter_url, self.headers)# 4.提取含有小说真实地址的urlaudio_temp_url = self.get_audio_temp_url(html_str2)# 5.对这个url地址发送请求,获取响应数据html_str3 = self.parse_url(audio_temp_url, self.headers)# 6.提取真实的url地址audio_url = self.get_audio_url(html_str3)# 7.下载小说self.down_audio(audio_url, audio_shu_name, num + 1)

完成效果展示:


爬取听书网有声小说音频数据相关推荐

  1. Maccms苹果cmsV10内核二开听书网有声小说在线听书听书模板+源码+火车头采集+后台API自动采集

    最新苹果cms懒人听书+精仿芒果Tv超美听书模板小说源码程序自动更新 源码介绍: 苹果cms精仿芒果Tv超美听书模板源码 手机版修改logo,ting_wap/images/logo.png 电脑版修 ...

  2. 简书python_使用 Python 爬取简书网的所有文章

    01 抓取目标 我们要爬取的目标是「 简书网 」. 打开简书网的首页,随手点击一篇文章进入到详情页面. 我们要爬取的数据有:作者.头像.发布时间.文章 ID 以及文章内容. 02 准备工作 在编写爬虫 ...

  3. python 简书_python爬取简书网文章的方法

    python爬取简书网文章的方法 发布时间:2020-06-30 14:37:08 来源:亿速云 阅读:100 作者:清晨 这篇文章主要介绍python爬取简书网文章的方法,文中示例代码介绍的非常详细 ...

  4. 爬虫练习-爬取简书网热评文章

    前言: 使用多进程爬虫方法爬取简书网热评文章,并将爬取的数据存储于MongoDB数据库中 本文为整理代码,梳理思路,验证代码有效性--2020.1.17 环境: Python3(Anaconda3) ...

  5. 爬取(明星网)明星面部数据

    爬取(明星网)明星面部数据 from bs4 import BeautifulSoup import os import requests import time 1 下载数据 1.1 请求分析 Re ...

  6. 运用Scrapy框架爬取淘车网十七万二手车数据

    本篇内容将使用scrapy框架爬取淘车网所有二手车信息. 下面开始讲解下如何爬取我们想要的数据: 明确爬取目标: 首先,进入官网:https://www.taoche.com/ 进入官网发现,我们要获 ...

  7. requests+selenium 爬取企查查网,1000+条数据轻轻松松

    对于这个我们就很简答了, 我们需要获取公司的具体链接 我们根据如下链接去爬取公司的具体链接: https://blog.csdn.net/qq_44936246/article/details/120 ...

  8. 爬取虎扑网站上NBA球员数据信息

    爬虫案例的一般步骤 1.确定url地址(网页分析)爬虫程序就完成了一半 2.发送网络请求 requests(js\html\css) 3.数据解析(筛选数据) 4.保存数据(本地文件\数据库) 本次爬 ...

  9. Python爬取猪肉价格网并获取Json数据

    场景 猪肉价格网站: http://zhujia.zhuwang.cc/ 注: 博客: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获 ...

最新文章

  1. django创建项目,创建app以及调用templates(模版)和static(静态文件)的方法
  2. pyqt5入门教程(七)
  3. 《Cloudera hadoop大数据平台实战指南》此书2019年1月已上市
  4. CM: How to get the complete url of a product attachment
  5. 天天动听 半透明Menu效果
  6. C# 程序Hello World
  7. Oracle Enterprise Linux 64-bit 下Oracle11g的监听配置改动及測试步骤
  8. VB 6.0 可以使用MQTT
  9. 专业音频术语中英文对照
  10. GO及其LiteIDE踩坑
  11. 身份证转换工具类(Java)
  12. jar脱壳_软件脱壳 - Rannie` - 博客园
  13. 降级论,升维思考,降维攻击
  14. A Pose Proposal and Refinement Network for Better 6D Object Pose Estimation
  15. iOS-bug·Failed to connect to github-production-release-asset-2e65be.s3.amazonaws.com port 443:
  16. 大四java实习生的一些经历
  17. Android获取屏幕信息的几种方式
  18. GraalVM-云原生时代的JVM(Java)
  19. 程序员千万别找太漂亮的女生做女朋友
  20. ubuntu退出shell终端命令_Ubuntu下,清屏等终端常用命令

热门文章

  1. P15-Windows与网络基础-NTFS权限规则
  2. 文档布局分析工具之DIVA
  3. 春节消费观察:四种愉悦感,抓住女人心
  4. 电影天堂电视剧批量下载的地址
  5. 博士申请 | 香港中文大学(深圳)张瑞茂老师组招收计算机视觉博士/硕士/RA
  6. 美瞳赛道,只做得好看跑不赢
  7. html制作吃货网,在美食中做一个快乐的吃货
  8. Python图像处理二:图像像素的访问与数据类型
  9. 国信证券学习系列(6)
  10. OmniPlan非工作时数与额外工作时数