Python爬虫实战案例:取喜马拉雅音频数据详解
前言
喜马拉雅是专业的音频分享平台,汇集了有声小说,有声读物,有声书,FM电台,儿童睡前故事,相声小品,鬼故事等数亿条音频,我最喜欢听民间故事和德云社相声集,你呢?
今天带大家爬取喜马拉雅音频数据,一起期待吧!!
这个案例的视频地址在这里
- https://v.douyu.com/show/a2JEMJj3e3mMNxml
项目目标
爬取喜马拉雅音频数据
受害者地址
- 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地址
开始写代码
先导入所需的模块
- import requests
- import parsel # 数据解析模块
- import re
1.确定数据所在的链接地址(url) 逆向分析 网页性质(静态网页/动态网页)
打开开发者工具,播放一个音频,在Madie里面可以找到一个数据包
复制URL,搜索
找到ID值
继续搜索,找到请求头参数
- 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爬虫:爬取喜马拉雅音频数据详解
前言 喜马拉雅是专业的音频分享平台,汇集了有声小说,有声读物,有声书,FM电台,儿童睡前故事,相声小品,鬼故事等数亿条音频,我最喜欢听民间故事和德云社相声集,你呢? 今天带大家爬取喜马拉雅音频数据,一 ...
- Python爬虫之爬取淘女郎照片示例详解
这篇文章主要介绍了Python爬虫之爬取淘女郎照片示例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 本篇目标 抓取淘宝MM ...
- python爬虫实战---爬取大众点评评论
python爬虫实战—爬取大众点评评论(加密字体) 1.首先打开一个店铺找到评论 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经 ...
- Python爬虫实战---抓取图书馆借阅信息
Python爬虫实战---抓取图书馆借阅信息 原创作品,引用请表明出处:Python爬虫实战---抓取图书馆借阅信息 前段时间在图书馆借了很多书,借得多了就容易忘记每本书的应还日期,老是担心自己会违约 ...
- python爬虫25 | 爬取下来的数据怎么保存? CSV 了解一下
大家好 我是小帅b 是一个练习时长两年半的练习生 喜欢 唱! 跳! rap! 篮球! 敲代码! 装逼! 不好意思 我又走错片场了 接下来的几篇文章 小帅b将告诉你 如何将你爬取到的数据保存下来 有文本 ...
- Python爬虫之抓取豆瓣影评数据
脚本功能: 1.访问豆瓣最受欢迎影评页面(http://movie.douban.com/review/best/?start=0),抓取所有影评数据中的标题.作者.影片以及影评信息 2.将抓取的信息 ...
- Python爬虫实战案例:爬取爱奇艺VIP视频
一.实战背景 爱奇艺的VIP视频只有会员能看,普通用户只能看前6分钟.比如加勒比海盗5的URL:http://www.iqiyi.com/v_19rr7qhfg0.html#vfrm=19-9-0-1 ...
- Python爬虫学习==>第八章:Requests库详解
学习目的: request库比urllib库使用更加简洁,且更方便. 正式步骤 Step1:什么是requests requests是用Python语言编写,基于urllib,采用Apache2 Li ...
- Python爬虫入门:Urllib parse库使用详解(二)
文字转载:https://www.jianshu.com/p/e4a9e64082ef,转载内容仅供学习 如有侵权,请联系删除 获取url参数 urlparse 和 parse_qs ParseRes ...
随机推荐
- OJ-1:时钟问题【九度1553】
题目描述: 如图,给定任意时刻,求时针和分针的夹角(劣弧所对应的角). 输入: 输入包含多组测试数据,每组测试数据由一个按hh:mm表示的时刻组成. 输出: 对于每组测试数据,输出一个浮点数,代表时针 ...
- c#连接mysql答题步骤
引用mysql数据库 using MySql.Data.MySqlClient; 有一个mysql.dll文件 下面是实例化连接数据库 MySqlConnection Conn = new MySql ...
- Blog.Core 项目已完成升级.NET5.0
(是时候拿出来这种图了) 本文首发于公众号,但是会有新的内容加进来,所以就在博客园新开了一篇,望见谅.截止发稿,Blog.Core项目Master分支已经迁移到了5.0,新建了3.1的分支. 开心的锣 ...
- php 获取时间相差的月份和天数
function getMonthAndDay($date1,$date2){ $datestart= date('Y-m-d',strtotime($date1)); if(strtotime($d ...
- 10before_request钩子函数
1,什么是钩子函数? 就是运行别人前都得先运行他: from flask import Flask app = Flask(__name__) @app.route('/') def hello_wo ...
- rabbitmq-参考
rabbitMQ http://lynnkong.iteye.com/blog/1699684 http://jzhihui.iteye.com/category/195005
- RPC协议实践入门
RPC 是什么 RPC(Remote Procedure Call) 是一个计算机通信协议.该协议允许运行与一台计算机的程序调用另一个地址空间的程序,是一个通过发送请求-接受回应进行信息交互的系统. ...
- MongoDB基础教程(安装、操作、配置)
MongoDB 下载安装 简易安装 # redhat, centOS sudo yum install -y mongodb # debian, ubuntu sudo apt install -y ...
- brctl 增加桥接网卡
前言 之前有一篇介绍配置桥接网卡的,这个桥接网卡一般是手动做虚拟化的时候会用到,通过修改网卡的配置文件的方式会改变环境的原有的配置,而很多情况,我只是简单的用一下,并且尽量不要把网络搞断了,万一有问题 ...
- python执行rados命令例子
前言 我们以前的管理平台在python平台下面做的,内部做的一些操作采用的是命令执行,然后解析的方式去做的,ceph自身有python的rados接口,可以直接调用原生接口,然后直接解析json的方式 ...