场景

喜马拉雅电台:

https://www.ximalaya.com/

找到一步小说音频,这里以下面为例

https://www.ximalaya.com/youshengshu/16411402/

博客:
https://blog.csdn.net/badao_liumang_qizhi
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。

实现

找到下载地址

使用谷歌浏览器打开上面网址,按F12打开调试,点击播放按钮后,然后找到Network下的Media下的Headers下的RequestURL,然后选中在新窗口中打开

打开之后就可以点击三个点出来之后的下载按钮,便可以下载

使用代码下载

打开PyCharm,新建一个Python项目

导入requests库,然后为了防止其反扒机制,找到浏览器上Headers下的Requests
Headers下的User-Agent,复制出来。

#能发送http请求的库
import requests headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36'
}
media_url = 'http://audio.cos.xmcdn.com/group47/M0A/34/EA/wKgKm1tHj6GwgeWBAFehkfjyvKI181.m4a' response = requests.get(media_url,headers = headers); with open('badao.mp4',mode='wb') as f: f.write(response.content)

下载成功之后

下载地址获取

上面只是获取一个音频的下载地址,怎样获取每一集的下载地址

还是刚才的调试页面,我们点击放大镜样的搜索按钮,出来搜索框之后,输入刚才下载地址的文件名

点击第一个返回json数据的接口url,找到其Headers下的RequestURL。

然后在新窗口打开

可以看到是通过这个API返回的Json数据中的下载地址。

那么这个API需要传递什么参数。通过其Headers底部的请求参数可以看到需要一个id参数和pytype参数。

通过对比每一集的接口的请求参数得知,pytype是固定的,id是每一集对应的链接中的id相对应的。

所以要是循环下载多集的话,需要在目录页面获取超链接的href属性中对应的id。

这里我们定义一个请求下载地址json数据的方法

defmedia_api(track_id):
api_url=f'https://www.ximalaya.com/revision/play/v1/audio?id={track_id}&ptype=1';
response = requests.get(api_url,headers = headers)
print(response.json()) media_api()

运行下打印json数据

提取下载地址

那么就需要根据传递的id参数通过这个接口返回json数据,并从json数据中提取src对应的url数据

def media_api(track_id):   
api_url=f'https://www.ximalaya.com/revision/play/v1/audio?id={track_id}&ptype=1';
response = requests.get(api_url,headers = headers)
#print(response.json())
#json返回字典类型 提取使用[]
data_json = response.json()
src = data_json['data']['src']
return src media_api()

这样就能根据id获取每一集的下载地址,然后再将下载地址传递给上面第一步下载的方法中进行下载即可。

接下来就是怎样获取每一集的id。

parsel解析网页获取id

首先需要导入parsel模块

import parsel

如果没有安装则需要安装

pip install parsel

我们来到其目录页

在Elemnts下可以看到每一集是一个a标签,我们获取a标签的href属性中的最后面的id。

我们再定义一个方法,此方法能根据页面的url获取当前页的所有集的id。

def get_total_page(page_url):
#请求页面
response = requests.get(page_url,headers = headers)
print(response.text)
#获取页面html的内容
sel = parsel.Selector(response.text)
print(sel)
#通过css选择器找到a标签 .sound-list代表 class属性为sound-list 然后下面的ul 下的li 下的a
sound_list = sel.css('.sound-list ul li a')
print(sound_list)
#只有前30个是页面链接 截取前30个
for sound in sound_list[:]:
#extract_first()将对象中的文字提取出来
#获取a标签的href属性的内容
media_url = sound.css('a::attr(href)').extract_first()
#/youshengshu// --只去最后面的id
media_url = media_url.split('/')[-]
# 获取a标签的title属性的内容
media_name = sound.css('a::attr(title)').extract_first()
#用yield将整个循环的内容返回
yield media_url,media_name

下载一页的音频

我们在main方法中调用获取当前页所有的集的id和名字,然后循环将拿到的id去请求api获取下载的地址,然后将下载地址传递给下载的方法去下载

if __name__ == '__main__':
meidas = get_total_page('https://www.ximalaya.com/youshengshu/16411402/')
for media_id,media_name in meidas:
#print(media_url, media_name)
media_url = media_api(media_id)
download_meida(media_url, media_name)

运行程序将一页下载完

下载所有页

我们点击第二页看到url中追加了一个p2,依次类推,p+相应的页数。

这样就可以将页面url改造成传参的

if __name__ == '__main__':
#循环页数下载 range代表下载的页数范围
for page in range(,):
meidas = get_total_page(f'https://www.ximalaya.com/youshengshu/16411402/p{page}')
for media_id,media_name in meidas:
#print(media_url, media_name)
media_url = media_api(media_id)
download_meida(media_url, media_name)

那么在range中就可以输入要下载的页数的范围。

如果输入(1,31)就是下载所有的30页,这里只下载第二页,所以range是(2,3)

代码下载

关注公众号:

霸道的程序猿

回复:

爬取喜马拉雅

Python中使用requests和parsel爬取喜马拉雅电台音频的更多相关文章

  1. 在Python中使用BeautifulSoup进行网页爬取

    目录 什么是网页抓取? 为什么我们要从互联网上抓取数据? 网站采集合法吗? HTTP请求/响应模型 创建网络爬虫 步骤1:浏览并检查网站/网页 步骤2:创建用户代理 步骤3:导入请求库 检查状态码 步 ...

  2. Python使用urllib,urllib3,requests库+beautifulsoup爬取网页

    Python使用urllib/urllib3/requests库+beautifulsoup爬取网页 urllib urllib3 requests 笔者在爬取时遇到的问题 1.结果不全 2.'抓取失 ...

  3. 整理requests和正则表达式爬取猫眼Top100中遇到的问题及解决方案

    最近看崔庆才老师的爬虫课程,第一个实战课程是requests和正则表达式爬取猫眼电影Top100榜单.虽然理解崔老师每一步代码的实现过程,但自己敲代码的时候还是遇到了不少问题: 问题1:获取respo ...

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

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

  5. Python爬虫|爬取喜马拉雅音频

    "GOOD Python爬虫|爬取喜马拉雅音频 喜马拉雅是知名的专业的音频分享平台,用户规模突破4.8亿,汇集了有声小说,有声读物,儿童睡前故事,相声小品等数亿条音频,成为国内发展最快.规模 ...

  6. 爬虫系列(十) 用requests和xpath爬取豆瓣电影

    这篇文章我们将使用 requests 和 xpath 爬取豆瓣电影 Top250,下面先贴上最终的效果图: 1.网页分析 (1)分析 URL 规律 我们首先使用 Chrome 浏览器打开 豆瓣电影 T ...

  7. 爬虫系列(十一) 用requests和xpath爬取豆瓣电影评论

    这篇文章,我们继续利用 requests 和 xpath 爬取豆瓣电影的短评,下面还是先贴上效果图: 1.网页分析 (1)翻页 我们还是使用 Chrome 浏览器打开豆瓣电影中某一部电影的评论进行分析 ...

  8. 初识python 之 爬虫:使用正则表达式爬取“糗事百科 - 文字版”网页数据

    初识python 之 爬虫:使用正则表达式爬取"古诗文"网页数据 的兄弟篇. 详细代码如下: #!/user/bin env python # author:Simple-Sir ...

  9. requests+xpath+map爬取百度贴吧

    # requests+xpath+map爬取百度贴吧 # 目标内容:跟帖用户名,跟帖内容,跟帖时间 # 分解: # requests获取网页 # xpath提取内容 # map实现多线程爬虫 impo ...

随机推荐

  1. Java描述设计模式(11):观察者模式

    本文源码:GitHub·点这里 || GitEE·点这里 一.观察者模式 1.概念描述 观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式.观察者模式定义了一种一对多 ...

  2. Java Virtual Machine (JVM), Difference JDK, JRE & JVM – Core Java

    By Chaitanya Singh | Filed Under: Learn Java Java is a high level programming language. A program wr ...

  3. 【SDUT】2019SDUTACM第一次选拔赛 F- X的追求道路

    Problem Description X在大家的帮助下终于找到了一个妹纸,于是开始了漫漫的追求之路,那么大家猜一猜X能不能追的上呢? X初始对妹纸有一个心动值,妹纸对X有一个好感值,在追求时发生的的 ...

  4. Linux 操作系统的权限为什么是1,2,4 而不是 1,2,3?如何用二进制来做权限管理

    1.二进制做权限的优点 大家都知道,在Linux操作系统中,x - 可执行权限,w - 可写权限 , r - 可读权限.其权限值分别是1,2,4,但是有没有想过为什么是1,2,4 而不是 1,2,3 ...

  5. 松软科技web课堂:JavaScript 数据类型

    字符串值,数值,布尔值,数组,对象. JavaScript 数据类型 JavaScript 变量能够保存多种数据类型:数值.字符串值.数组.对象等等: var length = 7; // 数字 va ...

  6. FCC---Create Texture by Adding a Subtle Pattern as a Background Image

    One way to add texture and interest to a background and have it stand out more is to add a subtle pa ...

  7. Promise的使用

    Promise的简单认识 Promise 是ES6中对异步编程的一种解决方案,可以避免出现回调地狱 Promise最基本的语法 new Promise((resolve, reject) => ...

  8. 在vue组件中设置定时器和清除定时器

    由于项目中难免会碰到需要实时刷新,无论是获取短信码,还是在支付完成后轮询获取当前最新支付状态,这时就需要用到定时器.但是,定时器如果不及时合理地清除,会造成业务逻辑混乱甚至应用卡死的情况,这个时就需要 ...

  9. python的exe反编译

    目录 python的exe反编译 方法一.使用archive_viewer.py提取pyc 方法二.使用pyinstxtractor.py提取pyc python的exe反编译 驱动人生样本为pyth ...

  10. X短期项目总结

    刚退出了一个项目,简称为X项目.这个项目中,还是遇到了不少问题,也解决了部分问题,还是挺有收获的,所以总结一下. 虽然标题说是短期项目总结,但其实这个项目并不短, 持续了约3年时间. 所谓的短,只是我 ...