本文原本仅是想作为一个在推文"一小时入手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.源码展示:
""
项目需求分析:
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之禅,感受一下