1.前序
想要得到云顶之弈游戏的排名数据,需要前往云顶之弈官网
https://lol.qq.com/tft/#/rank/list
通过谷歌浏览器,浏览者模式(F12),我们可以解析出排名数据接口。
# area_id 哪个区
# offset 第几页
# sign 加签串
http://qt.qq.com/lua/mlol_battle_info/get_total_tier_rank_list?area_id=XX&offset=XX&sign=XX
知道了这些,接下来就是如何对数据抓取及处理了。但在对数据做处理之前,我们需要处理一下加签串,即sign*。
def signCal(areaID,offset):
str1 = 'area_id='+areaID+'&offset='+str(offset)+'qtld^xibt#a*' #用于计算sign签名的字符串,最后一项为key
b = str1.encode(encoding='utf-8')
m = hashlib.md5()
m.update(b)
str_md5 = m.hexdigest() #MD5编码
return str_md5
数据获取及处理
def __init__(self):
self.url = "https://qt.qq.com/lua/mlol_battle_info/get_total_tier_rank_list?area_id={0}&offset={1}&sign={2}"
def run(self, area_id, offset, sign):
res = requests.post(self.url.format(str(area_id), str(offset), sign)).json()
# print(res)
# 对返回的数据做判断
if "data" not in res or "player_list" not in res["data"]:
return None
2.数据解析
当我们抓取到数据后,接下来就是要对数据做解析,解析数据就相对简单些。直接贴上解析数据代码
# 解析返回的数据
summoner_list = []
for summoner_item in res["data"]["player_list"]:
if "tier_title" not in summoner_item:
continue
if "name" not in summoner_item:
continue
if "uuid" not in summoner_item:
continue
if "ranking" not in summoner_item:
continue
if "league_points" not in summoner_item:
continue
summoner_list.append({
"area_id": area_id,
"tier": summoner_item["tier_title"],
"name": summoner_item["name"],
"uuid": summoner_item["uuid"],
"area": 1,
"ranking": summoner_item["ranking"],
"points": summoner_item["league_points"]
})
insert_in_db(summoner_list)
return summoner_list
3.演示
数据过长,这里仅贴部分数据,有兴趣的可以自己跑一遍代码,验证一下效果。
更多源码信息,请参考原文