百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Python爬虫:爬取酷狗音乐(python爬取酷我音乐)

off999 2024-11-03 14:20 30 浏览 0 评论

介绍

你是不是常常想要在各大音乐网站上下载音乐?但是网站却逼迫你下载他们的应用?然而,你下载了应用,它们却逼迫你购买vip......没关系,今天我们就来用爬虫手段“制裁”这些网站!首先,就由最简单的酷狗音乐开始爬!

功能概述

让用户输入要搜索的音乐名,然后把所有的音乐以及每一个音乐对应的信息展示给用户。再询问用户要不要下载任何音乐,如果要,则让用户输入音乐对应的id号来下载(支持批量下载)。

找出思路

首先,在获取多首歌曲的信息和下载地址之前,我们需要知道如何获取一首歌的下载地址。

打开www.kugou.com ,在搜索栏里输入你想要查找的歌曲名。按下回车。切换网页之后,点进一首歌曲的播放页。按下F12,调出开发者工具。选择network,然后点all。可以看到,目前是没有任何东西显示的。因为所有的文件已经在你打开开发者工具的时候加载完了,此时此刻,你只需要F5刷新一下网页。好了,现在你就能看到类似这样的页面。

可以看到什么js文件啊,png文件啊,音频文件啊,都没有!因为我们在调出开发者工具之前,网站已经加载完了文件,这个时候,我们只需要按下F5刷新一下网站。好了,所有的文件加载出来了。进入到一个叫做index.php?的文件,然后进入到这个文件的地址。

进入这个文件地址之后,这实际上就是音乐的信息(为了方便,我在文章后面就说是信息地址)。我们还可以看到一个叫play_url的东西,这个play_url就是音频的mp3文件地址,可以看到,这些play_url都是把/变成了/。我们不用担心这个,因为网址输入栏会自动帮我们调整成/,但是在用代码实现爬虫的时候,我们就需要把/变成/了。但短时间内,我们先不用管这个。让我们进入到这个网址,咦?这不是我们刚刚播放的音乐吗?

成功之后,我们就有了更大的信心和思路去爬虫。我们只要把每首歌曲的信息地址找出来,然后用正则表达式把每首歌曲的信息和音乐地址获取出来。再一次用爬虫获取到音乐的二进制编码,保存在本地。

那我们如何获取每首歌的信息地址呢?通过拼接地址!让我们看这两首歌的url有啥不同,你就知道了。

Faded - https://wwwapi.kugou.com/yy/i...

卡路里 - https://wwwapi.kugou.com/yy/i...

可以看到除了hash值以外的东西,就没有啥区别了。也就是说我们只需要通过https://wwwapi.kugou.com/yy/i...

来拼接每首歌的信息地址就行了。那歌曲的hash要去那里找呢?回到酷狗的音乐搜索栏,随便搜一首歌按下回车。可以看到这里有好多首歌。F12-NETWORK-ALL-F5,我们找出一个这样的文件。

我们进入这个网址,就可以看到刚刚所有歌曲的hash。那问题又来了,我们又要怎样获取到这个hash信息网址呢?这个太简单了,只需要通过https://songsearch.kugou.com/...拼接网址就行。

这个搜索的歌曲名,我们代码用input让用户输入歌曲名就行了。那么,你找到思路了吗?

思路:拼接出hash信息网址,正则表达式获取到所有歌曲的hash,再拼接出单首歌曲的url。最后再一次用正则表达式获取歌曲的play_url即可。

开始写代码

首先导入我们的requests和re正则表达式库。re用来找出音乐的信息和下载地址,requests负责获取文本和下载音乐。

import requests
import re

我们还要设置一些变量,这些变量在后面可是会派上大用场的。

timer = 0
song_urls = {}
names = {}

我们不是要拼接出多首歌曲的信息网址吗?那我们就先要让用户输入歌曲名。接着再拼。

songs = input("请输入歌曲名:")

url = 'https://songsearch.kugou.com/song_search_v2?callback=jQuery112409090559630919017_1585358668138&keyword=%s&page=1&pagesize=30&userid=-1&clientver=&platform=WebFilter&tag=em&filter=2&iscorrection=1&privilege_filter=0&_=1585358668140'%songs

现在,我们就可以用requests请求文本了!由于这个网址是get请求的而且我们请求的是文本,所以,我们也要用方法requests.get().text方法。

texts = requests.get(url).text

接着,你可以试着打印一下文本。打印出来的文本和我们拼接的网址的内容毫无区别(我这里就不打印了,等下python卡死就完了)在这些文本里,我们可以获取到每首歌的hash值。用正则表达式查找就行了。

song_hashes = re.findall('"FileHash":"(.*?)"',texts)

打印一下song_hashes,可以看到,他是个列表。所以我们要进行for遍历。

for i in song_hashes:
    information_url = 'https://wwwapi.kugou.com/yy/index.php?r=play/getdata&callback=jQuery19104610954889760035_1585364074033&hash=%s&album_id=0&dfid=2SSGs60RKO9P0bAzIe0xF4Us&mid=5a959954d2f99fc1438fe2efb7596511&platid=4&_=1585364074034'%i
    information = requests.get(information_url).text
    song_url = re.findall('"play_url":"(.*?)"',information)
    song_names = bytes(re.findall('"audio_name":"(.*?)"',information)[0],encoding='ascii').decode('unicode-escape')
    singers = bytes(re.findall('"author_name":"(.*?)"',information)[0],encoding='ascii').decode('unicode-escape')
    if song_names not in names.values():
        names[str(timer)] = song_names
        print("%d.%s"%(timer,song_names))
        print("作者:%s"%singers)
        print()
        timer += 1
    if song_url[0] not in song_urls.values():
        song_urls[str(timer-1)] = song_url[0]

上段代码中,我们进行了每个hash的拼接操作,然后我们在从单首歌曲的信息文本里找到了音乐名和作者和下载地址。由于音乐名和作者是进行ascii编码过的,所以我们也要进行一个解码。由于歌曲名和歌手有时候会重复打印,所以我们每一次打印音乐和作者之前,都会把音乐和作者名加入到一个字典。每一次打印都会进行一次是否存在字典的判断。字典的key就由我们的timer变量的变化进行改变key名。另外,我们还把每首歌的下载地址保存到了song_urls字典里。打印了音乐信息之后,就要询问用户要下载那首歌了。

print('输入n就不下载,若要下载多首歌曲,请用英文符号","隔开')
choice = input('请输入要下载歌曲的编号:').split(',')
if choice == "n":
    exit()
else:
    path = input("请输入要保存的路径:")
    for i in choice:
        song_url = song_urls[i].replace('\\/','/')
        song = requests.get(song_url).content
        save_name = names[i]
        with open(path + '/' + save_name + '.mp3','wb') as f:
            f.write(song)
    print("保存完成!")

按以前的做法,用requests.get().content把音乐转换成二进制文件再进行保存。在get之前,我们还需要把网址的乱七八糟的\/变成/。之后,就能保存下来了!我们就拿一首叫做the day you went away的歌试一下代码实现效果:

程序的不足

酷狗每隔一段时间都会弄个滑动验证码,这个时候我们的程序就不能获取到数据。这种情况,用selenium就可以轻松解决。

完整代码:

#导入库
import requests
import re
import os
#设置好一些变量
timer = 0 #设置一个计算歌曲顺序的机器
song_urls = {}
names = {}
songs = input("请输入歌曲名:")

url = 'https://songsearch.kugou.com/song_search_v2?callback=jQuery112409090559630919017_1585358668138&keyword=%s&page=1&pagesize=30&userid=-1&clientver=&platform=WebFilter&tag=em&filter=2&iscorrection=1&privilege_filter=0&_=1585358668140'%songs
texts = requests.get(url).text
song_hashes = re.findall('"FileHash":"(.*?)"',texts)

print("请稍等...")
for i in song_hashes:
    information_url = 'https://wwwapi.kugou.com/yy/index.php?r=play/getdata&callback=jQuery19104610954889760035_1585364074033&hash=%s&album_id=0&dfid=2SSGs60RKO9P0bAzIe0xF4Us&mid=5a959954d2f99fc1438fe2efb7596511&platid=4&_=1585364074034'%i
    information = requests.get(information_url).text
    song_url = re.findall('"play_url":"(.*?)"',information)
    song_names = bytes(re.findall('"audio_name":"(.*?)"',information)[0],encoding='ascii').decode('unicode-escape')
    singers = bytes(re.findall('"author_name":"(.*?)"',information)[0],encoding='ascii').decode('unicode-escape')
    if song_names not in names.values():
        names[str(timer)] = song_names
        print("%d.%s"%(timer,song_names))
        print("作者:%s"%singers)
        print()
        timer += 1
    if song_url[0] not in song_urls.values():
        song_urls[str(timer-1)] = song_url[0]
print('输入n就不下载,若要下载多首歌曲,请用英文符号","隔开')
choice = input('请输入要下载歌曲的编号:').split(',')
if choice == "n":
    exit()
else:
    path = input("请输入要保存的路径:")
    has_path = os.path.exists(path)
    while has_path == False:
        print("路径不存在!!")
        path = input("请输入要保存的路径:")
        has_path = os.path.exists(path)
    for i in choice:
        song_url = song_urls[i].replace('\\/','/')
        song = requests.get(song_url).content
        save_name = names[i]
        with open(path + '/' + save_name + '.mp3','wb') as f:
            f.write(song)
    print("保存完成!")

相关推荐

大文件传不动?WinRAR/7-Zip 入门到高手,这 5 个技巧让你效率翻倍

“这200张照片怎么传给女儿?微信发不了,邮箱附件又超限……”62岁的张阿姨对着电脑犯愁时,儿子只用了3分钟就把照片压缩成一个文件,还教她:“以后用压缩软件,比打包行李还方便!”职场人更懂这...

电脑解压缩软件推荐——7-Zip:免费、高效、简洁的文件管理神器

在日常工作中,我们经常需要处理压缩文件。无论是下载软件包、接收文件,还是存储大量数据,压缩和解压缩文件都成为了我们日常操作的一部分。而说到压缩解压软件,7-Zip绝对是一个不可忽视的名字。今天,我就来...

设置了加密密码zip文件要如何打开?这几个方法可以试试~

Zip是一种常见的压缩格式文件,文件还可以设置密码保护。那设置了密码的Zip文件要如何打开呢?不清楚的小伙伴一起来看看吧。当我们知道密码想要打开带密码的Zip文件,我们需要用到适用于Zip格式的解压缩...

大文件想要传输成功,怎么把ZIP文件分卷压缩

不知道各位小伙伴有没有这样的烦恼,发送很大很大的压缩包会受到限制,为此,想要在压缩过程中将文件拆分为几个压缩包并且同时为所有压缩包设置加密应该如何设置?方法一:使用7-Zip免费且强大的文件管理工具7...

高效处理 RAR 分卷压缩包:合并解压操作全攻略

在文件传输和存储过程中,当遇到大文件时,我们常常会使用分卷压缩的方式将其拆分成多个较小的压缩包,方便存储和传输。RAR作为一种常见的压缩格式,分卷压缩包的使用频率也很高。但很多人在拿到RAR分卷...

2个方法教你如何删除ZIP压缩包密码

zip压缩包设置了加密密码,每次解压文件都需要输入密码才能够顺利解压出文件,当压缩包文件不再需要加密的时候,大家肯定想删除压缩包密码,或是忘记了压缩包密码,想要通过删除操作将压缩包密码删除,就能够顺利...

速转!漏洞预警丨压缩软件Winrar目录穿越漏洞

WinRAR是一款功能强大的压缩包管理器,它是档案工具RAR在Windows环境下的图形界面。该软件可用于备份数据,缩减电子邮件附件的大小,解压缩从Internet上下载的RAR、ZIP及其它类...

文件解压方法和工具分享_文件解压工具下载

压缩文件减少文件大小,降低文件失效的概率,总得来说好处很多。所以很多文件我们下载下来都是压缩软件,很多小伙伴不知道怎么解压,或者不知道什么工具更好,所以今天做了文件解压方法和工具的分享给大家。一、解压...

[python]《Python编程快速上手:让繁琐工作自动化》学习笔记3

1.组织文件笔记(第9章)(代码下载)1.1文件与文件路径通过importshutil调用shutil模块操作目录,shutil模块能够在Python程序中实现文件复制、移动、改名和删除;同时...

Python内置tarfile模块:读写 tar 归档文件详解

一、学习目标1.1学习目标掌握Python内置模块tarfile的核心功能,包括:理解tar归档文件的原理与常见压缩格式(gzip/bz2/lzma)掌握tar文件的读写操作(创建、解压、查看、过滤...

使用python展开tar包_python拓展

类Unix的系统,打包文件经常使用的就是tar包,结合zip工具,可以方便的打包并解压。在python的标准库里面有tarfile库,可以方便实现生成了展开tar包。使用这个库最大的好处,可能就在于不...

银狐钓鱼再升级:白文件脚本化实现GO语言后门持久驻留

近期,火绒威胁情报中心监测到一批相对更为活跃的“银狐”系列变种木马。火绒安全工程师第一时间获取样本并进行分析。分析发现,该样本通过阿里云存储桶下发恶意文件,采用AppDomainManager进行白利...

ZIP文件怎么打开?2个简单方法教你轻松搞定!

在日常工作和生活中,我们经常会遇到各种压缩文件,其中最常见的格式之一就是ZIP。ZIP文件通过压缩数据来减少文件大小,方便我们进行存储和传输。然而,对于初学者来说,如何打开ZIP文件可能会成为一个小小...

Ubuntu—解压多个zip压缩文件.zip .z01 .z02

方法将所有zip文件放在同一目录中:zip_file.z01,zip_file.z02,zip_file.z03,...,zip_file.zip。在Zip3.0版本及以上,使用下列命令:将所有zi...

如何使用7-Zip对文件进行加密压缩

7-Zip是一款开源的文件归档工具,支持多种压缩格式,并提供了对压缩文件进行加密的功能。使用7-Zip可以轻松创建和解压.7z、.zip等格式的压缩文件,并且可以通过设置密码来保护压缩包中的...

取消回复欢迎 发表评论: