嘿,大家好,今天复习了一下爬虫知识,自己想爬个网易云的歌单下来,备着以后禁网的时候听。但由于我懒癌晚期,懒得直接上浏览器上搜,搜着,发现没有一个合格的。
为什么?其实是因为那些爬虫是打开浏览器(即 Selenium)、打开歌单的网址、把其中的歌曲名和链接拿下、依次用外链下载。
这个方法不好,原因是在网页版的网易云的无登陆状态是只能在歌单里看到十首歌,无法看全。就好比我歌单里有 50 首歌,而你的爬虫只能爬 10 首下来,没效果。

没办法,只能自己写了。<del> 就是套了个 api 嘛。</del > 源码如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import requests
import json
import jsonpath
import os


playlist_id = input('请输入歌单id: >>>')
myjson = requests.get(
'https://api.injahow.cn/meting/?type=playlist&id={}'.format(playlist_id)
)
data = json.loads(myjson.text)

urls = []
names = []
for i in data:
url = jsonpath.jsonpath(i, '$..url')
name = jsonpath.jsonpath(i, '$..name')

names.append(name[0])
urls.append(url[0])

# https://api.injahow.cn/meting/?server=netease&type=url&id=1344088470
print('总共有{}个链接,开始下载……\n'.format(len(urls)))


if not os.path.exists('.\\缓存糖果屋\\{}\\'.format(playlist_id)):
os.mkdir('.\\缓存糖果屋\\{}\\'.format(playlist_id))

num = 0
name_count = 0
for url in urls:

id = url.split('&')[2].split('&')[0].split('=')[1]
with requests.get(url) as resp:
with open(
'.\\缓存糖果屋\\{}\\'.format(playlist_id) + id + '.mp3',
mode='wb',
) as f:
f.write(resp.content)
num += 1
print('完成{}个,即为'.format(num) + names[name_count])
name_count += 1


print('\nALL DONE!')

还有进度条版的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import requests
import json
import jsonpath
import os
from tqdm import tqdm


playlist_id = input('请输入歌单id: >>>')
myjson = requests.get(
'https://api.injahow.cn/meting/?type=playlist&id={}'.format(playlist_id)
)
data = json.loads(myjson.text)

urls = []
names = []
for i in data:
url = jsonpath.jsonpath(i, '$..url')
name = jsonpath.jsonpath(i, '$..name')

names.append(name[0])
urls.append(url[0])

# https://api.injahow.cn/meting/?server=netease&type=url&id=1344088470
print('总共有{}个链接,开始下载……\n'.format(len(urls)))


if not os.path.exists('.\\缓存糖果屋\\{}\\'.format(playlist_id)):
os.mkdir('.\\缓存糖果屋\\{}\\'.format(playlist_id))

for url in tqdm(urls, desc='下载中'):

id = url.split('&')[2].split('&')[0].split('=')[1]
with requests.get(url) as resp:
with open(
'.\\缓存糖果屋\\{}\\'.format(playlist_id) + id + '.mp3',
mode='wb',
) as f:
f.write(resp.content)

效果:

如果看到那些用 ID 命名的歌曲不惯呢,可以打开网易云音乐桌面版 --> 打开本地音乐 --> 选择目录 --> 把 缓存糖果屋 添加进去 --> 添加完后,点击匹配音乐 --> ALL DONE!

TO DO LIST:

阅读次数