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年十大最强流量小生之一。

[声明]本文版权归原作者所有,内容为作者个人观点,转载目的在于传递更多信息,如涉及作品内容、版权等问题,可联系本站删除,谢谢。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/501129.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring的AOP-准备工作

目录 Spring的AOP-准备工作 1.Spring框架一般基于 AspectJ 实现AOP操作 2.基于AspectJ 实现 AOP 操作 &#xff08;1&#xff09;基于xml 配置文件实现 &#xff08;2&#xff09;基于注解方式实现【常用】 3.在项目工程用引入AOP 相关依赖 步骤一&#xff1a;找到依赖包…

python 小说 云_小说python操作PLC

PLC(Programmable Logic Controller)可编程逻辑控制器&#xff0c;可以理解为一个微型计算机&#xff0c;广泛应用于工业控制中&#xff0c;如楼宇智控、精密机床、汽车电子等等。 随着物联网的兴起&#xff0c;越来越多的传统工业设备需要和外界通信&#xff0c;但很多情况下&…

stream去重_使用Java Stream API中DistinctBy删除重复数据

Stream API提供distinct()方法&#xff0c;该方法基于数据Object类的equals()方法返回列表的不同元素。下面先做一个数据Object类&#xff0c;用来发现重复数据&#xff1a;public class LegacyObject {private final UUID id;private final String foo;private final int bar;…

Spring的AOP-AspectJ注解方式

目录 Spring的AOP-AspectJ注解方式 1.创建类&#xff0c;在类里面定义方法 2.创建增强类 3.进行通知的配置 &#xff08;1&#xff09;在Spring 配置文件中&#xff0c;开启直接扫描 &#xff08;2&#xff09;使用注解创建User 和 UserProxy 对象 &#xff08;3&#x…

python turtle绘制柱状图_python绘制图形(Turtle模块)

用python的Turtle模块可以绘制很多精美的图形&#xff0c;下面简单介绍一下使用方法。 需要用到的工具有python&#xff0c;python 的安装这里就不再细说。自行搜索。 from turtle import * #引入turtle模块 color(red, yellow) #设置绘制的颜色和填充颜色 # 海龟设置 hideturt…

laravel商品图片怎么展示_如何使用Laravel图片处理包intervention-image

下面由Laravel教程栏目给大家介绍如何使用Laravel图片处理包intervention-image&#xff0c;希望对需要的朋友有所帮助&#xff01;最近偶然发现了Laravel可用的图片处理包intervention-image。文档地址&#xff1a;http://image.intervention.io安装起来也很简单。composer re…

JdbcTemplate(概念和准备)

目录 1.什么是jdbcTemplate 2.使用前准备工作&#xff1a; &#xff08;1&#xff09;引入相关jar包 &#xff08;2&#xff09;在spring 配置文件配置数据库连接池​ &#xff08;3&#xff09;配置jdbcTemplate 对象&#xff0c;注入 DataSource &#xff08;4&#xf…

python shape函数_Python中的多态及抽象类

本书同名免费MOOC《Python编程基础及应用》在哔哩哔哩(B站)热播&#xff0c;作者带着你学。版权声明&#xff1a;本文内容引用自作者的图书《Python编程基础及应用》(高等教育出版社)。本文可以在互联网上转载传播&#xff0c;但必须包含文中的版权声明&#xff1b;本文不可以以…

idea搭建maven项目关于数据库连接jar包版本问题解决方案

SQLNonTransientConnectionException: CLIENT_PLUGIN_AUTH is required 将mysql-connector-java由5.1.34升级到了6.0.6&#xff0c;本机MySQL5.7使用没问题&#xff0c;连测试服务器MySQL5.5创建数据库连接报错 解决方案&#xff1a; 将mysql-connector-java的版本退回到5.1.34…

二叉树的递归遍历|前中后序遍历、最大深度、最大直径

二叉树的递归遍历 前序遍历 public List<Integer> preorderTraversal(TreeNode root) {List<Integer> res new ArrayList<>();if (root null) {return res;}res.add(root.val);if (root.left ! null) {res.addAll(preorderTraversal(root.left));}if (roo…

python对象的三个属性_Python 对象属性的访问

在 Python 中&#xff0c;一切皆对象。属性访问可以理解为是从一个已有的对象中获得另一个对象的方法。对象属性的访问涉及到对象的 __dict__ 属性、描述符等概念&#xff0c;以及 __getattribute__、__getattr__ 等方法。 对象字典属性 Python 中的对象有一个 __dict__ 属性&a…

JdbcTemplate(操作数据库-添加功能)

目录 JdbcTemplate&#xff08;操作数据库-添加功能&#xff09; 1.建立数据库表&#xff1a; 2.对应数据库创建实体类&#xff1a; 3.编写service 和 dao &#xff08;1&#xff09;在 dao 层进行数据库添加操作 &#xff08;2&#xff09;具体&#xff1a;调用jdbcTemp…

python读取大文件csv_实现读取csv文件,文件里面是有限个百分数成绩(99.6、76.8等等...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 实现读取csv文件&#xff0c;文件里面是有限个百分数成绩&#xff08;99.6、76.8等等&#xff09;导出GPA 和等级代码是这样&#xff0c;但是报错了&#xff0c;在score float(sc)这行就报错了&#xff0c;下面有没有错误还不知道…

JdbcTemplate(操作数据库-修改和删除功能)

目录 JdbcTemplate&#xff08;操作数据库-删除功能&#xff09; 1.创建数据库 2.配置文件实现 3.创建实体类 4.创建dao层 5.创建service层 6.测试类 7.测试结果&#xff1a; JdbcTemplate&#xff08;操作数据库-删除功能&#xff09; 1.创建数据库 user_db数据库的t_…

单片机定时器实验两位倒计时秒表_51单片机基础与应用8天速成(三)

在讲授中断这一概念时&#xff0c;人们总是喜欢举洗衣服烧水的例子&#xff1a;话说&#xff0c;一天“你”独自在家&#xff0c;为了泡脚给自己烧上了一壶水&#xff0c;然后想着明天没有衣服穿了&#xff0c;就去阳台洗起了衣服。过了十几分钟&#xff0c;“你”在阳台洗着衣…

网线制作ppt_快速制作PPT技巧!

为什么同样的PPT&#xff0c;你花费了一天&#xff0c;我却只用了一小时&#xff1f;在我仔细观察了一些制作人员的操作后&#xff0c;总结了如下实用技巧&#xff01;01自定义访问工具栏在PPT中我们有很多的常用操作&#xff0c;例如「左对齐/右对齐」「置于底层/置于顶层」「…

JdbcTemplate(操作数据库-查询返回值)

目录 JdbcTemplate&#xff08;操作数据库-查询返回值&#xff09; 1.创建数据库 2.创建实体类 3.创建dao层 4.创建service层 5.创建测试类&#xff1a; 6.xml配置 7.测试结果&#xff1a; 8.结构示意&#xff1a; JdbcTemplate&#xff08;操作数据库-查询返回值&…

c++opencv显示中文_OpenCV安装,配置和运行

今天小崔有个项目功能想用OpenCV软件库实现一下&#xff0c;就安装了OpenCV,在这里给大家分享一下安装过程。一.什么是OpenCV OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉和机器学习软件库&#xff0c;可以运行在Linux、Windows、Android和Mac OS操作系统上。 它轻量…

qt 当前窗口句柄_QT获取Windows系统所有窗口句柄

#include #include #pragma comment(lib,"user32.lib")/* 回调函数&#xff0c;用于捕获进程 */BOOL MyEnumProc(HWND hwnd, LPARAM param){LPWSTR lpString (LPWSTR)malloc(sizeof(WCHAR) * MAX_PATH);if (IsWindow(hwnd) &&IsWindowEnabled(hwnd) &&a…

JdbcTemplate(操作数据库-查询返回对象、查询返回集合)

JdbcTemplate&#xff08;操作数据库-查询返回对象、查询返回集合&#xff09; 1.创建数据库 数据库中有三条记录&#xff0c;数据库名为user_db&#xff0c;数据库表为t_book 2.新建实体类&#xff1a; Book类中的每一个属性对应数据库中的一条记录 package org.example.sp…