您的位置:首页 > 编程语言 > Python开发

Python入门练习:酷我热歌榜Json格式数据分析 + Sqlite3数据库

2019-03-13 16:43 766 查看
版权声明:随便整,没版权 https://blog.csdn.net/bosslay/article/details/88536018

本篇适合新手练习,欢迎交流!

import sqlite3#调用sql数据库
import requests#调用请求库
import time##调用时间库
from urllib.request import urlretrieve##调用下载函数
import os#调用文件件函数
base_file  = 'kuwo_sql_data'#建立初始文件夹
if not os.path.exists(base_file):#判断存无
os.mkdir(base_file)#如无,则建立
db = sqlite3.connect('kuwo.db')##连接数据库
cursor = db.cursor()#启动数据库游标
sql= "CREATE TABLE IF NOT EXISTS KUWO_DATA (歌曲ID INTEGER PRIMARY KEY,歌曲名称 VARCHAR(20) ,演唱歌手 VARCHAR (20),唱
4000
片名称 VARCHAR (20),歌曲评分 INTEGER (100),历史最高排名 INTEGER (100),下载地址 VARCHAR )"##创建数据库
cursor.execute(sql)#执行sql语句
url = 'http://kbangserver.kuwo.cn/ksong.s?from=pc&fmt=json&type=bang&data=content&id=16&pn=0&rn=200&isbang=1&show_copyright_off=0&pcmp4=1&bangid=0&t=1528788054321&vipver=MUSIC_8.7.7.0_PQ'##接口地址
headers = {
'User-Agent':'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)'
}###请求头
print('爬虫启动成功!')
print('已获取初始地址,请求返回数据...')
response = requests.get(url,headers=headers).json()#请求并返回格式为json的数据
list_name = response['name']#提取排行榜名称
list_info = response['info']#提取排行榜信息
up_date = response['pub']#提取排行榜发布日期
print('JSON数据返回成功.开始解析...')
list_img = response['v9_pic2']##提取排行榜封面
list_num = response['num']#提取排行榜歌曲数量
songs = response['musiclist']##提取排行榜歌曲详情,准备进行及解析
#urlretrieve(list_img,f'{base_file}/{list_name}.jpg')#调用函数下载排行榜单封面(此处调用会间歇性报错,老师提供了另一种解决方案,根据字节流下载,附在之后)
print('榜单封面下载完成!')
for idx , song in enumerate(songs):
time.sleep(1)#防止访问过快,休眠函数
#print(idx,song)
song_id = song['id']#提取歌曲id
song_name = song['name']#提取歌曲名称
song_author = song['artist']#提取歌曲演唱歌手
song_album = song['album']#提取唱片名称
song_score = song['score100']#提取歌曲评分
song_rank = song['highest_rank']#提取歌曲历史最高排名
song_dolink = f'http://antiserver.kuwo.cn/anti.s?rid=MUSIC_{song_id}&format=mp3&type=convert_url&response=url'#拼接歌曲下载地址
print('▼'*50)
print(f'嗅探到当前第{idx}首歌曲\n歌曲ID:{song_id}\n歌曲名称:{song_name}\n演唱歌手:{song_author}\n唱片名称:{song_album}\n歌曲评分:{song_score}\n历史最高排名:{song_rank}')
try:####因有的歌曲信息不全,为防止写入时触发异常,故使用异常捕获
insert_sql = f"INSERT INTO KUWO_DATA(歌曲ID,歌曲名称,演唱歌手,唱片名称,歌曲评分,历史最高排名,下载地址) VALUES({song_id},'{song_name}','{song_author}','{song_album}',{song_score},{song_rank},'{song_dolink}')"##拼接sql语句
cursor.execute(insert_sql)#执行sql语句
db.commit()#提交执行
sort_sql = “SELECT * FROM KUWO_DATA ORDER BY 歌曲ID ASC”##按照歌曲ID升序的方式排列
cursor.excute(sort_sql)##执行sql语句
except Exception as error_count:
print('正在写入数据库,请稍后')

cursor.close()#关闭游标
db.close()#关闭数据库

字节流下载方法代码

#下载地址的url
url = f"http://antiserver.kuwo.cn/anti.s?rid=MUSIC_{song_id}&format=mp3&type=convert_url&response=url"
# 发请求,获取下载链接
response = requests.get(url, headers=headers)
# 获取歌曲下载地址
download_url = response.text
print(f'正在下载:{music["name"]}')
# 打开文件,以字节流的方式写入
with open(f'{music["name"]}.mp3', 'wb+') as f:
# 获取文件的字节数据
data = requests.get(download_url, headers=headers, timeout=100).content
# 写入到文件中
f.write(data)

解析过程输出界面

sqlite3数据库界面

end()

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: