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基础教程之lambda表达式使用方法
Feb 12 Python
从零学Python之入门(四)运算
May 27 Python
python使用append合并两个数组的方法
Apr 28 Python
python 接口_从协议到抽象基类详解
Aug 24 Python
详解Python在七牛云平台的应用(一)
Dec 05 Python
对Python 检查文件名是否规范的实例详解
Jun 10 Python
python的pytest框架之命令行参数详解(下)
Jun 27 Python
python Event事件、进程池与线程池、协程解析
Oct 25 Python
Python 实现OpenCV格式和PIL.Image格式互转
Jan 09 Python
Python文字截图识别OCR工具实例解析
Mar 05 Python
python为QT程序添加图标的方法详解
Mar 09 Python
python里glob模块知识点总结
Jan 05 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服务端图片生成缩略图的方法详解
2013/06/20 PHP
解析php 版获取重定向后的地址(代码)
2013/06/26 PHP
2014最热门的24个php类库汇总
2014/12/18 PHP
php+html5使用FormData对象提交表单及上传图片的方法
2015/02/11 PHP
php读取csv文件并输出的方法
2015/03/14 PHP
php file_get_contents取文件中数组元素的方法
2017/04/01 PHP
PHP实现的装箱算法示例
2018/06/23 PHP
PHP登录验证功能示例【用户名、密码、验证码、数据库、已登陆验证、自动登录和注销登录等】
2019/02/25 PHP
php面向对象基础详解【星际争霸游戏案例】
2020/01/23 PHP
php查看一个变量的占用内存的实例代码
2020/03/29 PHP
JS实现表格数据各种搜索功能的方法
2015/03/03 Javascript
javascript闭包的理解
2015/04/01 Javascript
js全选按钮的实现方法
2015/11/17 Javascript
JS鼠标拖拽实例分析
2015/11/23 Javascript
JQuery实现DIV其他动画效果的简单实例
2016/09/18 Javascript
微信小程序 教程之模板
2016/10/18 Javascript
Cpage.js给组件绑定事件的实现代码
2017/08/31 Javascript
详解JS构造函数中this和return
2017/09/16 Javascript
js合并两个数组生成合并后的key:value数组
2018/05/09 Javascript
详解mpvue scroll-view自动回弹bug解决方案
2018/10/01 Javascript
[42:25]EG vs Spirit Supermajor 败者组 BO3 第二场 6.4
2018/06/05 DOTA
详解Python中contextlib上下文管理模块的用法
2016/06/28 Python
Python实现定时精度可调节的定时器
2018/04/15 Python
Python使用Pickle模块进行数据保存和读取的讲解
2019/04/09 Python
Python 计算任意两向量之间的夹角方法
2019/07/05 Python
python日志模块logbook使用方法
2019/09/19 Python
Python Django form 组件动态从数据库取choices数据实例
2020/05/19 Python
Python 解析简单的XML数据
2020/07/24 Python
python 使用tkinter+you-get实现视频下载器
2020/11/17 Python
社会实践感言
2014/01/25 职场文书
优秀党员先进事迹材料
2014/12/18 职场文书
资料员岗位职责
2015/02/10 职场文书
人生遥控器观后感
2015/06/11 职场文书
会议新闻稿
2015/07/17 职场文书
新手开公司创业注意事项有哪些?
2019/07/29 职场文书
Python使用PyYAML库读写yaml文件的方法
2022/04/06 Python