1.获取所有singer
from django.shortcuts import HttpResponse
from django.core.cache import cache
import requests, functools
import demjson
def get_singers(request):
url =
"http://artistlistinfo.kuwo.cn/mb.slist?stype=artistlist&category=0&order=hot&pn=0&rn=100&encoding=utf8"
response = requests.get(url)
return HttpResponse(respone.text, content_type="application/json")
2.自定义一个装饰器
def api(func):
# functools.wraps防止出错
@functools.wraps(func)
def deal_with(*args, **kwargs):
response_data = demjson.encode(func(*args, **kwargs))
response = HttpResponse(response_data, content_type='application/json')
# 解决跨域请求问题
response["Access-Control-Allow-Origin"] = "*"
response["Access-Control-Allow-Methods"] = "POST, GET, OPTIONS"
response["Access-Control-Max-Age"] = "1000"
response["Access-Control-Allow-Headers"] = "*"
return response
return deal_with
3.给get_singers加装饰器并拼接pic的url
@api
def get_singers(request):
url = "http://artistlistinfo.kuwo.cn/mb.slist?stype=artistlist&category=0&order=hot&pn=0&rn=100&encoding=utf8"
response = requests.get(url)
json_obj = demjson.decode(response.text)
artistlist = json_obj.get('artistlist', None)
for artist in artistlist:
artist['pic'] = 'http://img1.sycdn.kuwo.cn/star/starheads/' + artist.get("pic")
artist_dict = {
"artistlist": artistlist
}
return artist_dict
4.md5加密接口
import time
import hashlib
def md5(arg):
h = hashlib.md5()
h.update(arg.encode("utf-8"))
return h.hexdigest()
@api
def api_safe(request):
time_stamp = time.time()
print(time_stamp)
auth_key = request.META.get("HTTP_KEY")
if not auth_key:
return {'msg': 'you are not client'}
# auth_key = 32位字符串|时间戳|其它字符
client_md5_str, client_time = auth_key.split("|")
client_time = float(client_time)
if client_time + 100 < time_stamp:
return {'msg': 'time out'}
server_md5_str = md5("{}|{}".format(key, client_time))
client_md5_str = md5("{}|{}".format(client_md5_str, client_time))
if server_md5_str != client_md5_str:
return {
'msg': 'key not right'
}
if client_md5_str in visited_api:
return {'msg': 'you have visited'}
visited_api[client_md5_str] = client_md5_str
return {'msg': 'hello world'}
5.设置分页
page = request.GET.get('page', '1')
# isdigit 如果字符串只包含数字则返回Trur,否则False
# if page.isdigit():
# page = int(page)
# else:
# page = 1
# 有点复杂了,用‘三元运算符‘
page = int(page) if page.isdigit() else 1
size = 20
……
for artist in artistlist:
artist['pic'] = 'http://img1.sycdn.kuwo.cn/star/starheads/' + artist.get("pic")
artist_dict = {
"artistlist": artistlist[(page - 1) * size: page * size]
}
return artist_dict
6.按照歌手名称首字母查询
cname = request.GET.get('cname', 'hot').lower()
if cname in 'q w e r t y u i o p a s d f g h j k l z x c v b n m'.split(' '):
url = SINGERS_NAME_URL.format(cname)
response = requests.get(url)
json_str = response.text
json_obj = demjson.decode(json_str)
return json_obj
7.数据持久化---存放在硬盘,不是内存
(1)保存txt,但是数据是固定的,需要自己手动更新,推荐第二种!
response = requests.get(url)
json_str = response.text
with open("singers.txt", "w", encoding="utf-8") as f:
f.write(response.text)
else:
with open("singers.txt", encoding="utf-8") as f:
json_str = f.read()
json_obj = demjson.decode(json_str)
artistlist = json_obj.get('artistlist', None)
for artist in artistlist:
artist['pic'] = 'http://img1.sycdn.kuwo.cn/star/starheads/' + artist.get("pic")
artist_dict = {
"artistlist": artistlist[(page - 1) * size: page * size]
}
return artist_dict
(2)Django使用Redis数据缓存
需要先安装redis并启动,网上有详细教程0.0
from django.core.cache import cache #引入缓存模块
response = requests.get(url)
json_str = response.text
# with open("singers.txt", "w", encoding="utf-8") as f:
# f.write(response.text)
cache.set('singers.txt', json_str, 10 * 60)
else:
# with open("singers.txt", encoding="utf-8") as f:
# json_str = f.read()
json_str = cache.get('singers.txt')
json_obj = demjson.decode(json_str)
artistlist = json_obj.get('artistlist', None)
for artist in artistlist:
artist['pic'] = 'http://img1.sycdn.kuwo.cn/star/starheads/' + artist.get("pic")
artist_dict = {
"artistlist": artistlist[(page - 1) * size: page * size]
}
return artist_dict
8.得到歌手的数量(根据名称首字母)
pyecharts:后端图表展示库(网上有详细教程,自行查找)
from pyecharts import Bar
def get_singers_num(request): list = [chr(x).upper() for x in range(97, 123)] total_number = [] for x in list: if not cache.has_key('{}'.format(x)): url_x = CHARACTER_SINGER_URL.format(x) response = requests.get(url_x) json_str = response.text cache.set('{}'.format(x), json_str, 5*60) else: json_str = cache.get('{}'.format(x)) json_obj = demjson.decode(json_str) number = int(json_obj.get('total', 0)) total_number.append(number) bar =Bar('歌手数量柱状图', '小标题') bar.add('歌手数量', list, total_number, is_more_utils=True) print(list) print(total_number) bar.render() with open('render.html', encoding='utf-8') as f: html = f.read() return HttpResponse(html)
9.以上项目就完成了。接下来有想法的可以写一个接口文档,我用过apidoc(也可以用word)。
这个自行查找:
如果随便一个人通过这个文档都能获取数据,则它是好文档
如果确实不知道咋写,就参考新浪微博接口文档
文档书写方式
1. 使用word文档 操作麻烦,格式难统一,浏览不方便
2. 使用excel表格 操作麻烦,浏览不方便
3. 使用网页 使用ApiDoc或者Mkdocs来制作 推荐写法