Python实战之实现获取动态图表

目录
  • 前言
  • 开发工具
  • 环境搭建
  • 百度指数
  • 微博指数
  • 结果展示

前言

利用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 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代码,看看实现的效果

微博指数

百度搜索新浪的微博指数,打开网站一看,发现网页版无法使用

我们只需打开开发者工具,将你的浏览器模拟为手机端,刷新网页即可

可以看到,微指数的界面出来了

添加关键词,查看指数的数据接口

请求是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='大明风华演职人员热度排行')

结果展示

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

以上就是Python实战之实现获取动态图表的详细内容,更多关于Python获取动态图表的资料请关注我们其它相关文章!

(0)

相关推荐

  • python实现数据图表

    平时压力测试,生成一些数据后分析,直接看 log 不是很直观,前段时间看到公司同事分享了一个绘制图表python 模块 : plotly, 觉得很实用,利用周末时间熟悉下. plotly plotly 主页 : https://plot.ly/python/ 安装 在 ubuntu 环境下,安装 plotly 很简单 python 版本2.7+ $ sudo pip install plotly 绘图 在 plotly 网站注册后,可以直接将生成的图片保存到网站上,便于共享保存. 这里使用离线的

  • 使用python绘制常用的图表

    本文介绍如果使用python汇总常用的图表,与Excel的点选操作相比,用python绘制图表显得比较比较繁琐,尤其提现在对原始数据的处理上.但两者在绘制图表过程中的思路大致相同,Excel中能完成的工作python大多也能做到.为了更清晰的说明使用python绘制图表的过程,我们在汇总图表的代码中进行注解,说明每一行代码的具体作用.并在文章的最后给出了自定义字体和图表配色的对应表. 准备工作 import numpy as np import pandas as pd #导入图表库以进行图表绘

  • 基于python plotly交互式图表大全

    plotly可以制作交互式图表,直接上代码: import plotly.offline as py from plotly.graph_objs import Scatter, Layout import plotly.graph_objs as go py.init_notebook_mode(connected=True) import pandas as pd import numpy as np In [412]: #读取数据 df=pd.read_csv('seaborn.csv',

  • 利用 Python 让图表动起来

    目录 用Matplotlib和Seaborn这类Python库可以画出很好看的图,但是这些图只是静态的,难以动态且美观地呈现数值变化.要是在你下次的演示.视频.社交媒体Po文里能用短视频呈现数据变化,是不是很赞呢?更棒的是,你还是可以在你的图表上用Matplotlib.Seaborn或者其他库! 本文将使用美国国家药物滥用研究所和疾病预防控制中心公布的阿片类药物数据,可在此处下载:https://http://www.drugabuse.gov/sites/default/files/overd

  • Python可视化工具如何实现动态图表

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 以下文章来源于菜J学Python ,作者J哥 前言 这次呢,我想讲讲地图可视化的内容,以前我也写过用Python的内置库绘制地图,但总感觉不够美观.如何才能在短时间内制作漂亮的可视化地图呢,我觉得Python+可视化工具是不错的选择. 以下动态可视化地图就是J哥亲手绘制,展现了一段时间内广州市企事业单位在网上商城采购商品的分布及随时间的变化. 接下来,将手把手教你如何绘制这个动态

  • Python实战之实现获取动态图表

    目录 前言 开发工具 环境搭建 百度指数 微博指数 结果展示 前言 利用Python实现获取动态图表,废话不多说~ 让我们愉快地开始吧~ 开发工具 Python版本: 3.6.4 相关模块: re模块: requests模块: urllib模块: pandas模块: 以及一些Python自带的模块. 环境搭建 安装Python并添加到环境变量,pip安装需要的相关模块即可. 看一下B站2019年「数据可视化」版块的情况,第一个视频超2百万的播放量,4万+的弹幕 百度指数 获取百度指数,首先需要登

  • Python实战之异步获取中国天气信息

    目录 前言 目标 请求格式 请求限制 requests非异步获取 异步获取 系统上限 编码 前言 本来是想要更新scrapy的,但是怎么说呢,这玩意不难,看着官方文档,基本上就能做,主要是前面的如果你的爬虫基础不好的话,这个scrapy你也玩不好,而且对于大部分的人来说安装scrapy可能都是个问题,因为有一些历史遗留的问题,毕竟是从python2过来的老框架.当然还有个原因,我要做的东西,用不上scrapy,能够用上scrapy如果只是做爬虫,那必然是分布式爬虫,但是我这里要做的可能只是一个客

  • Python爬虫实现获取动态gif格式搞笑图片的方法示例

    本文实例讲述了Python爬虫实现获取动态gif格式搞笑图片的方法.分享给大家供大家参考,具体如下: 有时候看到一些喜欢的动图,如果一个个取保存挺麻烦,有的网站还不支持右键保存,因此使用python来获取动态图,就看看就很有意思了 本次爬取的网站是  居然搞笑网 http://www.zbjuran.com/dongtai/list_4_1.html 思路: 获取当前页面内容 查找页面中动图所代表的url地址 保存这个地址内容到本地 如果想爬取多页,就可以加上一个循环条件 代码: #!/usr/

  • Python利用D3Blocks绘制可动态交互的图表

    目录 热力图 粒子图 时间序列图 桑基图 小提琴图 散点图 弦图 网络图 今天小编给大家来介绍一款十分好用的可视化模块,D3Blocks,不仅可以用来绘制可动态交互的图表,并且导出的图表可以是HTML格式,方便在浏览器上面呈现. 热力图 热力图是一种通过对色块着色来显示数据的统计图表.绘图时需要指定颜色映射的规则.例如较大的值由较深的颜色表示,而较小的值由较浅的颜色表示等等.热力图适用于查看总体的情况,发现异常值.显示多个变量之间的差异,以及检测它们之间是否存在任何相关性. 我们这里来尝试绘制一

  • python实战之Scrapy框架爬虫爬取微博热搜

    前言:大概一年前写的,前段时间跑了下,发现还能用,就分享出来了供大家学习,代码的很多细节不太记得了,也尽力做了优化. 因为毕竟是微博,反爬技术手段还是很周全的,怎么绕过反爬的话要在这说都可以单独写几篇文章了(包括网页动态加载,ajax动态请求,token密钥等等,特别是二级评论,藏得很深,记得当时想了很久才成功拿到),直接上代码. 主要实现的功能: 0.理所应当的,绕过了各种反爬. 1.爬取全部的热搜主要内容. 2.爬取每条热搜的相关微博. 3.爬取每条相关微博的评论,评论用户的各种详细信息.

  • python实战项目scrapy管道学习爬取在行高手数据

    目录 爬取目标站点分析 编码时间 爬取结果展示 爬取目标站点分析 本次采集的目标站点为:https://www.zaih.com/falcon/mentors,目标数据为在行高手数据. 本次数据保存到 MySQL 数据库中,基于目标数据,设计表结构如下所示. 对比表结构,可以直接将 scrapy 中的 items.py 文件编写完毕. class ZaihangItem(scrapy.Item): # define the fields for your item here like: name

  • Python接口自动化浅析如何处理动态数据

    在上一篇Python接口自动化测试系列文章:Python接口自动化浅析logging封装及实战操作,主要介绍如何提取token.将token作为类属性全局调用及充值接口如何携带token进行请求. 以下主要介绍:接口自动化过程中,动态数据如何生成.动态数据与数据库数据进行对比并替换. 一.应用场景F 注册接口参数需要手机号,手机号如何动态生成? 生成的手机号如何与数据库数据进行对比? 未注册的手机号如何替换用例数据中的手机号? 二.动态手机号处理思路 编写函数,生成随机的手机号: 将生成的手机号

  • Python实战基础之绘制饼状图分析商品库存

    目录 一.实战场景 二.主要知识点 三.菜鸟实战 1.创建 python 文件 2.运行结果 补充:其中pie()函数中的参数: 总结 一.实战场景 实战场景:如何绘制饼状图分析商品库存 二.主要知识点 文件读写 基础语法 字符串处理 文件生成 数据构建 三.菜鸟实战 马上安排! 1.创建 python 文件 """ Author: 菜鸟实战 实战场景: 如何绘制饼状图分析商品库存 """ # 导入系统包 import platform from

  • Python实战之天气预报系统的实现

    目录 前言 一.前期准备 二.代码展示 三.效果展示 前言 鼎鼎大名的南方城市长沙很早就入冬了,街上各种大衣,毛衣,棉衣齐齐出动. 这段时间全国各地大风呜呜地吹,很多地方断崖式降温. 虽然前几天短暂的温度回升,但肯定是为了今天的超级降温,一大早的就开始狂风四起. 周五早晨,终于体验了一把久违冷冷的冰雨在脸上胡乱的拍!昨天还有10几度的天气,今天就  只有2-3°了,真真是老天爷的脸七十二变~ 广东的朋友们,听说你们哪儿最低温度都是10几度,我实名羡慕了——(要我说从哪儿听说的,昨天跟刺激战场打游

随机推荐