前言

利用Python实现获取动态图表,废话不多说~

让我们愉快地开始吧~

开发工具

Python版本: 3.6.4

相关模块:

re模块;

requests模块;

urllib模块;

pandas模块;

以及一些Python自带的模块。

环境搭建

安装Python并添加到环境变量,pip安装需要的相关模块即可。

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

+

百度指数

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

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

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

然而一看请求得到的结果,发现并没有数据,原因是这里使用了JS加密

找到解决方法,成功实现爬取,代码实现

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='大明风华演职人员热度排行')
复制代码

结果展示

有喜欢可以尝试动手试试哦~

Python实战案例,requests模块,Python实现获取动态图表相关推荐

  1. Python实战案例:金庸的功夫流派、人物关系的分析案例(上)

    Python实战案例:金庸的功夫流派.人物关系的分析案例(上) 一.项目说明 在香港的探案剧中, 经常见到这样的场景,为了分析某一桩谋杀案或者是失踪案,会把案件的可疑人员和与被害者的关系人员全部找出来 ...

  2. Python接口自动化-requests模块之post请求

    ------·今天距2021年262天·------ 这是ITester软件测试小栈第111次推文 在上一篇Python接口自动化测试系列文章:Python接口自动化-requests模块之get请求 ...

  3. Python实战案例:旅游方面博文的数据分析

    Python实战案例:旅游方面博文的数据分析 一.旅游方面博文数据展示 数据分析的出现便利了每个人,企业,竞争者.在以前的时候,如果想要了解市场的动向,就设计了调查问卷或者现场采访的方式,以至于被很多 ...

  4. python中的requests模块的使用大全

    1.requests模块: 企业中用的最多的就是requests requests的底层实现就是urllib requests在python2 和python3中通用,方法完全一样 requests简 ...

  5. Python实战案例:使用Pygame开发游戏翻牌子(上)

    Python实战案例:使用Pygame开发游戏翻牌子(上) 一.翻牌子游戏介绍 翻牌子的原意是古代皇帝在晚上就寝时从三千佳丽中选择的某个女子,这里将它改版成对对碰.如果翻开第一张牌子后面的女子,再翻开 ...

  6. requests模块--python发送http请求

    requests模块--python发送http请求 方法一. ? 1

  7. Python中通过requests模块发送POST请求.

    博客核心内容: 1.Python中通过requests模块发送POST请求. 我们通常情况下提交数据一般有两种方式:Ajax和Form表单的方式 如果request.post里面没有值,我们就到req ...

  8. python实战(一)Python爬取猫眼评分排行前100电影及简单数据分析可视化python实战(一)Python爬取猫眼排行前一百电影及简单数据分析可视化

    python实战(一)Python爬取猫眼排行前一百电影及简单数据分析可视化 一.抓取数据 需要的库 request库 响应http请求 json库 将文本保存成json形式 pyquery 类似JQ ...

  9. python实战(一)Python爬取猫眼评分排行前100电影及简单数据分析可视化

    python实战(一)Python爬取猫眼排行前一百电影及简单数据分析可视化 一.抓取数据 需要的库 request库 响应http请求 json库 将文本保存成json形式 pyquery 类似JQ ...

最新文章

  1. 生成动态验证码的jsp
  2. js中两个等号和三个等号区别?
  3. python极客项目编程_Python极客项目编程 ([美]Mahesh Venkitachalam) 中文pdf完整版
  4. HTTP 返回状态消息讲解
  5. 数据处理程序的一点经验
  6. 使用 HTML5 File API 实现client log
  7. linux 查看文件工具,lsof---Linux查看文件信息的强大工具
  8. 从安装认识Angular 2
  9. hdu 1232 畅通工程(并查集)
  10. siri中文语音助理_2020年人工智能和语音控制的7项新发展
  11. Linux中访问tomcat方式,linux软连接_Linux中为Tomcat启用软链接的三种方式
  12. mysql 查询每个班级的前三名
  13. 1. 神禹(shenyu)网关启动踩坑
  14. 程序分析技术栈-测试/辅助证明/模型检验/保守静态分析/bug-finding
  15. python requests 由于目标计算机积极拒绝,无法连接
  16. 网页底部小鱼游动特效
  17. Android P 图形显示系统(八) SurfaceFlinger合成流程(三)
  18. navicat如何连接mysql?navicat 连接mysql Navicat使用教程
  19. 【使用python获取pdf所需数据】
  20. Blender齿轮制作

热门文章

  1. R语言使用ggpubr包的ggline函数绘制各种漂亮形式的线图实战
  2. python使用fpdf生成pdf文件:配置多种语言字体写入多种文字
  3. R可视化绘制泊松分布(Poisson Distribution)
  4. Windows下查看已经安装的GPU的情况
  5. 隐马尔可夫模型(Hidden Markov Model,HMM)是什么?隐马尔可夫模型(Hidden Markov Model,HMM)的三个基本问题又是什么?
  6. java性能保障技术_狙击P7!阿里大佬亲授“Java性能调优技术宝典”,太完整了!...
  7. Java学习笔记(必看经典)
  8. linux写文本命令,一天一个shell命令 linux文本操作系列-chmod命令用法
  9. 手机 html5评测,三款主流手机浏览器HTML5性能横向评测
  10. python 删除 csv 文件的行