随笔三 : 爬取喜马拉雅音频
import datetimeimport time
import requests
import uuid
from setting import *
content_dict ={
"儿歌":["424529","245037"],
"故事":["12891461","260744"],
"古诗":["15161417","12914364"],
}
def get_content_xmly(content_dict:dict):
# 专辑ID和页码?
for tags,a_list in content_dict.items():
for aid in a_list:
# 专辑循环结束后,开启下一个循环page就又从1开始了
page=1
while True:
content_list=requests.get(CONTENT_LIST_URL%(aid,page),headers=HEADERS).json()
page+=1
# 导入MongoDB的时候,一次性导入多条,所以放到列表中,当换专辑切换的时候列表再次清空
content_mongo_list=[]
# 如果爬到的内容为空就断开
if not content_list.get('data').get('trackDetailInfos'):
break
for content in content_list.get('data').get('trackDetailInfos'):
# 获取音乐名字
music_name = content.get('trackInfo').get('title')
music_url = content.get('trackInfo').get('playPath')
music_file_name = uuid.uuid4()
# 将配置的路径拼接到文件里面
music_path=os.path.join(MUSIC_PATH,f"{music_file_name}.mp3")
image_path=os.path.join(COVER_PATH,f"{music_file_name}.jpg")
# 图片地址--》host+图片的url
music_image = IMAGE_HOST + content.get('trackInfo').get('cover')
# 把数据流写如文件里面去(图片和音乐并保存)
music = requests.get(music_url).content
with open(music_path,'wb') as f:
f.write(music)
music_image = requests.get(music_image).content
with open(image_path, 'wb') as f:
f.write(music_image)
# 写入Mongodb里面去
content_info={
'title':music_name,
'music':f'{music_file_name}.mp3', # 存放的是音乐的名字,而不是音乐内容 否则数据库得爆炸
'cover':f'{music_file_name}.jpg', # 存放的是音乐的图片,而不是音乐图片 否则数据库得爆炸
'tag':tags,
'createTime':datetime.datetime.now()
}
# 批量导入多条数据到数据库里面
content_mongo_list.append(content_info)
# 设置爬取等待时间
time.sleep(1)
# 批量插入,content_list设置为空就是一页结束后自动清空
MongoDB.content.insert_many(content_list)
# 运行函数
get_content_xmly(content_dict)
页:
[1]