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标准库sched模块使用指南
Jul 06 Python
python基本语法练习实例
Sep 19 Python
django开发教程之利用缓存文件进行页面缓存的方法
Nov 10 Python
python matplotlib绘图,修改坐标轴刻度为文字的实例
May 25 Python
python十进制和二进制的转换方法(含浮点数)
Jul 07 Python
Windows下python3.6.4安装教程
Jul 31 Python
Python正则表达式指南 推荐
Oct 09 Python
widows下安装pycurl并利用pycurl请求https地址的方法
Oct 15 Python
python列表使用实现名字管理系统
Jan 30 Python
Python tkinter三种布局实例详解
Jan 06 Python
Python OpenCV去除字母后面的杂线操作
Jul 05 Python
python小程序之飘落的银杏
Apr 17 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中用mysqli面向对象打开连接关闭mysql数据库的方法
2016/11/05 PHP
实例分析基于PHP微信网页获取用户信息
2017/11/24 PHP
PHP递归实现快速排序的方法示例
2017/12/18 PHP
用JS实现的一个include函数
2007/07/21 Javascript
用js实现下载远程文件并保存在本地的脚本
2008/05/06 Javascript
小试JQuery的AutoComplete插件
2011/05/04 Javascript
jquery随意添加移除html的实现代码
2011/06/21 Javascript
$.format,jquery.format 使用说明
2011/07/13 Javascript
gridpanel动态加载数据的实例代码
2013/07/18 Javascript
jQuery实现TAB风格的全国省份城市滑动切换效果代码
2015/08/24 Javascript
jquery通过扩展select控件实现支持enter或focus选择的方法
2015/11/19 Javascript
ES6新特性七:数组的扩充详解
2017/04/21 Javascript
nodejs入门教程三:调用内部和外部方法示例
2017/04/24 NodeJs
Vue自定义指令使用方法详解
2017/08/21 Javascript
layer子层给父层页面元素赋值,以达到向父层页面传值的效果实例
2017/09/22 Javascript
Vue 中批量下载文件并打包的示例代码
2017/11/20 Javascript
详解ES6中的三种异步解决方案
2018/06/28 Javascript
javascript实现计算指定范围内的质数示例
2018/12/29 Javascript
node.js中ws模块创建服务端和客户端,网页WebSocket客户端
2019/03/06 Javascript
VUE和Antv G6实现在线拓扑图编辑操作
2020/10/28 Javascript
Nuxt.js 静态资源和打包的操作
2020/11/06 Javascript
vue使用exif获取图片经纬度的示例代码
2020/12/11 Vue.js
Python获取任意xml节点值的方法
2015/05/05 Python
Python入门_浅谈数据结构的4种基本类型
2017/05/16 Python
Python文件操作基本流程代码实例
2017/12/11 Python
nohup后台启动Python脚本,log不刷新的解决方法
2019/01/14 Python
Python实现Event回调机制的方法
2019/02/13 Python
python处理DICOM并计算三维模型体积
2019/02/26 Python
Pop In A Box英国:Funko POP搪胶公仔
2019/05/27 全球购物
初中数学教学反思
2014/01/16 职场文书
幼儿发展评估方案
2014/06/11 职场文书
办理房产过户的委托书
2014/09/14 职场文书
夫妻分居协议书范本(有子女版)
2014/11/01 职场文书
导游词之金鞭溪风景区
2019/09/12 职场文书
FP-growth算法发现频繁项集——发现频繁项集
2021/06/24 Python
MySQL选择合适的备份策略和备份工具
2022/06/01 MySQL