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的线程来解决生产者消费问题的示例
Apr 02 Python
python中dir函数用法分析
Apr 17 Python
解决phantomjs截图失败,phantom.exit位置的问题
May 17 Python
python将.ppm格式图片转换成.jpg格式文件的方法
Oct 27 Python
python写入文件自动换行问题的方法
Jul 05 Python
python 实现多维数组转向量
Nov 30 Python
使用Tkinter制作信息提示框
Feb 18 Python
appium+python adb常用命令分享
Mar 06 Python
使用python客户端访问impala的操作方式
Mar 28 Python
Python异常处理机制结构实例解析
Jul 23 Python
PyTorch如何搭建一个简单的网络
Aug 24 Python
python rsa-oaep加密的示例代码
Sep 23 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中一个有意思的日期逻辑处理
2012/03/25 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十)
2014/06/24 PHP
详解PHP函数 strip_tags 处理字符串缺陷bug
2017/06/11 PHP
EXT窗口Window及对话框MessageBox
2011/01/27 Javascript
JS动态创建Table,Tr,Td并赋值的具体实现
2013/07/05 Javascript
js中top的作用深入剖析
2014/03/04 Javascript
javascript中拼接HTML字符串的最快、最好的方法
2014/06/07 Javascript
js选项卡的实现方法
2015/02/09 Javascript
jQuery实现调整表格单列顺序完整实例
2016/06/20 Javascript
connection reset by peer问题总结及解决方案
2016/10/21 Javascript
Vue2.0使用过程常见的一些问题总结学习
2017/04/10 Javascript
element-ui表格列金额显示两位小数的方法
2018/08/24 Javascript
NodeJS如何实现同步的方法示例
2018/08/24 NodeJs
javascript原型链学习记录之继承实现方式分析
2019/05/01 Javascript
Node 模块原理与用法详解
2020/05/13 Javascript
Vue微信公众号网页分享的示例代码
2020/05/28 Javascript
javascript实现简易计算器功能
2020/09/23 Javascript
JavaScript实现轮播图效果
2020/10/30 Javascript
vue监听滚动事件的方法
2020/12/21 Vue.js
[50:27]Secret vs VG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
轻松掌握python设计模式之访问者模式
2016/11/18 Python
利用Python-iGraph如何绘制贴吧/微博的好友关系图详解
2017/11/02 Python
详解Django+Uwsgi+Nginx的生产环境部署
2018/06/25 Python
django 多对多表的创建和插入代码实现
2019/09/09 Python
python tornado使用流生成图片的例子
2019/11/18 Python
python3 Scrapy爬虫框架ip代理配置的方法
2020/01/17 Python
jupyter notebook 多环境conda kernel配置方式
2020/04/10 Python
Python脚本打包成可执行文件过程解析
2020/10/20 Python
Linux开机引导的步骤是什么
2014/02/26 面试题
机电专业大学生职业规划书范文
2014/02/25 职场文书
幼儿园父亲节活动方案
2014/03/11 职场文书
班级旅游计划书
2014/05/03 职场文书
新学期开学演讲稿
2014/05/24 职场文书
环保宣传标语
2014/06/12 职场文书
试用期解除劳动合同通知书
2015/04/16 职场文书
nginx结合openssl实现https的方法
2021/07/25 Servers