做动态图表没有数据?用Python就能获取
来源 | 法纳斯特(ID:walker398)
刷爆全网的动态条形图,原来 5 行 Python 代码就能实现!这是小F在国庆之前写的一篇文章,既然有了Python这个制作动态条形图工具,缺的那便是数据了。
先看一下B站2019年「数据可视化」版块的情况,第一个视频超2百万的播放量,4万+的弹幕。
小F自己在B站上制作的几个视频,也是几十万的播放量,累计获得1万赞。
那么作者是用什么来衡量手游的热门程度呢,答案便是百度指数。
同样小F使用的也是百度指数,百度指数是以百度海量网民行为数据为基础的数据分享平台。
所以本期就来聊一聊可视化视频的数据获取,主要是「百度指数」和「微博指数」。
本来想加上「微信指数」的,发现电脑的抓包软件出了问题,所以就没有加上。
百度指数
获取百度指数,首先需要登陆你的百度账号。
以关键词「王者荣耀」为例,时间自定义为2020-10-01~2020-10-10。
通过开发者工具,我们就能看到曲线图的数据接口。
然而一看请求得到的结果,发现并没有数据,原因是这里使用了JS加密。
这可碰到小F的知识盲区了,果断选择去找度娘,各位有兴趣的同学也可自行百度。
最终找到解决方法,成功实现爬取,代码如下~
import time
import json
import execjs
import datetime
import requests
from urllib.parse import urlencodedef 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和uniqidres = 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 = wordstartDate = startDateendDate = endDate# 调用get_data获取data和uniqidres = 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 resdef 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 datesdef 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 = valueres = 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:passdef get_word():words = ['诸葛大力', '张伟', '胡一菲', '吕子乔', '陈美嘉', '赵海棠', '咖喱酱', '曾小贤', '秦羽墨']for word in words:try:time.sleep(2)startDate = '2020-10-01'endDate = '2020-10-10'area = 0res = 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:passget_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代码,来看一下效果如何。
是成功实现了,就是配色有那么点渣,这个可自行修改颜色配置文件,让你的动图变得好看。
微博指数
百度搜索新浪的微博指数,打开网站一看,发现网页版无法使用。
此时我们只需打开开发者工具,将你的浏览器模拟为手机端,刷新网页即可。
可以看到,微指数的界面出来了。
添加关键词,查看指数的数据接口。
请求是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:# 获取关键词IDurl_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年十大最强流量小生之一。
相关代码链接:
https://pan.baidu.com/s/1Kh-eoOqxIJBQKf-dx9txXw(密码:lhye)
更多精彩推荐
最新!百度首发 OCR 自训练平台 EasyDL OCR
11.11大促来袭,京东如何保障云安全?
算力至上?四大AI芯片大对决
小米、QQ等8款手机浏览器发布自查整改公告;AMD宣布收购赛灵思;TypeScript 4.0.5发布|极客头条
@程序员,什么才是“2020-1024”的正确打开姿势?
相关文章:

CCTouchDispatcher sharedDispatcher 方法过期
//[[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:YES]; [[[CCDirector sharedDirector] touchDispatcher] addTargetedDelegate:selfpriority:0swallowsTouches:YES];转载于:https://www.cnblogs.com/sell/archive/2013/01/14/2…

哪些听起来像段子一样的故事?
杭州海底世界,一个小走廊两边都是各种爬行动物展览。有两只蜥蜴当时是这个样子人还年轻,还比较猥琐,看到一个趴在另一个身上就觉得在做什么羞羞的事。于是就拍下来,发到群里,然后说了句交配中。然后一天就光拍照&#…
立足高校矢志创新,鲲鹏计算生态长沙在行动
在今年,虽然全球经济发展受到疫情和国际形势变化影响增速减缓,但我国在AI、云计算、大数据、5G等前沿技术方面的发展却依然没有停下脚步。发展前沿技术,计算产业是基础。因此,培养计算产业人才成为当前全社会共同面对的一大关键。…

用好ASP.NET 2.0的URL映射
简介: URL映射是ASP.NET 2.0中提供的新特性。URL映射技术帮助我们将一个特定URL映射为另一个URL。为了帮助理解,我们假设你在站点有一个叫Homepage.aspx的页面来访问主页,所有的用户也都用这个页面来访问你的主页。但由于某些原因&#x…

N皇后问题的位运算求解——目前最快的方法
核心代码如下: 1 void test(int row, int ld, int rd) 2 { 3 int pos, p; 4 if ( row ! upperlim ) 5 { 6 pos upperlim & (~(row | ld | rd )); 7 while ( pos ) 8 { 9 p pos & (~pos 1); 1…

cocos2d-x JS 获取当前系统时间(解决屏幕双击点击事件)
记录一下,好开心,感觉今天自己又学到东西了,对于屏幕双击事件本来还毫无头绪的,今天得以解决总算没白费加班,其实原理很简单;就是在点击事件里做一个判断,这个判断就是需要获取当前系统的时间的…

怎么样给下拉框加载背景色
选择自 PPLUNCLE 的 Blog 部分代码:------aspx页面: <tr> <td><select id“job“ name“job“ runat“server“></td></tr>说明:下拉框必须写成上面的形式,用<asp:dropdownlist....>不能实现------cs页…

Windows 7 部署(一):安装和部署简述
术语表: 英文缩写英文全称中文全称备注 MDT Microsoft Deployment Toolkit 微软部署工具包 免费,需要域环境及DHCP服务器(Port 66 and 67),需要首先安装WAIK。使用MDT部署Windows 7时,也需要WDS,WDS主要负责推送WinP…

希捷发布CORTX对象存储软件与开源社区,普惠超大规模数据存储
数据存储和管理解决方案提供商希捷科技今日(10月29日)举行了“Let’s Rethink Data”希捷科技Datasphere线上峰会。在本次峰会,希捷科技携手行业专家与生态合作伙伴洞见数据产业趋势,并发布了对象存储软件CORTXTM以及CORTXTM开源社…

最优化:拉格朗日乘子法
作者:桂。 时间:2017-03-27 20:26:17 链接:http://www.cnblogs.com/xingshansi/p/6628785.html 声明:欢迎被转载,不过记得注明出处哦~ 【读书笔记06】 前言 看到西蒙.赫金的《自适应滤波器原理》第四版第四章…

在Asp.Net中从sqlserver检索(retrieve)图片
介绍:这篇文章是我写的"如何把图片存入sqlServer中"的后续。我建议你在读这篇文章之前先看看那篇。和存储图片相比,读取图片就要简单多了。输出一副图片我们要做的就是使用Response对象的BinaryWrite方法。同时设置图片的格式。在这篇文章中&a…
华为鲲鹏产业生态加速算力升级,企业数字化转型在山西吹响号角
2020年,新基建风口已至,建设数字基础设施,打造数字产业生态是其关键与核心,而算力底座将成为其重要的运行支撑。数字化浪潮大背景下,鲲鹏计算产业生态,充满巨大的想象与发展空间。从企业数字化转型角度来看…

隐藏TabBar
在项目中经常遇到隐藏tabBar,实力很多种方法,可以解决不同情况下问题1://隐藏tabBar WebViewController *webVc [[WebViewController alloc] init]; webVc.hidesBottomBarWhenPushed YES; [self.navigationController pushViewController:web…

Linux下安装JDK和Eclipse
安装Eclipse时前需要确保系统中已经具备Java运行环境,本文以干净系统初次安装Eclipse为例,同时安装JDK和Eclipse. 1.下载JDK压缩包: http://www.oracle.com/technetwork/java/javase/downloads/index.html 假设保存位置为:/hom…

如何在ASP.Net 中把图片存入数据库
介绍 可能有很多的时候,我们急需把图片存入到数据库当中。在一些应用程序中,我们可能有一些敏感的资料,由于存储在文件系统(file system)中的东西,将很容易被某些用户盗取,所以这些数据不能存…
人类偏好的“可塑性”,从博弈说起
作者 | 斯图尔特罗素来源 | 《AI新生》出品 | AI科技大本营经济学家通过为人类受试者提供选择来套取他们的偏好。该技术广泛应用于产品设计、营销和交互式电子商务系统中。例如,汽车设计师向受测试者提供具有不同油漆颜色、座位安排、后备厢大小、电池容量、杯架等选…

基于python的一个运维自动化的项目(进度更新)【已开源】
文章已经转到 http://xiaorui.cc 个人博客里,欢迎浏览 !!!交流Python & Golang 可以加群 278517979 .

关于Android方法数量限制的问题
限制Android方法数量的原因是: Android应用以DEX文件的形式存储字节码文件,在Dalvik字节码规范里,方法引用索引method referenceindex只有16位,即65536个。 Op & Format Mnemonic / Syntax Arguments 6e..72 35c invoke-kind {vC, vD…

asp.net中显示DataGrid控件列序号的几种方法
在aps.net中多数据绑定的控件很多,论功能来说,应该属DataGrid最为齐全,但它没有提供现成的显示记录序号的功能,不过我们可以通过它所带的一些参数来间接得到序号,下面来看看怎样得到和显示序号值计算方式如下ÿ…
一口气看完45个寄存器,CPU核心技术大揭秘
作者 | 轩辕之风O来源 | 编程技术宇宙头图 | CSDN下载自视觉中国自1946年冯诺伊曼领导下诞生的世界上第一台通用电子计算机ENIAC至今,计算机技术已经发展了七十多载。从当初专用于数学计算的庞然大物,到后来大型机服务器时代,从个人微机技术蓬…

用友公司Java面试题(含答案)
为什么80%的码农都做不了架构师?>>> 用友公司Java面试题(含答案) 1.Hashtable和HashMap有什么区别? a.Hashtable是继承自陈旧的Dictionary类的,HashMap继承自AbstractMap类同时是Java 1.2引进的Map接口…

使用memcache做web缓存
为什么80%的码农都做不了架构师?>>> 下载: memcached server [密码: vTI8, 安装启动和调用, 内部有说明] 下载: python-memcached 1.57 现在准备用web.py写个网站, 缓存这块一直没想好用哪个, 今天终于想好了, 直接用memcache # coding: utf-8import me…

Asp.net中DataGrid控件的自定义分页
使用实现起来虽然比较方便,但是效率不高,每次都需要读取所有页(整个记录集),而加载的只是其中一页,造成了资源的浪费,记录多又会使效率变得很低。下面通过DataGrid的自定义分页功能来减少资源使…

实战:在Windows Server2008上配置NLB
1.1 在Windows Server2008上配置NLB 试验环境: DCServer是ESS.COM域的域控制器。 Fileserver和Research属于ESS.COM域,安装有Windows Server 2008企业版。 Sales计算机是ESS.COM域的成员,安装Vista企业版。 试验要求: 实现FileSer…
无人驾驶矿山赛道单笔最大融资:踏歌智行完成2亿元B轮融资
10月30日,矿山无人驾驶运输企业踏歌智行完成了2亿元的B轮融资,本轮融资由前海母基金和宝通投资共同领投,清研资本、蓝焱资本等跟投。踏歌智行继2019年连续完成三轮融资后,再创行业新高。据了解,踏歌智行2019年签订了超…

Python加密—RSA加密
为什么80%的码农都做不了架构师?>>> 公钥加密,私钥解密。 import rsa import base64 from Crypto.PublicKey import RSA # RSA加密解密pubkey -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCcB4zYqi3mjdP3E2f9jyPuF0X…

在asp.net中为Web用户控件添加属性和事件
在90年代初,Microsoft为Web程序员提供的 Active Server Pages(ASP)革命性地改变了Web的编程。它可以利用十分易用的模型在Web服务器上动态生成HTML,并且很容易的实现了对数据库的访问,就当时来说,这是一项多么吸引人的技术&#x…
1024 鲲鹏开发者技术沙龙·福州站圆满收官!给程序员的福利你收到了吗?
10月24日,由华为技术有限公司与福建鲲鹏生态创新中心联合主办的“1024鲲鹏开发者技术沙龙”在福州顺利举行。在沙龙上,来自福建鲲鹏生态创新中心运营总监宋宗佑为活动进行致辞,福建鲲鹏生态创新中心生态总监朱晓彤对鲲鹏生态创业中心进行介绍…

IPsec ××× 配置實例
試驗top:ipsec ***的配置包括一下幾個步驟:1.配置ike的協商2.配置ipsec的協商3.配置端口的應用4ike的調試和排錯按照步驟建立ike 的協商策略和參數R1<config>#crypto isakmp policy 編號<1-10000>編號越低優先級越高#hash { md5 | sha1 } 此命令表明設置密匙認…

springMVC参数绑定与数据回显
简单例子:修改商品信息的jsp页面: 参数绑定过程: 1.2.1 默认支持的参数类型 处理器形参中添加如下类型的参数处理适配器会默认识别并进行赋值。 1.1.1 HttpServletRequest 通过request对象获取请求信息 1.1.2 HttpServletResponse 通…