从零开发手机app之爬取数据

为了巩固python学习,决定开发一个简单的音乐播放app,主要使用到的技术有flask+socket+mongodb+uni-app。我们先来简单采集一些音乐数据,这里不牵涉到太高深的爬虫技术(太高深也不会啊),就简单的使用requests库帮我们来完成。

关于采集目标站点,我这里爬取的酷我音乐的数据,没别的原因,就是没遇到反爬机制(我这里一秒采取一条暂时还没有遇到什么反爬虫机制),本来目的也只是学习,我们就采集30条数据就够了。

前提准备

确保你的python已安装了requests

1
pip install requests

确保安装了MongoDB

网上大把的安装教程,基本下一步下一步就能完成安装,关于使用可以参考pythonMongoDB常用操作

找到酷我音乐的音乐接口

本人选取的是抖音热歌榜页面,通过浏览器开发者工具分析出音乐分布在两个接口上(其实是3个):个歌曲列表接口、歌曲信息接口、歌曲文件接口,因为列表中接口中包含了歌曲的一些简单信息如:封面、歌曲名、作者、时长、上线时间等已经够我们使用了,所以这里我们不用去歌曲信息接口上再取数据了。

歌曲列表接口地址:

1
http://www.kuwo.cn/api/www/bang/bang/musicList?bangId=158&pn=1&rn=30&reqId=a27b7ee0-ebd3-11e9-92b8-13a9816f0dc5

数据返回如下

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
{
code: 200,
curTime: 1570763602713,
data: {
num: "100",
pub: "2019-10-08",
musicList: [
{
musicrid: "MUSIC_77162192",
artist: "姚智鑫",
trend: "u0",
pic: "http://img1.kuwo.cn/star/albumcover/300/27/21/838967606.jpg",
isstar: 0,
rid: 77162192,
duration: 141,
rank_change: "2",
track: 0,
hasLossless: false,
hasmv: 0,
releaseDate: "2019-09-10",
album: "野狼disco抒情版",
albumid: 10736160,
pay: "0",
artistid: 3024208,
albumpic: "http://img1.kuwo.cn/star/albumcover/500/27/21/838967606.jpg",
songTimeMinutes: "02:21",
isListenFee: false,
pic120: "http://img1.kuwo.cn/star/albumcover/120/27/21/838967606.jpg",
name: "野狼disco (抒情完整版)",
online: 1,
payInfo: {
cannotOnlinePlay: 0,
cannotDownload: 0
}
},
{
musicrid: "MUSIC_52241430",
artist: "张泽熙",
trend: "e0",
pic: "http://img1.kuwo.cn/star/albumcover/300/10/1/3204759747.jpg",
isstar: 0,
rid: 52241430,
duration: 220,
rank_change: "0",
track: 1,
hasLossless: false,
hasmv: 1,
releaseDate: "2018-08-11",
album: "那个女孩",
albumid: 6799808,
pay: "16515324",
artistid: 3052403,
albumpic: "http://img1.kuwo.cn/star/albumcover/500/10/1/3204759747.jpg",
songTimeMinutes: "03:40",
isListenFee: false,
pic120: "http://img1.kuwo.cn/star/albumcover/120/10/1/3204759747.jpg",
name: "那个女孩",
online: 1,
payInfo: {
cannotOnlinePlay: 0,
cannotDownload: 0
}
},
...
}
}

歌曲文件接口地址:

1
2
3
http://www.kuwo.cn/url?format=mp3&rid={mid}&response=url&type=convert_url3&br=128kmp3&from=web&t=1570763011614&reqId=b4d733e1-ebd3-11e9-92b8-13a9816f0dc5

# rid代表歌曲的id

歌曲文件接口数据返回如下

1
2
3
4
5
{
code: 200,
msg: "success",
url: "https://nx01-sycdn.kuwo.cn/6b80ef89b1193109cc138d8c0d731e46/5d9ff5fd/resource/n3/53/19/3884797726.mp3"
}

编写爬虫

为防止频繁访问酷我音乐,我这里选择将静态资源也下载到本地,如封面和歌曲文件。

配置文件

1
2
3
4
5
6
7
8
9
# settings.py文件,当前进度内容
# 图片与歌曲文件路径
MEDIA_PATH = "static/media"
IMAGE_PATH = "static/img"

#数据库配置
import pymongo
client = pymongo.MongoClient(host="127.0.0.1",port=27017)
MONGO_DB = client["aios"]

爬虫代码

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# spider.py爬虫代码如下
import requests, time, os
import settings

# 防止被墙
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36',
'Accept':'text/html,application/xhtml+ xml,application/xml;q = 0.9,image/webp,image/apng,*/*;q=0.8, application/signe-exchange;v = b3'
}

# 抖音热歌列表url
music_list_url = 'http://www.kuwo.cn/api/www/bang/bang/musicList?bangId=158&pn=1&rn=30&reqId=a27b7ee0-ebd3-11e9-92b8-13a9816f0dc5'
# 歌曲资源地址信息
music_file_url = 'http://www.kuwo.cn/url?format=mp3&rid={mid}&response=url&type=convert_url3&br=128kmp3&from=web&t=1570763011614&reqId=b4d733e1-ebd3-11e9-92b8-13a9816f0dc5'

# 爬取音乐
def kuwo():
# 获取歌曲列表接口
res = requests.get(music_list_url, headers=headers)
# 获取歌曲列表数据
music_datas = res.json().get('data').get('musicList')
# 循环读取每条歌曲数据
for item in music_datas:
# 休眠一秒防止被踢
time.sleep(1)
# 获取歌曲文件信息
music_obj = requests.get(music_file_url.format(mid=item.get('rid')), headers=headers)
# 定义文件名
from uuid import uuid4
filename = uuid4()
# 定义要保存的图片名称及路径
img = os.path.join(settings.IMAGE_PATH, f"{filename}.jpg")
# 定义要保存的文件名称及路径
mp3 = os.path.join(settings.MEDIA_PATH, f"{filename}.mp3")
# 下载歌曲图片
download(item.get('pic'), img)
# 下载歌曲文件
download(music_obj.json().get('url'), mp3)
# 保存至数据库
settings.MONGO_DB.music.insert_one({
"title" : item.get('name'),
"author" : item.get('artist'),
"pic" : f"{filename}.jpg",
"audio" : f"{filename}.mp3",
"releaseDate" : item.get('releaseDate'),
"songTimeMinutes" : item.get('songTimeMinutes'),
})
print('采集成功……')
# 下载文件
def download(url, path):
'''
下载文件
:param url: 要在下载的文件路径
:param path: 要保存的文件位置
:return:
'''
res = requests.get(url).content
with open(path, 'wb') as f:
f.write(res)

if __name__ == '__main__':
# 开始爬取
kuwo()

执行爬取

运行该文件,数十秒后可以看到文件夹中已经下载好了刚才爬取的封面和mp3文件

数据库中我们也可以看到歌曲信息也正常保存了

爬虫代码基本每行都加了注释,另外本身也很简单,到此,准备数据部分结束