用Python获取动态图表数据!

it2025-10-14  7

相信很多人都看到了用python写动态条形图的文章了吧?

既然有了Python这个制作动态条形图工具,缺的那便是数据了。

先看一下B站2019年「数据可视化」版块的情况,第一个视频超2百万的播放量,4万+的弹幕。

用什么来衡量手游的热门程度呢,答案便是百度指数。

同样我使用的也是百度指数,百度指数是以百度海量网民行为数据为基础的数据分享平台。

所以本期就来聊一聊可视化视频的数据获取,主要是「百度指数」和「微博指数」。

本来想加上「微信指数」的,发现电脑的抓包软件出了问题,所以就没有加上。

01. 百度指数

获取百度指数,首先需要登陆你的百度账号。

 

以关键词「王者荣耀」为例,时间自定义为2020-10-01~2020-10-10。

 

通过开发者工具,我们就能看到曲线图的数据接口。

 

然而一看请求得到的结果,发现并没有数据,原因是这里使用了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 = "http://index.baidu.com/api/SearchApi/index?area=0&word=[[%7B%22name%22:%22%E7%8E%8B%E8%80%85%E8%8D%A3%E8%80%80%22,%22wordType%22:1%7D]]&startDate=2020-10-01&endDate=2020-10-10" params = { 'word': json.dumps([[{'name': keyword, 'wordType': 1}] for keyword in keywords]), 'startDate': startDate, 'endDate': endDate, 'area': area } data_url = 'http://index.baidu.com/api/SearchApi/index?' + urlencode(params) # print(data_url) headers = { # 复制登录后的cookie "Cookie": '你的cookie', "Referer": "http://index.baidu.com/v2/main/index.html", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; 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 = res["data"]["userIndexes"][0]["all"]["data"] uniqid = res["data"]["uniqid"] # 获取js函数中的参数t = "ev-fxk9T8V1lwAL6,51348+.9270-%" t_url = "http://index.baidu.com/Interface/ptbk?uniqid={}".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 = ['诸葛大力', '张伟', '胡一菲', '吕子乔', '陈美嘉', '赵海棠', '咖喱酱', '曾小贤', '秦羽墨'] for word in words: try: time.sleep(2) startDate = '2020-10-01' endDate = '2020-10-10' area = 0 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(word, num, date) with open('word.csv', 'a+', encoding='utf-8') as f: f.write(word + ',' + str(num) + ',' + date + '\n') except: pass get_area()

得到的CSV文件结果如下,有两种形式的数据。

 

一种是多个关键词每日指数数据,另一种是一个关键词各省市每日指数数据。

有了数据就可以用Python制作动图啦。

import pandas as pd import bar_chart_race as bcr # 读取数据 # df = pd.read_csv('word.csv', encoding='utf-8', header=None, names=['name', 'number', 'day']) df = pd.read_csv('area.csv', encoding='utf-8', header=None, names=['name', 'number', 'day']) # 数据处理,数据透视表 df_result = pd.pivot_table(df, values='number', index=['day'], columns=['name'], fill_value=0) # 生成GIF # bcr.bar_chart_race(df_result, filename='word.gif', title='爱情公寓5演职人员热度排行') bcr.bar_chart_race(df_result, filename='area.gif', title='国内各省市王者荣耀热度排行')

 5行Python代码,来看一下效果如何。

是成功实现了,就是配色有那么点渣,这个可自行修改颜色配置文件,让你的动图变得好看。

另外我建立了一个Python学习圈子:1156465813。在彼此的沟通可以我们可以得到很多学习经验,积累知识,群内有2020最新的python学习资料,大家可以一起讨论问题,共同进步。

最新回复(0)