做动态图表没有数据?用Python就能获取


做动态图表没有数据?用Python就能获取文章插图
做动态图表没有数据?用Python就能获取文章插图
来源 | 法纳斯特(ID:walker398)
刷爆全网的动态条形图 , 原来5行Python代码就能实现!这是小F在国庆之前写的一篇文章 , 既然有了Python这个制作动态条形图工具 , 缺的那便是数据了 。
先看一下B站2019年「数据可视化」版块的情况 , 第一个视频超2百万的播放量 , 4万+的弹幕 。
做动态图表没有数据?用Python就能获取文章插图
小F自己在B站上制作的几个视频 , 也是几十万的播放量 , 累计获得1万赞 。
做动态图表没有数据?用Python就能获取文章插图
那么作者是用什么来衡量手游的热门程度呢 , 答案便是百度指数 。
同样小F使用的也是百度指数 , 百度指数是以百度海量网民行为数据为基础的数据分享平台 。
所以本期就来聊一聊可视化视频的数据获取 , 主要是「百度指数」和「微博指数」 。
本来想加上「微信指数」的 , 发现电脑的抓包软件出了问题 , 所以就没有加上 。
做动态图表没有数据?用Python就能获取文章插图
百度指数
获取百度指数 , 首先需要登陆你的百度账号 。
以关键词「王者荣耀」为例 , 时间自定义为2020-10-01~2020-10-10 。 通过开发者工具 , 我们就能看到曲线图的数据接口 。
做动态图表没有数据?用Python就能获取文章插图
然而一看请求得到的结果 , 发现并没有数据 , 原因是这里使用了JS加密 。
这可碰到小F的知识盲区了 , 果断选择去找度娘 , 各位有兴趣的同学也可自行百度 。 最终找到解决方法 , 成功实现爬取 , 代码如下~
import time
import json
import execjs
import datetime
import requests
from urllib.parse import urlencode
def get_data(keywords, startDate, endDate, area):
"""
获取加密的参数数据
"""
# data_url = ";word=[[%7B%22name%22:%22%E7%8E%8B%E8%80%85%E8%8D%A3%E8%80%80%22,%22wordType%22:1%7D]] Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36"
}
# 获取data和uniqid
res = requests.get(url=data_url, headers=headers).json
data = http://kandian.youth.cn/index/res["data"]["userIndexes"][0]["all"]["data"]
uniqid = res["data"]["uniqid"]
# 获取js函数中的参数t = "ev-fxk9T8V1lwAL6,51348+.9270-%"
t_url = "{}".format(uniqid)
rep = requests.get(url=t_url, headers=headers).json
t = rep["data"]
return {"data": data, "t": t}
def get_search_index(word, startDate, endDate, area):
"""
获取最终数据
"""
word = word
startDate = startDate
endDate = endDate
# 调用get_data获取data和uniqid
res = get_data(word, startDate, endDate, area)
e = res["data"]
t = res["t"]
# 读取js文件
with open('parsing_data_function.js', encoding='utf-8') as f:
js = f.read
# 通过compile命令转成一个js对象
docjs = execjs.compile(js)
# 调用function方法,得到指数数值
res = docjs.call('decrypt', t, e)
# print(res)
return res
def get_date_list(begin_date, end_date):
"""
获取时间列表
"""
dates =
dt = datetime.datetime.strptime(begin_date, "%Y-%m-%d")
date = begin_date[:]
while date <= end_date:
dates.append(date)
dt += datetime.timedelta(days=1)
date = dt.strftime("%Y-%m-%d")
return dates
def get_area:
areas = {"901": "山东", "902": "贵州", "903": "江西", "904": "重庆", "905": "内蒙古", "906": "湖北", "907": "辽宁", "908": "湖南", "909": "福建", "910": "上海", "911": "北京", "912": "广西", "913": "广东", "914": "四川", "915": "云南", "916": "江苏", "917": "浙江", "918": "青海", "919": "宁夏", "920": "河北", "921": "黑龙江", "922": "吉林", "923": "天津", "924": "陕西", "925": "甘肃", "926": "新疆", "927": "河南", "928": "安徽", "929": "山西", "930": "海南", "931": "台湾", "932": "西藏", "933": "香港", "934": "澳门"}
for value in areas.keys:
try:
word = ['王者荣耀']
time.sleep(1)
startDate = '2020-10-01'
endDate = '2020-10-10'
area = value
res = get_search_index(word, startDate, endDate, area)
result = res.split(',')
dates = get_date_list(startDate, endDate)
for num, date in zip(result, dates):
print(areas[value], num, date)
with open('area.csv', 'a+', encoding='utf-8') as f:
f.write(areas[value] + ',' + str(num) + ',' + date + '\n')
except:
pass
def get_word:
words = ['诸葛大力', '张伟', '胡一菲', '吕子乔', '陈美嘉', '赵海棠', '咖喱酱', '曾小贤', '秦羽墨']