Python中使用requests和parsel爬取喜马拉雅电台音频

场景

喜马拉雅电台:

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(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‘]
    return src

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

代码下载

关注公众号:

霸道的程序猿

回复:

爬取喜马拉雅

原文地址:https://www.cnblogs.com/badaoliumangqizhi/p/11749848.html

时间: 2024-11-09 04:54:43

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

如何用Python爬取喜马拉雅全网音频文件

什么是喜马拉雅 喜马拉雅FM是国内分享平台,3月手机客户端上线,两年多时间手机用户规模已突破2亿 [1] ,成为国内发展最快.规模最大的在线移动音频分享平台. 今天小编分享爬取喜马拉雅的单本全集的音频文件和全网站的音频 环境配置: Windows + Python 3.6 爬取单本音频 1 import json 2 3 import re 4 5 import requests 爬取全站模块使用 1 import re 2 3 import requests 4 5 from lxml imp

python爬虫实例详细介绍之爬取大众点评的数据

python 爬虫实例详细介绍之爬取大众点评的数据 一. Python作为一种语法简洁.面向对象的解释性语言,其便捷性.容易上手性受到众多程序员的青睐,基于python的包也越来越多,使得python能够帮助我们实现越来越多的功能.本文主要介绍如何利用python进行网站数据的抓取工作.我看到过利用c++和Java进行爬虫的代码,c++的代码很复杂,而且可读性.可理解性较低,不易上手,一般是那些高手用来写着玩加深对c++的理解的,这条路目前对我们不通.Java的可读性还可以,就是代码冗余比较多,

【python爬虫】根据查询词爬取网站返回结果

最近在做语义方面的问题,需要反义词.就在网上找反义词大全之类的,但是大多不全,没有我想要的.然后就找相关的网站,发现了http://fanyici.xpcha.com/5f7x868lizu.html,还行能把"老师"-"学生","医生"-"病人"这样对立关系的反义词查出来. 一开始我想把网站中数据库中存在的所有的词语都爬出来(暗网爬虫),但是分析了url的特点: http://fanyici.xpcha.com/5f7x86

requests+xpath+map爬取百度贴吧

1 # requests+xpath+map爬取百度贴吧 2 # 目标内容:跟帖用户名,跟帖内容,跟帖时间 3 # 分解: 4 # requests获取网页 5 # xpath提取内容 6 # map实现多线程爬虫 7 import requests 8 from requests.exceptions import RequestException 9 from lxml import etree 10 import json 11 from multiprocessing.dummy imp

详解Python 采用 requests + Beautiful Soup 爬取房天下新楼盘推荐

最近一直在关注Python写爬虫相关的知识,尝试了采用requests + Beautiful Soup来爬取房天下(原搜房网)的推荐新楼盘. 不用不知道,一用发现有惊喜也有惊吓,本文就一同记录下惊喜和踩的一些乱码的坑. 首先,觉得Beautiful soup解析网页更加符合人类的常规思维,比使用正则表达式(python中的re库)更容易理解. 同时关于requests遇到了中文字符和特殊字符解码的问题.本文都将给于深入的解说. 软件环境 Python    : 3.6.0 PyCharm: C

23个Python爬虫开源项目代码:爬取微信、淘宝、豆瓣、知乎、微博等

来源:全球人工智能 作者:SFLYQ 今天为大家整理了23个Python爬虫项目.整理的原因是,爬虫入门简单快速,也非常适合新入门的小伙伴培养信心.所有链接指向GitHub,祝大家玩的愉快 1.WechatSogou [1]– 微信公众号爬虫. 基于搜狗微信搜索的微信公众号爬虫接口,可以扩展成基于搜狗搜索的爬虫,返回结果是列表,每一项均是公众号具体信息字典. github地址:https://github.com/Chyroc/WechatSogou 2.DouBanSpider [2]– 豆瓣

大神教你如果学习Python爬虫 如何才能高效地爬取海量数据

Python如何才能高效地爬取海量数据 我们都知道在互联网时代,数据才是最重要的,而且如果把数据用用得好的话,会创造很大的价值空间.但是没有大量的数据,怎么来创建价值呢?如果是自己的业务每天都能产生大量的数据,那么数据量的来源问题就解决啦,但是没有数据怎么办??哈哈哈,靠爬虫来获取呀!!! 通过利用爬虫技术获取规模庞大的互联网数据,然后做市场分析.竞品调研.用户分析.商业决策等. 也许对于小白来说,爬虫是一件非常难且技术门槛高的是,但是如果掌握了正确的方法,在短时间内可以让你应运自如.下面就分享

用requests和etree爬取豆瓣电影评论

写在前面的话 :上一篇文章我们用requests和lxml.etree爬取了豆瓣电影Top250的电影信息,为了能对requests和lxml.etree有更深的理解,下面我们将继续用他们来爬取豆瓣电影的短评 温馨提示 :博主使用的系统为win10,使用的python版本为3.6.5 一.网页分析 首先我们使用chrome浏览器打开某一部电影的评论(这里示例为最近很火的<一出好戏>),我们首先可以判断该网站是一个静态网页,和之前一样我们可以通过构造URL来获取全部网页的内容,但是这次我们尝试使

python网络爬虫(7)爬取静态数据详解

目的 爬取http://seputu.com/数据并存储csv文件 导入库 lxml用于解析解析网页HTML等源码,提取数据.一些参考:https://www.cnblogs.com/zhangxinqi/p/9210211.html requests请求网页 chardet用于判断网页中的字符编码格式 csv用于存储文本使用. re用于正则表达式 from lxml import etree import requests import chardet import csv import re