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 相关文章推荐
git使用.gitignore设置不生效或不起作用问题的解决方法
Jun 01 Python
Python实现的计数排序算法示例
Nov 29 Python
Python中XlsxWriter模块简介与用法分析
Apr 24 Python
关于 Python opencv 使用中的 ValueError: too many values to unpack
Jun 28 Python
Python进阶:生成器 懒人版本的迭代器详解
Jun 29 Python
关于Python 的简单栅格图像边界提取方法
Jul 05 Python
python实现桌面托盘气泡提示
Jul 29 Python
用Python调用win命令行提高工作效率的实例
Aug 14 Python
零基础学Python之前需要学c语言吗
Jul 21 Python
详解python的super()的作用和原理
Oct 29 Python
python利用pytesseract 实现本地识别图片文字
Dec 14 Python
python+selenium爬取微博热搜存入Mysql的实现方法
Jan 27 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防注入代码
2010/04/07 PHP
JS 时间显示效果代码
2009/08/23 Javascript
WEB 浏览器兼容 推荐收藏
2010/05/14 Javascript
jQuery实现手机号码输入提示功能实例
2015/04/30 Javascript
jQuery实现自定义右键菜单的树状菜单效果
2015/09/02 Javascript
jQuery选择器及jquery案例详解(必看)
2016/05/20 Javascript
深入浅析JS Function()构造函数
2016/08/22 Javascript
jquery自定义表单验证插件
2016/10/12 Javascript
浅谈angularjs module返回对象的坑(推荐)
2016/10/21 Javascript
使用node.js中的Buffer类处理二进制数据的方法
2016/11/26 Javascript
Vue数组更新及过滤排序功能
2017/08/10 Javascript
基于ES6 Array.of的用法(实例讲解)
2017/09/05 Javascript
js中如何完美的解析数据
2018/03/18 Javascript
bootstrap-table实现表头固定以及列固定的方法示例
2019/03/07 Javascript
微信小程序 WXML节点信息查询详解
2019/07/29 Javascript
小程序使用wxs解决wxml保留2位小数问题
2019/12/13 Javascript
python实现文件快照加密保护的方法
2015/06/30 Python
基于python OpenCV实现动态人脸检测
2018/05/25 Python
解决pycharm每次新建项目都要重新安装一些第三方库的问题
2019/01/17 Python
浅谈python3.6的tkinter运行问题
2019/02/22 Python
ubuntu 16.04下python版本切换的方法
2019/06/14 Python
python pandas dataframe 去重函数的具体使用
2020/07/20 Python
健身场所或家用健身设备:Life Fitness
2017/11/01 全球购物
META-INF文件夹中的MANIFEST.MF的作用
2016/06/21 面试题
中学生团员自我评价分享
2013/12/07 职场文书
家长评语和期望
2014/02/10 职场文书
《守株待兔》教学反思
2014/03/01 职场文书
班组长岗位职责
2014/03/03 职场文书
师恩难忘教学反思
2014/04/27 职场文书
个人遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
安全生产月宣传标语
2014/10/06 职场文书
领导工作表现评语
2015/01/04 职场文书
2015年电气技术员工作总结
2015/07/24 职场文书
生活委员竞选稿
2015/11/21 职场文书
2016七夕情人节感言
2015/12/09 职场文书
党员公开承诺书2016
2016/03/24 职场文书