前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >喜马拉雅音频获取~带你省流量

喜马拉雅音频获取~带你省流量

作者头像
石璞东
发布2019-07-26 14:36:48
1K0
发布2019-07-26 14:36:48
举报
文章被收录于专栏:石璞东 | haha石璞东 | haha

本文原本仅是想作为一个在推文"一小时入手Python"上线之前的预热,并将其思路和源码以后台回复的形式发送给需要的用户,并没有准备以推文的形式发出来,但鉴于目前各位小可爱的热烈要求和对于知识的极度渴望,以及项目本身可学习的知识点很重要,所以现在以正式推文的形式发布出来,但由于部分功能的实现过于繁琐,本文只做思路提供.

1.概述:

本文利用Python自带的模块(requests,urllib)实现从喜马拉雅官网获取音频,即从搜索到筛选再到下载直至用户顺利使用的完美process,实现了零流量帮各位小伙伴学习的终极目标,在知识爆炸的今天,你值得拥有.

本文你需要有的知识储备:

1)一定的爬虫基础

2)精通度达99.9%的对于正则表达式的理解

3)字符串的解析

本文思路难度0%,代码难度0%,复杂度100%,时间消耗2h,卡路里消耗2000千卡,欢迎提问.

2.项目需求:

获取喜马拉雅网站的音频,并将其保存至本地.

3.项目涉及的知识点:

涉及到的模块:

requests

urllib

重难点思路提供:

第一次搜索url拼接:

第一次用户需要输入自己所想听的音频名称,这里以"一个人听"简单举例,仔细观察控制台,发现所请求的url并不是简单的把所输入的音频名字做下简单的编码,而是要在每个"%"后面加上"25",那是不是思路就有了呢,你可以用正则表达式,也可以参考我的笨办法:定义两个数组,一个用来存放汉字的编码,另一个用来存放将要拼接成功的编码.仔细看看url,你会发现,你会诧异

,"%"号出现的位置对3求余刚好等于0,神奇不神奇,开心不开心.那我现在的操作就是:遍历第一个数组,如果当前数组项对应的下标对3求余等于0则把该项添加至新数组,并在该项的下一项添加一项---"25",如果求余不等于0,那么只添加该数组项.废话太多,直接看图吧:

第二次搜索albumId查找:

(以"一个人听"为例)先打开开发者工具,发现网页中关于"一个人听"的主要内容共有10项,点击不同的项,可以在控制台中了解到:不同的项对应于所请求url中的albumId,用人话说就是,之所以点击不同的项,会出现不同的音频,就是因为albumId不同.那么你一定想问了,这albumId是哪来的啊?随机生成的吗?当然不是,教你一个小tips,复制这个albumId值,在当前网页的源代码中去找,会发现藏在一个a标签的href属性里面.那有人就说了,正则表达式做个匹配就完事了,哇,还是太年轻啊!

我们来看正解:

第二次用户需要输入具体的哪一个音频,观察浏览器地址栏:你是不是灵光乍现,貌似搜索不同的音频只是改变search后面的值

,对滴,猜对了.请求当前网页,选中关于主要音频的部分,会发现如下网页结构:所以现在要做的就是根据用户输入的"title"(有的"title"都一样,所以你们可以根据自身需求匹配不同的属性)匹配到对应的a标签并且比配href属性中的albumId值,然后再根据用户输入的"title"值再将对应的albumId值放入所请求的url中.

音频保存并命名:

以二进制形式保存所获取的音频文件,电脑可以直接读取.

4.项目思路:

用户在控制台输入想要搜索的关键词并回车,代码会自动执行并调用相关公用接口执行搜索操作,将重要结果展示在控制台上,用户根据展示的信息,输入自己想听的音频项目,代码会自动发送请求,并获取到服务端返回给客户端的数据,并且筛选数据并将音频资源保存至本地,待所有音频资源被保存完毕之后,控制台会自动提示用户"存储完毕"的信息,此时用户可以享受完美的音频了.

5.闲谈:

有兴趣的小伙伴可以试下VIP音频的获取,讲真的,小编之前爬过爱奇艺的VIP电影,当时把所有的视频都爬下来了,并且已经合成一个完整的电影了,可惜不知道是电脑原因还是代码原因,提示视频格式错误,试了好多种方法,还是没能做出来.有兴趣的小伙伴后台私聊我哟.

6.效果展示

7.误区突破:

小伙伴们之前上网的时候,肯定都做个搜索或者提交信息之类的操作吧,好多人都对于鼠标的"点击"这个操作有点迷,他们当然知道只有点击之后才能完成他们的目标,但是点击的实质是什么他们却一无所知.说起来,这事也怪windows的可视化,将所有的操作都以可视化的形式展现给用户,当然这对于一般用户肯定是友好的,但是在部分人思维中,像是"点击"这些操作背后的实质却简单的和这些傻瓜式的操作挂上钩了.好了,不废话了,简单点说,"点击"这个操作所做的就是"提交数据,发送请求",那换句话说,如果说当初windows给这个功能的实现并不是以点击按钮的形式,而是以语音的形式,用户只需说一句"我好帅"它就会执行"提交数据,发送请求"的操作,那是不是很神奇呢.

8.源码展示:

代码语言:javascript
复制
""
   项目需求分析:
       1.请求网址的构造
       2.筛选服务器的响应信息
       3.用户根据喜爱输入喜欢的音频并按下回车
       4.进行下载并告知用户是否下载成功
"""
import requests
from urllib import parse
#协议头的伪造
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0'
}
#用于拼接请求地址
def changeInputWord(data):
    result = parse.quote(data)
    new_arr = []
    str = ""
    for (index,item) in enumerate(result):
        if index % 3 == 0:
            new_arr.append(result[index])
            new_arr.append("25")
        else:
            new_arr.append(result[index])
    return str.join(new_arr)

#根据input输入的内容进行查找 并在控制台进行展示
def enterKeyword():
    data= input("请输入:")
    changeResult = changeInputWord(data)
    url = "https://www.ximalaya.com/revision/search?core=all&kw={}&spellchecker=true&device=iPhone".format(changeResult)
    res = requests.get(url,headers=headers).json()
    for item in res["data"]["result"]["album"]["docs"]:
        print(item["title"])
#下载用户想要的资源
def downloadSource():
    input("请输入你想听的节目:")
    url1 = "https://www.ximalaya.com/revision/play/album?albumId=3595841&pageNum=1&pageSize=30"
    res1 = requests.get(url1, headers=headers).json()
    video_src = []
    video_name = []
    num_src = 0
    for itemShow in res1["data"]["tracksAudioPlay"]:
        print(itemShow)
        # 存入视频地址  方便下载
        video_src.append(itemShow["src"])
        # 存入视频名称  方便保存
        video_name.append(itemShow["trackName"])

    while num_src < len(video_src):
        data = requests.get(video_src[num_src], headers=headers).content
        file_name = "{}.mp4".format(video_name[num_src])
        with open(file_name, 'wb') as f:
            f.write(data)
            print("第{}个音频以写入完毕".format(num_src))
        num_src += 1
    print("存储完毕")


if __name__=="__main__":
    enterKeyword()
    downloadSource()

9.享受一下自己的劳动成果听首音频开心一下吧

~~~~~~~

10.结束语

这将是我Python爬虫的最后一片推文,廖大神说过:"天下没有我爬不了的网站",小编斗胆也说一句:"天下的网站你爬不完",一个网站一个风格、一个管理方式、一个技术栈,曾经我单纯的以为可以找到某些规律,现在看来简直是妄想.简单的就拿反爬措施来说吧,这个技术是没有上限的,现代社会,数据最值钱,只要数据存在,就一定会有抄袭,同样的就一定会有阻止抄袭(通过前一阵子"马蜂窝"的事件就明白了),两者是相辅相成的,总而言之,一句话,数据不止,爬虫不息,学习不停.同时也欢迎各位小伙伴通过后台留言或者QQ的方式向我提问.

最后给大家一点忠告,对于"正则表达式",相信学过编程的人都听过吧,Java、Javascript、Python等中都有,基本上大同小异,敢问小伙伴们现在谁能做到不查资料就能写出准确的正则,很少吧.大厂的大佬们总说:"正则表达式吗,很简单,不就是匹配个电话号、邮箱号吗,等用到了再去网上找呗,很多的",小编之前也是这样认为的

,不过做了几个爬虫之后(爬虫中经常有从一个页面的源代码中匹配某个标签的某些属性),我后悔了,正则表达式真的很重要,如果你很熟练的话,它会帮你节省很多时间,请务必掌握它.

Python之禅,感受一下

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-11-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 hahaCoder 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云开发 CLI 工具
云开发 CLI 工具(Cloudbase CLI Devtools,CCLID)是云开发官方指定的 CLI 工具,可以帮助开发者快速构建 Serverless 应用。CLI 工具提供能力包括文件储存的管理、云函数的部署、模板项目的创建、HTTP Service、静态网站托管等,您可以专注于编码,无需在平台中切换各类配置。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档