Python爬虫实战案例之爬取喜马拉雅音频数据详解


Posted in Python onDecember 07, 2020

前言

喜马拉雅是专业的音频分享平台,汇集了有声小说,有声读物,有声书,FM电台,儿童睡前故事,相声小品,鬼故事等数亿条音频,我最喜欢听民间故事和德云社相声集,你呢?

今天带大家爬取喜马拉雅音频数据,一起期待吧!!

这个案例的视频地址在这里

https://v.douyu.com/show/a2JEMJj3e3mMNxml

项目目标

爬取喜马拉雅音频数据

受害者地址

https://www.ximalaya.com/

Python爬虫实战案例之爬取喜马拉雅音频数据详解

本文知识点:

1、系统分析网页性质

2、多层数据解析

3、海量音频数据保存

环境:

1.确定数据所在的链接地址(url)
2.通过代码发送url地址的请求
3.解析数据(要的, 筛选不要的)
4.数据持久化(保存)

案例思路:

1. 在静态数据中获取音频的id值

2. 发送指定id值json数据请求(src)

3. 从json数据中解析音频所对应的URL地址 开始写代码

先导入所需的模块

import requests
import parsel # 数据解析模块
import re

1.确定数据所在的链接地址(url) 逆向分析 网页性质(静态网页/动态网页)

打开开发者工具,播放一个音频,在Madie里面可以找到一个数据包

Python爬虫实战案例之爬取喜马拉雅音频数据详解

复制URL,搜索

Python爬虫实战案例之爬取喜马拉雅音频数据详解

找到ID值

Python爬虫实战案例之爬取喜马拉雅音频数据详解

继续搜索,找到请求头参数

Python爬虫实战案例之爬取喜马拉雅音频数据详解

url = 'https://www.ximalaya.com/youshengshu/4256765/p{}/'.format(page)
headers = {
 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'}

2.通过代码发送url地址的请求

response = requests.get(url=url, headers=headers)
html_data = response.text

3.解析数据(要的, 筛选不要的) 解析音频的 id值

selector = parsel.Selector(html_data)
lis = selector.xpath('//div[@class="sound-list _is"]/ul/li')

for li in lis:
 try:
  title = li.xpath('.//a/@title').get() + '.m4a'
  href = li.xpath('.//a/@href').get()
  # print(title, href)

  m4a_id = href.split('/')[-1]
  # print(href, m4a_id)

  # 发送指定id值json数据请求(src)
  json_url = 'https://www.ximalaya.com/revision/play/v1/audio?id={}&ptype=1'.format(m4a_id)
  json_data = requests.get(url=json_url, headers=headers).json()
  # print(json_data)

  # 提取音频地址
  m4a_url = json_data['data']['src']
  # print(m4a_url)

  # 请求音频数据
  m4a_data = requests.get(url=m4a_url, headers=headers).content

  new_title = change_title(title)

4.数据持久化(保存)

with open('video\\' + new_title, mode='wb') as f:
 f.write(m4a_data)
 print('保存完成:', title)

最后还要处理文件名非法字符

def change_title(title):
 pattern = re.compile(r"[\/\\\:\*\?\"\<\>\|]") # '/ \ : * ? " < > |'
 new_title = re.sub(pattern, "_", title) # 替换为下划线
 return new_title

完整代码

import re

import requests
import parsel # 数据解析模块


def change_title(title):
 """处理文件名非法字符的方法"""
 pattern = re.compile(r"[\/\\\:\*\?\"\<\>\|]") # '/ \ : * ? " < > |'
 new_title = re.sub(pattern, "_", title) # 替换为下划线
 return new_title


for page in range(13, 33):
 print('---------------正在爬取第{}页的数据----------------'.format(page))
 # 1.确定数据所在的链接地址(url) 逆向分析 网页性质(静态网页/动态网页)
 url = 'https://www.ximalaya.com/youshengshu/4256765/p{}/'.format(page)
 headers = {
  'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'}

 # 2.通过代码发送url地址的请求
 response = requests.get(url=url, headers=headers)
 html_data = response.text
 # print(html_data)

 # 3.解析数据(要的, 筛选不要的) 解析音频的 id值
 selector = parsel.Selector(html_data)
 lis = selector.xpath('//div[@class="sound-list _is"]/ul/li')

 for li in lis:
  try:
   title = li.xpath('.//a/@title').get() + '.m4a'
   href = li.xpath('.//a/@href').get()
   # print(title, href)

   m4a_id = href.split('/')[-1]
   # print(href, m4a_id)

   # 发送指定id值json数据请求(src)
   json_url = 'https://www.ximalaya.com/revision/play/v1/audio?id={}&ptype=1'.format(m4a_id)
   json_data = requests.get(url=json_url, headers=headers).json()
   # print(json_data)

   # 提取音频地址
   m4a_url = json_data['data']['src']
   # print(m4a_url)

   # 请求音频数据
   m4a_data = requests.get(url=m4a_url, headers=headers).content

   new_title = change_title(title)
   # print(new_title)

   # 4.数据持久化(保存)
   with open('video\\' + new_title, mode='wb') as f:
    f.write(m4a_data)
    print('保存完成:', title)
  except:
   pass

运行代码,效果如下图

Python爬虫实战案例之爬取喜马拉雅音频数据详解

到此这篇关于Python爬虫实战案例之取喜马拉雅音频数据详解的文章就介绍到这了,更多相关Python爬取喜马拉雅音频数据内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python内置函数bin() oct()等实现进制转换
Dec 30 Python
深入Python解释器理解Python中的字节码
Apr 01 Python
编写Python脚本批量下载DesktopNexus壁纸的教程
May 06 Python
Python 读写文件和file对象的方法(推荐)
Sep 12 Python
Python利用递归和walk()遍历目录文件的方法示例
Jul 14 Python
python实现简易数码时钟
Feb 19 Python
python利用Tesseract识别验证码的方法示例
Jan 21 Python
将python包发布到PyPI和制作whl文件方式
Dec 25 Python
Python list运算操作代码实例解析
Jan 20 Python
python datetime处理时间小结
Apr 16 Python
flask开启多线程的具体方法
Aug 02 Python
PyTorch中clone()、detach()及相关扩展详解
Dec 09 Python
用python对excel查重
Dec 07 #Python
python3 通过 pybind11 使用Eigen加速代码的步骤详解
Dec 07 #Python
python 通过 pybind11 使用Eigen加速代码的步骤
Dec 07 #Python
Python中BeautifulSoup通过查找Id获取元素信息
Dec 07 #Python
BeautifulSoup中find和find_all的使用详解
Dec 07 #Python
python爬虫beautifulsoup解析html方法
Dec 07 #Python
python可视化 matplotlib画图使用colorbar工具自定义颜色
Dec 07 #Python
You might like
用php的ob_start来生成静态页面的方法分析
2011/03/09 PHP
PHP 将逗号、空格、回车分隔的字符串转换为数组的函数
2012/06/07 PHP
php插入排序法实现数组排序实例
2015/02/16 PHP
PHP实现字符串的全排列详解
2019/04/24 PHP
dojo 之基础篇(三)之向服务器发送数据
2007/03/24 Javascript
调用js时ie6和ie7,ff的区别
2009/08/19 Javascript
使用Post提交时须将空格转换成加号的解释
2013/01/14 Javascript
js实现具有高亮显示效果的多级菜单代码
2015/09/01 Javascript
Bootstrap图片轮播组件使用实例解析
2016/06/30 Javascript
Vue2.0如何发布项目实战
2017/07/27 Javascript
详解react关于事件绑定this的四种方式
2018/03/09 Javascript
JS弹窗 JS弹出DIV并使整个页面背景变暗功能的实现代码
2018/04/21 Javascript
详解vue2.0监听属性的使用心得及搭配计算属性的使用
2018/07/18 Javascript
JavaScript实时更新当前的时间的示例代码
2020/07/15 Javascript
微信小程序实现左滑删除效果
2020/11/18 Javascript
python采用getopt解析命令行输入参数实例
2014/09/30 Python
pymongo给mongodb创建索引的简单实现方法
2015/05/06 Python
Python的面向对象编程方式学习笔记
2016/07/12 Python
Python实现批量检测HTTP服务的状态
2016/10/27 Python
Python安装官方whl包和tar.gz包的方法(推荐)
2017/06/04 Python
Python 经典面试题 21 道【不可错过】
2018/09/21 Python
python输入整条数据分割存入数组的方法
2018/11/13 Python
python3使用QQ邮箱发送邮件
2020/05/20 Python
Python Selenium 设置元素等待的三种方式
2020/03/18 Python
python 从list中随机取值的方法
2020/11/16 Python
使用Python+Appuim 清理微信的方法
2021/01/26 Python
科尔士百货公司官网:Kohl’s
2016/07/11 全球购物
室内设计专业个人的自我评价
2013/12/18 职场文书
节约电力资源的建议书
2014/03/12 职场文书
老公保证书范文
2014/04/29 职场文书
老龄工作先进事迹
2014/08/15 职场文书
债务授权委托书范本
2014/10/17 职场文书
终止劳动合同证明书样本
2014/11/19 职场文书
2015年医院工作总结范文
2015/04/09 职场文书
2015年政治教研组工作总结
2015/07/22 职场文书
Python可视化神器pyecharts绘制地理图表
2022/07/07 Python