python绘制动态图表怎么存下来_做动态图表,没有数据?用Python就能获取!
这是小F在国庆之前写的一篇文章,全网阅读累计达到3万+。
既然有了Python这个制作动态条形图工具,缺的那便是数据了。
先看一下B站2019年「数据可视化」版块的情况,第一个视频超2百万的播放量,4万+的弹幕。
小F自己在B站上制作的几个视频,也是几十万的播放量,累计获得1万赞。
那么作者是用什么来衡量手游的热门程度呢,答案便是百度指数。
同样小F使用的也是百度指数,百度指数是以百度海量网民行为数据为基础的数据分享平台。
所以本期就来聊一聊可视化视频的数据获取,主要是「百度指数」和「微博指数」。
本来想加上「微信指数」的,发现电脑的抓包软件出了问题,所以就没有加上。
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()
get_word()
得到的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代码,来看一下效果如何。
是成功实现了,就是配色有那么点渣,这个可自行修改颜色配置文件,让你的动图变得好看。
02. 微博指数
百度搜索新浪的微博指数,打开网站一看,发现网页版无法使用。
此时我们只需打开开发者工具,将你的浏览器模拟为手机端,刷新网页即可。
可以看到,微指数的界面出来了。
添加关键词,查看指数的数据接口。
请求是Post方法,并且不需要登陆微博账号。
import re
import time
import json
import requests
import datetime
# 请求头信息
headers = """accept: application/json
accept-encoding: gzip, deflate, br
accept-language: zh-CN,zh;q=0.9
content-length: 50
content-type: application/x-www-form-urlencoded
cookie: '你的cookie'
origin: https://data.weibo.com
referer: https://data.weibo.com/index/newindex?visit_type=trend&wid=1011224685661
sec-fetch-mode: cors
sec-fetch-site: same-origin
user-agent: Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1
x-requested-with: XMLHttpRequest"""
# 将请求头字符串转化为字典
headers = dict([line.split(": ",1) for line in headers.split("\n")])
print(headers)
# 数据接口
url = 'https://data.weibo.com/index/ajax/newindex/getchartdata'
# 获取时间列表
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
# 相关信息
names = ['汤唯', '朱亚文', '邓家佳', '乔振宇', '王学圻', '张艺兴', '俞灏明', '吴越', '梁冠华', '李昕亮', '苏可', '孙骁骁', '赵韩樱子', '孙耀琦', '魏巍']
# 获取微指数数据
for name in names:
try:
# 获取关键词ID
url_id = 'https://data.weibo.com/index/ajax/newindex/searchword'
data_id = {
'word': name
}
html_id = requests.post(url=url_id, data=data_id, headers=headers)
pattern = re.compile(r'li wid=\\\"(.*?)\\\" word')
id = pattern.findall(html_id.text)[0]
# 接口参数
data = {
'wid': id,
'dateGroup': '1month'
}
time.sleep(2)
# 请求数据
html = requests.post(url=url, data=data, headers=headers)
result = json.loads(html.text)
# 处理数据
if result['data']:
values = result['data'][0]['trend']['s']
startDate = '2019-01-01'
endDate = '2020-01-01'
dates = result['data'][0]['trend']['x']
# 保存数据
for value, date in zip(values, dates):
print(name, value, date)
with open('weibo.csv', 'a+', encoding='utf-8') as f:
f.write(name + ',' + str(value) + ',' + date + '\n')
except:
pass
获取到的信息如下。
也来生成一个动态图表。
import pandas as pd
import bar_chart_race as bcr
# 读取数据
df = pd.read_csv('weibo.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)
# print(df_result[:10])
# 生成GIF
bcr.bar_chart_race(df_result[:10], filename='weibo.gif', title='大明风华演职人员热度排行')
得到结果如下。
张艺兴的流量是真的顶,不愧是2020年十大最强流量小生之一。
[声明]本文版权归原作者所有,内容为作者个人观点,转载目的在于传递更多信息,如涉及作品内容、版权等问题,可联系本站删除,谢谢。
python绘制动态图表怎么存下来_做动态图表,没有数据?用Python就能获取!相关推荐
- python绘制星空图、要求有圆月_编程从绘画开始:用Python画一幅《月夜星空》图...
学会编程的最大好处,是可以实现自己的想象力,下面打算讲讲怎样用Python来画画. 这次使用自顶向下的思路,来讲讲这幅<月夜星空>是怎样画的. 细节的分层实现 从内容来说,分为三步:第一步 ...
- python绘制动态图表怎么存下来_用python如何实现导入excel数据后自动生成图表?python如何实现交互式动态图表?...
这个需求涉及的环节太多了.导入excel文件,获取数据 -- 需要xlrd模块把数据导入python 2. 设定输出图表类型 -- 需要matplot模块.根据数据复杂度,可能需要ETL,那么需要pa ...
- python 相关性检验怎么计算p值_收藏 | 大神教你用Python预测未来:一文看懂时间序列...
(由Python大本营付费下载自视觉中国) 作者 | Leandro Rabelo 译者 | 李洁 整理 | Lemonbit 出品 | Python数据之道 本文内容较长,较为详细的阐述了进行时间 ...
- python中的数据分析库有哪些_全网最全数据分析师干货-python篇
作者:胖熊酱 著作权归作者所有.AI开发者获得授权转载,禁止二次转载 https://zhuanlan.zhihu.com/p/79873148 注:封面图片来自网络 最近正在准备面试,故整理了很多面 ...
- python分析出nba球员的位置_【圆老司】用python展示NBA球员出手位置偏好
之前发过一篇用python展示NBA球员出手位置偏好的视频: 有些同学想要其中的代码和讲解.再加上当时用的NBA官方接口现在极不稳定,几乎无法使用,所以我这里就再发一篇图文,简单讲解下代码,以及新的替 ...
- python金融实务从入门到精通_免费下载中-华尔街学堂:python金融实务从入门到精通,数据实战分析视频教程下载 价值599元...
华尔街学堂:python金融实务从入门到精通 [4.5G] ┣━━第0章 课时 1 学员须知 [145.5M] ┃ ┗━━课时 2 课程讲义及学习资料 [145.5M] ┃ ┣━━data [92.3 ...
- python网络爬虫用到哪些技术_做Python网络爬虫需要掌握哪些核心技术?
在当下这个社会,如何有效地提取并利用信息成为一个巨大的挑战.基于这种巨大的市场需求,爬虫技术应运而生,这也是为什么现在爬虫工程师的岗位需求量日益剧增的原因.那么做Python网络爬虫需要掌握哪些核心技 ...
- python用于数据处理真的那么强大嘛_为什么有那么多人选择Python,真的有那么好吗?...
Python真的有那么好吗 今天超模君讲的是4个关于Python编程语言的故事,来看看人工智能时代爆发的Python. 超模君在这里不会告诉你Python是"较好的编程语言"(无论 ...
- python协同过滤电影推荐的论文_协同过滤?教你用Python实现协同过滤
提到ALS相信大家应该都不会觉得陌生,它是协同过滤的一种,并被集成到Spark的Mllib库中.本文就ALS的基本原理进行讲解,并手把手.肩并肩地带您实现这一算法. 协同过滤?教你用Python实现协 ...
最新文章
- 基于感知损失的实时风格迁移与超分辨率重建
- oracle中快速复制数据表(创建数据表)
- python实现可以被with上下文管理的类或函数
- 如何在cmd运行python文件夹_python怎么在cmd运行文件夹
- LeetCode Hot100 ---- 二叉树专题
- Face Alignment by 3000 FPS系列学习总结(一)
- 【BZOJ3831】Little Bird,单调队列优化DP
- javascript数据结构与算法---队列
- 4 python 中 关于数值及运算
- vue 动态添加路由
- mysql安装出现中文乱码_MySQL安装以及中文乱码问题
- 惠农补贴一折通计算机审计方法,审计惠农补贴资金的方法有哪些
- 多功能图片处理器微信小程序源码下载一键多种处理照片
- 利用MDK的FLM文件生成通用flash驱动
- Android Studio做登录界面
- 让命令不尽然history历史纪录的一种方法
- 对标Zoom和Twilio,百家云还要走多久?
- 歌曲版本识别或者歌曲检索(总结)
- bash shell:获取当前脚本的绝对路径(pwd/readlink)
- 大数据基础知识全集,大数据爱好者收藏必备