热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python爬取喜马拉雅收费_Python中使用requests和parsel爬取喜马拉雅电台音频

场景喜马拉雅电台:找到一步小说音频,这里以下面为例实现找到下载地址使用谷歌浏览器打开上面网址,按F12打开调试,点击播放按钮

场景

喜马拉雅电台:

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

实现

找到下载地址

使用谷歌浏览器打开上面网址,按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') asf: 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(98791745)

运行下打印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']returnsrc

media_api(98791745)

这样就能根据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[:30]:

#extract_first()将对象中的文字提取出来

#获取a标签的href属性的内容

media_url= sound.css('a::attr(href)').extract_first()

#/youshengshu/16411402/98791745 --只去最后面的id

media_url= media_url.split('/')[-1]

# 获取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 inmeidas:

#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(2,3):

meidas= get_total_page(f'https://www.ximalaya.com/youshengshu/16411402/p{page}')for media_id,media_name inmeidas:

#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瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
    本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
  • 文章目录简介HTTP请求过程HTTP状态码含义HTTP头部信息Cookie状态管理HTTP请求方式简介HTTP协议(超文本传输协议)是用于从WWW服务 ... [详细]
  • 最近在学Python,看了不少资料、视频,对爬虫比较感兴趣,爬过了网页文字、图片、视频。文字就不说了直接从网页上去根据标签分离出来就好了。图片和视频则需要在获取到相应的链接之后取做下载。以下是图片和视 ... [详细]
  • 目录爬虫06scrapy框架1.scrapy概述安装2.基本使用3.全栈数据的爬取4.五大核心组件对象5.适当提升scrapy爬取数据的效率6.请求传参爬虫06scrapy框架1. ... [详细]
  • asp中如何嵌入python的简单介绍
    本文目录一览:1、如何在IIS中执行Python脚本 ... [详细]
  • 结合“性能监视器”排查、处理性能瓶颈导致应用吞吐率等指标上不去的问题
    双11备战前夕,总绕不过性能压测环节,TPS一直上不去不达标,除了代码上的问题外,服务器环境、配置、网络、磁盘、CPU亦是导致性能瓶颈的重要一环,本文旨在分享最近项目性能 ... [详细]
  • Python爬取豆瓣数据实现过程解析
    这篇文章主要介绍了Python爬取豆瓣数据实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值, ... [详细]
  • Scrapy 爬取图片
    1.创建Scrapy项目scrapystartprojectCrawlMeiziTuscrapygenspiderMeiziTuSpiderhttps:movie.douban.c ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了响应式页面的概念和实现方式,包括针对不同终端制作特定页面和制作一个页面适应不同终端的显示。分析了两种实现方式的优缺点,提出了选择方案的建议。同时,对于响应式页面的需求和背景进行了讨论,解释了为什么需要响应式页面。 ... [详细]
  • 本文介绍了NetCore WebAPI开发的探索过程,包括新建项目、运行接口获取数据、跨平台部署等。同时还提供了客户端访问代码示例,包括Post函数、服务器post地址、api参数等。详细讲解了部署模式选择、框架依赖和独立部署的区别,以及在Windows和Linux平台上的部署方法。 ... [详细]
  • php将utf8转为gbk,php utf8怎么转gbk
    phputf8转gbk的方法:首先创建一个PHP示例文件;然后通过“iconv(UTF-8,gbkTRANSLIT,$str);”方法将字符串的 ... [详细]
  • html结构 ... [详细]
author-avatar
天高云淡-tgyd
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有