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装饰器decorator用法实例
Nov 10 Python
Python解析树及树的遍历
Feb 03 Python
利用Python操作消息队列RabbitMQ的方法教程
Jul 19 Python
解决python中使用plot画图,图不显示的问题
Jul 04 Python
python-opencv获取二值图像轮廓及中心点坐标的代码
Aug 27 Python
用python实现英文字母和相应序数转换的方法
Sep 18 Python
简单了解为什么python函数后有多个括号
Dec 19 Python
Tensorflow 自定义loss的情况下初始化部分变量方式
Jan 06 Python
Python求凸包及多边形面积教程
Apr 12 Python
常用的10个Python实用小技巧
Aug 10 Python
Python字符串对齐、删除字符串不需要的内容以及格式化打印字符
Jan 23 Python
Python实现照片卡通化
Dec 06 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下的权限算法的实现
2007/04/28 PHP
jQuery实现炫酷的鼠标轨迹特效
2015/02/01 Javascript
比较常见的javascript中定义函数的区别
2015/11/09 Javascript
JavaScript中实现键值对应的字典与哈希表结构的示例
2016/06/12 Javascript
JS上传图片预览插件制作(兼容到IE6)
2016/08/07 Javascript
Zabbix添加Node.js监控的方法
2016/10/20 Javascript
vue中引用阿里字体图标的方法
2018/02/10 Javascript
jQuery实现菜单的显示和隐藏功能示例
2018/07/24 jQuery
vuex页面刷新后数据丢失的方法
2019/01/17 Javascript
微信小程序wepy框架学习和使用心得详解
2019/05/24 Javascript
使用webpack搭建pixi.js开发环境
2020/02/12 Javascript
[01:06:43]完美世界DOTA2联赛PWL S3 PXG vs GXR 第二场 12.19
2020/12/24 DOTA
Python下的Mysql模块MySQLdb安装详解
2014/04/09 Python
python&amp;MongoDB爬取图书馆借阅记录
2016/02/05 Python
python3音乐播放器简单实现代码
2020/04/20 Python
Python下调用Linux的Shell命令的方法
2018/06/12 Python
详解Django+Uwsgi+Nginx的生产环境部署
2018/06/25 Python
Flask web开发处理POST请求实现(登录案例)
2018/07/26 Python
python实现感知机线性分类模型示例代码
2019/06/02 Python
对python特殊函数 __call__()的使用详解
2019/07/02 Python
关于Python Tkinter Button控件command传参问题的解决方式
2020/03/04 Python
matplotlib图例legend语法及设置的方法
2020/07/28 Python
matplotlib之pyplot模块之标题(title()和suptitle())
2021/02/22 Python
Darphin迪梵官网: 来自巴黎,植物和精油调制的护肤品牌
2016/10/11 全球购物
Boda Skins皮衣官网:奢侈皮夹克,全球配送
2016/12/15 全球购物
环法自行车赛官方商店:Le Tour de France
2017/08/27 全球购物
英国美术用品购物网站:Cass Art
2019/10/08 全球购物
Linux如何为某个操作添加别名
2013/03/01 面试题
高校毕业生登记表自我鉴定
2013/11/03 职场文书
《九寨沟》教学反思
2014/04/08 职场文书
《他得的红圈圈最多》教学反思
2014/04/24 职场文书
社区两委对照检查材料
2014/08/23 职场文书
2016新年晚会开场白
2015/12/03 职场文书
2016年妇联“6﹒26国际禁毒日”宣传活动总结
2016/04/05 职场文书
2019大学生实习报告
2019/06/21 职场文书
python实现批量移动文件
2021/04/05 Python