前言

喜马拉雅是专业的音频分享平台,汇集了有声小说,有声读物,有声书,FM电台,儿童睡前故事,相声小品,鬼故事等数亿条音频,我最喜欢听民间故事和德云社相声集,你呢?

今天带大家爬取喜马拉雅音频数据,一起期待吧!!

这个案例的视频地址在这里

  1. https://v.douyu.com/show/a2JEMJj3e3mMNxml

项目目标

爬取喜马拉雅音频数据

受害者地址

  1. https://www.ximalaya.com/

本文知识点:

  • 1、系统分析网页性质
  • 2、多层数据解析
  • 3、海量音频数据保存

环境:

  • python 3.6
  • pycharm
  • requests
  • parsel

思路:(爬虫案例)

  • 1.确定数据所在的链接地址(url)
  • 2.通过代码发送url地址的请求
  • 3.解析数据(要的, 筛选不要的)
  • 4.数据持久化(保存)

案例思路:

  • 1. 在静态数据中获取音频的id值
  • 2. 发送指定id值json数据请求(src)
  • 3. 从json数据中解析音频所对应的URL地址

开始写代码

先导入所需的模块

  1. import requests
  2. import parsel # 数据解析模块
  3. import re

1.确定数据所在的链接地址(url) 逆向分析 网页性质(静态网页/动态网页)

打开开发者工具,播放一个音频,在Madie里面可以找到一个数据包

复制URL,搜索

找到ID值

继续搜索,找到请求头参数

  1. url = 'https://www.ximalaya.com/youshengshu/4256765/p{}/'.format(page)
  2. headers = {
  3. '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地址的请求

  1. response = requests.get(url=url, headers=headers)
  2. html_data = response.text

3.解析数据(要的, 筛选不要的) 解析音频的 id值

  1. selector = parsel.Selector(html_data)
  2. lis = selector.xpath('//div[@class="sound-list _is"]/ul/li')
  3.  
  4. for li in lis:
  5. try:
  6. title = li.xpath('.//a/@title').get() + '.m4a'
  7. href = li.xpath('.//a/@href').get()
  8. # print(title, href)
  9.  
  10. m4a_id = href.split('/')[-1]
  11. # print(href, m4a_id)
  12.  
  13. # 发送指定id值json数据请求(src)
  14. json_url = 'https://www.ximalaya.com/revision/play/v1/audio?id={}&ptype=1'.format(m4a_id)
  15. json_data = requests.get(url=json_url, headers=headers).json()
  16. # print(json_data)
  17.  
  18. # 提取音频地址
  19. m4a_url = json_data['data']['src']
  20. # print(m4a_url)
  21.  
  22. # 请求音频数据
  23. m4a_data = requests.get(url=m4a_url, headers=headers).content
  24.  
  25. new_title = change_title(title)

4.数据持久化(保存)

  1. with open('video\\' + new_title, mode='wb') as f:
  2. f.write(m4a_data)
  3. print('保存完成:', title)

最后还要处理文件名非法字符

  1. def change_title(title):
  2. pattern = re.compile(r"[\/\\\:\*\?\"\<\>\|]") # '/ \ : * ? " < > |'
  3. new_title = re.sub(pattern, "_", title) # 替换为下划线
  4. return new_title

完整代码

  1. import re
  2.  
  3. import requests
  4. import parsel # 数据解析模块
  5.  
  6. def change_title(title):
  7. """处理文件名非法字符的方法"""
  8. pattern = re.compile(r"[\/\\\:\*\?\"\<\>\|]") # '/ \ : * ? " < > |'
  9. new_title = re.sub(pattern, "_", title) # 替换为下划线
  10. return new_title
  11.  
  12. for page in range(13, 33):
  13. print('---------------正在爬取第{}页的数据----------------'.format(page))
  14. # 1.确定数据所在的链接地址(url) 逆向分析 网页性质(静态网页/动态网页)
  15. url = 'https://www.ximalaya.com/youshengshu/4256765/p{}/'.format(page)
  16. headers = {
  17. 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'}
  18.  
  19. # 2.通过代码发送url地址的请求
  20. response = requests.get(url=url, headers=headers)
  21. html_data = response.text
  22. # print(html_data)
  23.  
  24. # 3.解析数据(要的, 筛选不要的) 解析音频的 id值
  25. selector = parsel.Selector(html_data)
  26. lis = selector.xpath('//div[@class="sound-list _is"]/ul/li')
  27.  
  28. for li in lis:
  29. try:
  30. title = li.xpath('.//a/@title').get() + '.m4a'
  31. href = li.xpath('.//a/@href').get()
  32. # print(title, href)
  33.  
  34. m4a_id = href.split('/')[-1]
  35. # print(href, m4a_id)
  36.  
  37. # 发送指定id值json数据请求(src)
  38. json_url = 'https://www.ximalaya.com/revision/play/v1/audio?id={}&ptype=1'.format(m4a_id)
  39. json_data = requests.get(url=json_url, headers=headers).json()
  40. # print(json_data)
  41.  
  42. # 提取音频地址
  43. m4a_url = json_data['data']['src']
  44. # print(m4a_url)
  45.  
  46. # 请求音频数据
  47. m4a_data = requests.get(url=m4a_url, headers=headers).content
  48.  
  49. new_title = change_title(title)
  50. # print(new_title)
  51.  
  52. # 4.数据持久化(保存)
  53. with open('video\\' + new_title, mode='wb') as f:
  54. f.write(m4a_data)
  55. print('保存完成:', title)
  56. except:
  57. pass

运行代码,效果如下图

Python爬虫实战案例:取喜马拉雅音频数据详解的更多相关文章

  1. Python爬虫:爬取喜马拉雅音频数据详解

    前言 喜马拉雅是专业的音频分享平台,汇集了有声小说,有声读物,有声书,FM电台,儿童睡前故事,相声小品,鬼故事等数亿条音频,我最喜欢听民间故事和德云社相声集,你呢? 今天带大家爬取喜马拉雅音频数据,一 ...

  2. Python爬虫之爬取淘女郎照片示例详解

    这篇文章主要介绍了Python爬虫之爬取淘女郎照片示例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 本篇目标 抓取淘宝MM ...

  3. python爬虫实战---爬取大众点评评论

    python爬虫实战—爬取大众点评评论(加密字体) 1.首先打开一个店铺找到评论 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经 ...

  4. Python爬虫实战---抓取图书馆借阅信息

    Python爬虫实战---抓取图书馆借阅信息 原创作品,引用请表明出处:Python爬虫实战---抓取图书馆借阅信息 前段时间在图书馆借了很多书,借得多了就容易忘记每本书的应还日期,老是担心自己会违约 ...

  5. python爬虫25 | 爬取下来的数据怎么保存? CSV 了解一下

    大家好 我是小帅b 是一个练习时长两年半的练习生 喜欢 唱! 跳! rap! 篮球! 敲代码! 装逼! 不好意思 我又走错片场了 接下来的几篇文章 小帅b将告诉你 如何将你爬取到的数据保存下来 有文本 ...

  6. Python爬虫之抓取豆瓣影评数据

    脚本功能: 1.访问豆瓣最受欢迎影评页面(http://movie.douban.com/review/best/?start=0),抓取所有影评数据中的标题.作者.影片以及影评信息 2.将抓取的信息 ...

  7. Python爬虫实战案例:爬取爱奇艺VIP视频

    一.实战背景 爱奇艺的VIP视频只有会员能看,普通用户只能看前6分钟.比如加勒比海盗5的URL:http://www.iqiyi.com/v_19rr7qhfg0.html#vfrm=19-9-0-1 ...

  8. Python爬虫学习==>第八章:Requests库详解

    学习目的: request库比urllib库使用更加简洁,且更方便. 正式步骤 Step1:什么是requests requests是用Python语言编写,基于urllib,采用Apache2 Li ...

  9. Python爬虫入门:Urllib parse库使用详解(二)

    文字转载:https://www.jianshu.com/p/e4a9e64082ef,转载内容仅供学习 如有侵权,请联系删除 获取url参数 urlparse 和 parse_qs ParseRes ...

随机推荐

  1. OJ-1:时钟问题【九度1553】

    题目描述: 如图,给定任意时刻,求时针和分针的夹角(劣弧所对应的角). 输入: 输入包含多组测试数据,每组测试数据由一个按hh:mm表示的时刻组成. 输出: 对于每组测试数据,输出一个浮点数,代表时针 ...

  2. c#连接mysql答题步骤

    引用mysql数据库 using MySql.Data.MySqlClient; 有一个mysql.dll文件 下面是实例化连接数据库 MySqlConnection Conn = new MySql ...

  3. Blog.Core 项目已完成升级.NET5.0

    (是时候拿出来这种图了) 本文首发于公众号,但是会有新的内容加进来,所以就在博客园新开了一篇,望见谅.截止发稿,Blog.Core项目Master分支已经迁移到了5.0,新建了3.1的分支. 开心的锣 ...

  4. php 获取时间相差的月份和天数

    function getMonthAndDay($date1,$date2){ $datestart= date('Y-m-d',strtotime($date1)); if(strtotime($d ...

  5. 10before_request钩子函数

    1,什么是钩子函数? 就是运行别人前都得先运行他: from flask import Flask app = Flask(__name__) @app.route('/') def hello_wo ...

  6. rabbitmq-参考

    rabbitMQ http://lynnkong.iteye.com/blog/1699684 http://jzhihui.iteye.com/category/195005

  7. RPC协议实践入门

    RPC 是什么 RPC(Remote Procedure Call) 是一个计算机通信协议.该协议允许运行与一台计算机的程序调用另一个地址空间的程序,是一个通过发送请求-接受回应进行信息交互的系统. ...

  8. MongoDB基础教程(安装、操作、配置)

    MongoDB 下载安装 简易安装 # redhat, centOS sudo yum install -y mongodb # debian, ubuntu sudo apt install -y ...

  9. brctl 增加桥接网卡

    前言 之前有一篇介绍配置桥接网卡的,这个桥接网卡一般是手动做虚拟化的时候会用到,通过修改网卡的配置文件的方式会改变环境的原有的配置,而很多情况,我只是简单的用一下,并且尽量不要把网络搞断了,万一有问题 ...

  10. python执行rados命令例子

    前言 我们以前的管理平台在python平台下面做的,内部做的一些操作采用的是命令执行,然后解析的方式去做的,ceph自身有python的rados接口,可以直接调用原生接口,然后直接解析json的方式 ...