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 相关文章推荐
如何解决django配置settings时遇到Could not import settings 'conf.local'
Nov 18 Python
python实现可将字符转换成大写的tcp服务器实例
Apr 29 Python
Python检测QQ在线状态的方法
May 09 Python
python中MethodType方法介绍与使用示例
Aug 03 Python
python自动发送邮件脚本
Jun 20 Python
django 实现编写控制登录和访问权限控制的中间件方法
Jan 15 Python
Python-Seaborn热图绘制的实现方法
Jul 15 Python
TensorFlow 输出checkpoint 中的变量名与变量值方式
Feb 11 Python
浅谈Python numpy创建空数组的问题
May 25 Python
python 网络编程要点总结
Jun 18 Python
Python实现PIL图像处理库绘制国际象棋棋盘
Jul 16 Python
Python实现学生管理系统并生成exe可执行文件详解流程
Jan 22 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
基于mysql的论坛(6)
2006/10/09 PHP
phpmailer在服务器上不能正常发送邮件的解决办法
2014/07/08 PHP
typecho插件编写教程(五):核心代码
2015/05/28 PHP
php mysql 封装类实例代码
2016/09/18 PHP
php版微信发红包接口用法示例
2016/09/23 PHP
php实现网页上一页下一页翻页过程详解
2019/06/28 PHP
脚本收藏iframe
2006/07/21 Javascript
JS 日期验证正则附asp日期格式化函数
2009/09/11 Javascript
Prototype源码浅析 String部分(一)之有关indexOf优化
2012/01/15 Javascript
详解JS 比较两个Json对象的值是否相等的实例
2013/11/20 Javascript
js 模式窗口(模式对话框和非模式对话框)的使用介绍
2014/07/17 Javascript
Node.js中使用socket创建私聊和公聊聊天室
2015/11/19 Javascript
Jquery和angularjs获取check框选中的值的方法汇总
2016/01/17 Javascript
jquery及js实现动态加载js文件的方法
2016/01/21 Javascript
辨析JavaScript中的Undefined类型与null类型
2016/05/26 Javascript
angularjs 实现带查找筛选功能的select下拉框实例
2017/01/11 Javascript
ES6教程之for循环和Map,Set用法分析
2017/04/10 Javascript
Web制作验证码功能实例代码
2017/06/19 Javascript
纯JS实现只能输入数字的简单代码
2017/06/21 Javascript
JavaScript实现三级联动菜单实例代码
2017/06/26 Javascript
Vue数字输入框组件示例代码详解
2020/01/15 Javascript
VUE中使用HTTP库Axios方法详解
2020/02/05 Javascript
vue.js 输入框输入值自动过滤特殊字符替换中问标点操作
2020/08/31 Javascript
Python写的Tkinter程序屏幕居中方法
2015/03/10 Python
深入浅析python中的多进程、多线程、协程
2016/06/22 Python
Python实现的多项式拟合功能示例【基于matplotlib】
2018/05/15 Python
python保存文件方法小结
2018/07/27 Python
python 删除字符串中连续多个空格并保留一个的方法
2018/12/22 Python
ansible动态Inventory主机清单配置遇到的坑
2020/01/19 Python
简单介绍一下pyinstaller打包以及安全性的实现
2020/06/02 Python
PyTorch中的拷贝与就地操作详解
2020/12/09 Python
使用CSS3在触屏上为按钮实现激活效果
2013/09/27 HTML / CSS
SKECHERS官方旗舰店:美国舒适运动休闲品牌
2017/12/22 全球购物
环保倡议书500字
2014/05/15 职场文书
出国导师推荐信
2015/03/25 职场文书
解决thinkphp6(tp6)在状态码500下不报错,或者显示错误“Malformed UTF-8 characters”的问题
2021/04/01 PHP