iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python实战之实现获取动态图表
  • 668
分享到

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

2024-04-02 19:04:59 668人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录前言开发工具环境搭建百度指数微博指数结果展示前言 利用python实现获取动态图表,废话不多说~ 让我们愉快地开始吧~ 开发工具 Python版本: 3.6.4 相关模块: re

前言

利用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获取动态图表的资料请关注编程网其它相关文章!

--结束END--

本文标题: Python实战之实现获取动态图表

本文链接: https://www.lsjlt.com/news/160011.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python实战之实现获取动态图表
    目录前言开发工具环境搭建百度指数微博指数结果展示前言 利用Python实现获取动态图表,废话不多说~ 让我们愉快地开始吧~ 开发工具 Python版本: 3.6.4 相关模块: re...
    99+
    2022-11-12
  • Python如何实现获取动态图表
    本篇内容介绍了“Python如何实现获取动态图表”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!开发工具Python版本: 3.6.4相关模块...
    99+
    2023-06-22
  • Python实战之ATM取款机的实现
    目录一、项目视图分析二、文件结构分析三、完整代码1.start.py2.conf3.core4.interface5.db6.lib7.readme一、项目视图分析 通过上图,我们...
    99+
    2022-11-11
  • Python实战之异步获取中国天气信息
    目录前言目标请求格式请求限制requests非异步获取异步获取系统上限编码前言 本来是想要更新scrapy的,但是怎么说呢,这玩意不难,看着官方文档,基本上就能做,主要是前面的如果你...
    99+
    2022-11-13
  • python爬虫实战项目之爬取pixiv图片
    自从接触python以后就想着爬pixiv,之前因为梯子有点问题就一直搁置,最近换了个梯子就迫不及待试了下。 爬虫无非request获取html页面然后用正则表达式或者beautif...
    99+
    2022-11-11
  • Python实战之实现截图识别文字
    目录前言一、获取百度智能云token二、百度借口调用三、搭建窗口化的程序以便于使用四、实现截图的自动保存五、将识别到的文字输出显示在窗口文本框中并将文字发送到剪切板六、提取识别后文字...
    99+
    2022-11-12
  • Python实现微博动态图片爬取详解
    由于微博的网页端有反爬虫,需要登录,所以我们换个思路,曲线救国。 我们找到微博在浏览器上面用于手机端的调试的APL,如何找到呢? 我这边直接附上微博的手机端的地址:https://...
    99+
    2022-11-13
  • Python怎么实现微博动态图片爬取
    本篇内容主要讲解“Python怎么实现微博动态图片爬取”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python怎么实现微博动态图片爬取”吧!我们找到微博在浏览器上面用于手机端的调试的APL,如...
    99+
    2023-06-29
  • uniapp小程序实战之利用腾讯地图获取定位
    目录前言1、首先看官网2、腾讯位置服务平台申请密钥和下载SDK2.1 申请开发者秘钥2.2 开通webserviceAPI服务2.3 下载微信小程序JavaScriptSDK2.4 ...
    99+
    2023-02-08
    uniapp获取地理位置 uniapp使用腾讯地图 uniapp获取当前位置
  • Python人工智能实战之以图搜图的实现
    目录前言一、实验要求二、环境配置三、代码文件1、vgg.py2、index.py3、test.py四、演示1、项目文件夹2、相似度排序输出3、保存结果五、尾声前言 基于vgg网络和K...
    99+
    2022-11-13
  • python爬虫入门实战之爬取网页图片
    本篇文章给大家带来了关于Python的相关知识,其中主要整理了爬取网页图片的相关问题,要想高效的获取数据,爬虫是非常好用的,而用python做爬虫也十分简单方便,下面通过一个简单的小爬虫程序来看一看写爬虫的基本过程,下面一起来看一下,希望对...
    99+
    2022-07-11
    python
  • Python实战之看图猜字游戏的实现
    目录导语一、爬取成语图片二、看图猜成语导语 看图猜成语,是考验一个人的反应能力,也考验一个人的右脑思维。 据说越聪明的人,这道题的完成率越高。你想试一试嘛?今天就给你这次机会啦! 哈...
    99+
    2023-02-16
    Python实现看图猜字游戏 Python看图猜字游戏 Python看图猜字 Python游戏
  • Python人工智能实战之以图搜图怎么实现
    本篇内容介绍了“Python人工智能实战之以图搜图怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、实验要求给出一张图像后,在整个数...
    99+
    2023-06-30
  • Python爬虫实战之使用Scrapy爬取豆瓣图片
    使用Scrapy爬取豆瓣某影星的所有个人图片 以莫妮卡·贝鲁奇为例 首先我们在命令行进入到我们要创建的目录,输入 scrapy startproject banciyuan 创建scrapy项目 创建的项目结构如下...
    99+
    2022-06-02
    Scrapy爬取图片 Python Scrapy
  • Python数据获取实现图片数据提取
    目录一、利用exifread提取图片的EXIF信息二、循环遍历图片信息比如我随便从手机上传一张图片到我的电脑里,通过python可以获取这张照片的所有信息。如果是数码相机拍摄的照片,...
    99+
    2022-11-12
  • selenium动态数据获取的方法实现
    目录...
    99+
    2022-11-11
  • Python实战之实现百度智能图片识别
    这是我们最终的效果,那么我们一起来看一看如何实现吧!超简单易上手哦! 首先我们需要先配置pyqt5的资源,这里就不说关于安装包的问题了(pip或者pycharm可以直接添加解决的问...
    99+
    2022-11-13
  • Python实战之自动发送邮件的实现
    目录1.开启SMTP服务2.准备3.编写脚本4.小例子自动发送邮件能应用于许多场景,比如我想要知道股票策略中的股票池是否有实时的更新,这时候如果再拉一遍数据,跑一遍脚本,实在是太浪费...
    99+
    2022-11-13
  • ASP.NET Core实现动态获取文件并下载
    ASP.NET Core 中,可以在静态目录添加文件,直接访问就可以下载。但是这种方法可能不安全,也不够灵活。 我们可以在 Controller 控制器中 添加 一个 Action,...
    99+
    2022-11-12
  • echarts动态获取Django数据的实现示例
    目录一、后端二、前端三、页面效果四、总结在开发过程中我们需要将我们的数据通过图标的形式展现出来,接下来我为大家介绍一个有趣的框架:Echarts。这是一个使用JavaScript实现...
    99+
    2022-11-11
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作