Python 可视化近 90 天的百度搜索指数 + 词云图
作者 | 叶庭云
来源 | AI庭云君
一、简介
在实际业务中我们可能会使用爬虫根据关键词获取百度搜索指数历史数据,然后进行对应的数据分析。
百度指数,体验大数据之美。但要获取百度指数相关的数据,困难如下:
不是静态网页,并且百度指数的 URL 请求地址返回的数据,不能直接利用 json 解析提取的数据,而是加密之后的数据和uniqid,需要通过 uniqid 再次请求对应的 URL 以获取用于解密的密钥,然后在前端页面进行解密,然后再渲染到折线图中。
必须要在百度指数页面登录百度账号(获取Cookie)。
需要将前端解密代码转化为 Python 后端代码,或者直接利用 execjs 直接执行 JavaScript 代码也可以。
本文以获取关键词(北京冬奥会、冬奥会开幕式):近 天的百度搜索指数数据为例,讲解利用 爬虫根据关键词获取百度搜索指数历史数据的过程(以冬奥会为例),然后对冬奥会近 90 天的搜索指数可视化,以及采集媒体报道的材料做词云图。
环境:Anaconda + Pycharm
主要用到的库:requests、execjs、datetime、pandas、matplotlib、stylecloud
二、网页分析
没有百度账号的话需要先注册,然后进入百度指数官网:
https://www.baidu.com/s?wd=百度指数

搜索冬奥会,选择近 90 天,即可看到近 90 天冬奥会搜索指数的折线图:
最终要做的就是获取这些搜索指数数据,保存到本地Excel。
首先要获取你登录之后的Cookie(必须要有,否则无法获取到数据),具体的 Cookie 获取如下图:
分析可以找到 json 数据的接口,如下所示:

Request URL 里,word参数后是搜索的关键词(只是汉字被编码了),days=90,代表近 90 天的数据,从当前日期的前一天往前推一个月,可以根据需要修改 days 获取更多的数据或者更少的数据。将 Request URL 贴到浏览器中访问查看(查看 JSON 数据网页,这时有个 JSON Handle 这样的插件会很方便)
https://index.baidu.com/api/SearchApi/index?area=0&word[[%7B%22name%22:%22%E5%86%AC%E5%A5%A5%E4%BC%9A%22,%22wordType%22:1%7D]]&days=90
可以看到以下数据:
经过对 all,pc,wise 对应的数据进行解密,和搜索指数的折线图显示的数据对比,发现 all 部分的数据就是搜索指数的数据。本次请求返回的数据都在这里了,还可以看到uniqid,而且每次刷新加密的数据和 uniqid 都会变。

经过多次分析,发现请求数据的 url 下面的 uniqid 出现在了这个 url 中,如上所示。
因此需要先对请求数据对应的 url 进行数据获取,解析出搜索指数对应的加密数据和uniqid,然后拼接 url 获取密钥,最后调用解密方法解密即可获取到搜索指数的数据。
https://index.baidu.com/Interface/ptbk?uniqid=b92927de43cc02fcae9fbc0cee99e3a9
找到了对应的url,爬虫基本思路还是那样:发送请求、获取响应、解析数据、然后对数据进行解密、保存数据。
三、数据获取
Python代码:
# -*- coding: UTF-8 -*-
"""
@Author :叶庭云
@公众号 :AI庭云君
@CSDN :https://yetingyun.blog.csdn.net/
"""
import execjs
import requests
import datetime
import pandas as pd
from colorama import Fore, initinit()# 搜索指数数据解密的Python代码
def decryption(keys, data):dec_dict = {}for j in range(len(keys) // 2):dec_dict[keys[j]] = keys[len(keys) // 2 + j]dec_data = ''for k in range(len(data)):dec_data += dec_dict[data[k]]return dec_dataif __name__ == "__main__":# 北京冬奥会 冬奥会开幕式keyword = '北京冬奥会' # 百度搜索收录的关键词period = 90 # 时间 近90天start_str = 'https://index.baidu.com/api/SearchApi/index?area=0&word=[[%7B%22name%22:%22'end_str = '%22,%22wordType%22:1%7D]]&days={}'.format(period)dataUrl = start_str + keyword + end_strkeyUrl = 'https://index.baidu.com/Interface/ptbk?uniqid='# 请求头header = {'Accept': 'application/json, text/plain, */*','Accept-Encoding': 'gzip, deflate, br','Accept-Language': 'zh-CN,zh;q=0.9','Connection': 'keep-alive','Cookie': '注意:换成你的Cookie','Host': 'index.baidu.com','Referer': 'https://index.baidu.com/v2/main/index.html','sec-ch-ua': '" Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"','sec-ch-ua-mobile': '?0','Sec-Fetch-Dest': 'empty','Sec-Fetch-Mode': 'cors','Sec-Fetch-Site': 'same-origin','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36'}# 设置请求超时时间为16秒resData = requests.get(dataUrl,timeout=16, headers=header)uniqid = resData.json()['data']['uniqid']print(Fore.RED + "uniqid:{}".format(uniqid))keyData = requests.get(keyUrl + uniqid,timeout=16, headers=header)keyData.raise_for_status()keyData.encoding = resData.apparent_encoding# 解析json数据startDate = resData.json()['data']['userIndexes'][0]['all']['startDate']print(Fore.RED + "startDate:{}".format(startDate))endDate = resData.json()['data']['userIndexes'][0]['all']['endDate']print(Fore.RED + "endDate:{}".format(endDate))source = (resData.json()['data']['userIndexes'][0]['all']['data']) # 原加密数据print(Fore.RED + "原加密数据:{}".format(source))key = keyData.json()['data'] # 密钥print(Fore.RED + "密钥:{}".format(key))res = decryption(key, source)# print(type(res))resArr = res.split(",")# 生成datetimedateStart = datetime.datetime.strptime(startDate, '%Y-%m-%d')dateEnd = datetime.datetime.strptime(endDate, '%Y-%m-%d')dataLs = []# 起始日期到结束日期每一天while dateStart <= dateEnd:dataLs.append(str(dateStart))dateStart += datetime.timedelta(days=1)# print(dateStart.strftime('%Y-%m-%d'))ls = []# 组织数据和遍历打印查看for i in range(len(dataLs)):ls.append([keyword, dataLs[i], resArr[i]])for i in range(len(ls)):print(Fore.RED + str(ls[i]))# 保存数据到Excel 设置列名df = pd.DataFrame(ls)df.columns = ["关键词", "日期", "百度搜索指数"]df.to_excel("北京冬奥会搜索指数数据 90天.xlsx", index=False)
结果如下:

解密部分也可以直接利用 execjs 执行 JavaScript 代码实现,如下所示:
# Python的强大之处就在于,拥有很强大的第三方库,可以直接执行js代码,即对解密算法不熟悉,你无法写Python代码时,直接执行js代码即可
js = execjs.compile('''function decryption(t, e){for(var a=t.split(""),i=e.split(""),n={},s=[],o=0;o<a.length/2;o++)n[a[o]]=a[a.length/2+o]for(var r=0;r<e.length;r++)s.push(n[i[r]])return s.join("")}''')
res = js.call('decryption', key, source) # 调用此方式解密
res = decryption(key, source)
Python爬虫成功运行,数据保存为冬奥会搜索指数数据 90 天.xlsx。
四、搜索指数可视化
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
import math
import warningswarnings.filterwarnings("ignore")
df1 = pd.read_excel("冬奥会开幕式搜索指数数据 90天.xlsx")
df2 = pd.read_excel("北京冬奥会搜索指数数据 90天.xlsx")mpl.rcParams['font.family'] = 'SimHei'# 生成x轴数据 列表推导式
# x_data = [i for i in range(1, len(df1) + 1)]
x_data = [i for i in range(1, len(df1) - 1)]
y_data1 = df1["百度搜索指数"][:-2]
y_data2 = df2["百度搜索指数"][:-2]# 设置figure大小 像素
fig, ax = plt.subplots(figsize=(6, 4), dpi=500)# 绘制三条折线 点的形状 颜色 标签:用于图例显示
plt.plot(x_data, y_data1, color="#FF1493", label="冬奥会开幕式")
plt.plot(x_data, y_data2,color="#00BFFF", label="北京冬奥会")# x y 轴标签 字体大小
plt.xlabel("时间顺序", fontdict={"size": 15, "weight": "bold", "color": "black"})
plt.ylabel("百度搜索指数",fontdict={"size": 15, "weight": "bold", "color": "black"})# 设置坐标轴刻度标签的大小
plt.tick_params(axis='x', direction='out',labelsize=12, length=4.6)
plt.tick_params(axis='y', direction='out',labelsize=12, length=4.6)# 显示图例
plt.legend(fontsize=15, frameon=False)
labels = ax.get_xticklabels() + ax.get_yticklabels()
[label.set_fontname('Times New Roman') for label in labels]
[label.set_color('black') for label in labels]
plt.grid(alpha=0.7, ls=":")# 展示show
plt.show()
结果如下:

冬奥会开幕式、北京冬奥会搜索指数近几天近似直线飙升。说明大家都非常关注啊。



五、词云图
这里采集一些文本材料,再做个词云图看看。
with open("冬奥会开幕式.txt", encoding="utf-8") as f:data = f.read()# 文本预处理 去除一些无用的字符 只提取出中文出来
new_data = re.findall('[\u4e00-\u9fa5]+', data, re.S)
new_data = "/".join(new_data)# 文本分词 精确模式
seg_list_exact = jieba.cut(new_data, cut_all=False)# 加载停用词
with open('stop_words.txt', encoding='utf-8') as f:# 获取每一行的停用词 添加进集合con = f.read().split('\n')stop_words = set()for i in con:stop_words.add(i)# 列表解析式 去除停用词和单个词
result_list = [word for word in seg_list_exact if word not in stop_words and len(word) > 1]
print(result_list)# https://fontawesome.com/license/free
# 个人推荐使用的palette配色方案 效果挺好看 其他测试过 感觉一般~~
# colorbrewer.qualitative.Dark2_7
# cartocolors.qualitative.Bold_5
# colorbrewer.qualitative.Set1_8
gen_stylecloud(text=' '.join(result_list), # 文本数据size=600, # 词云图大小font_path='./font/猫啃网糖圆体.ttf', # 中文词云 显示需要设置字体icon_name = "fas fa-grin-beam", # 图标output_name='冬奥会开幕式.png', # 输出词云图名称palette='colorbrewer.qualitative.Set1_8', # 选取配色方案
)
如果说 年的奥运会,中国向世界展现的是传统的文化之美!那么这一次冬奥会,中国完美地向世界展现了什么叫科技的日新月异与腾飞!

六、总结
今年冬奥会开幕式真的太好看啦,惊艳全球!
总结:
Python爬虫:根据关键词获取百度搜索指数历史数据
解析 JSON 数据,加密数据的解密,数据保存到Excel
matplotlib:百度搜索指数的可视化
stylecloud:绘制词云图
往
期
回
顾
资讯
谷歌使出禁用2G大招
技术
干货满满的python实战项目!
25个Python文本处理案例
技术
11款可替代top命令的工具!
分享
点收藏
点点赞
点在看
相关文章:

php常用比较函数区别表
php常用比较函数区别表 表达式 empty() is_null() isset() if($x) $x "" TRUE FALSE TRUE FALSE $x null TRUE TRUE FALSE FALSE $x is undefined TRUE TRUE FALSE FALSE(报E_NOTICE错) $x array() TRUE FALSE TRUE FALSE $x false TRUE FALSE TRUE FALSE $x 0 …

实战分享:淘宝Web 3D应用与游戏开发
大家下午好!我们今天讲个比较有意思的话题,这个话题在业界被谈及得比较少。大家在座有做过移动端开发的同学吗?请举个手,人还挺多的。那做过3D应用的同学请举个手,有用过Threejs的请举个手,做过游戏的呢..人…

常见NoSQL系统使用场景分析
•Cassandra •特性:分布式与复制的权衡\根据列和键范围进行查询\BigTable类似的功能:列,列族\写比读快很多 •最佳适用:写操作较多,读比较少的时候。如果你的系统都是基于Java的时候。 •应用场景:银行&am…

再一次输给了AI,弯道急速超车、登上 Nature 封面
作者 | 学术头条来源 | 学术头条人工智能(AI)的很多潜在应用,涉及与人类交互时做出更优化的实时决策,而竞技或者博弈类游戏,便是最佳的展示舞台。近日,发表在《自然》杂志上的封面文章报告称,AI…

maven 多环境打包
2019独角兽企业重金招聘Python工程师标准>>> 1.在项目的pom中添加 <build><resources><!-- Resource Filter --><resource><directory>src/main/resources</directory><filtering>true</filtering></resource&g…

Sass函数:Sass Maps的函数-map-has-key($map,$key)
map-has-key($map,$key) 函数将返回一个布尔值。当 $map 中有这个 $key,则函数返回 true,否则返回 false。 前面的示例,当 $key 不在 $map 中时,使用 map-get($map,$key) 函数将返回一个 null 值。但对于开发人员,并看…
Memcache内存分配策略
转自:http://tank.blogs.tkiicpp.com/2010/12/14/memcache%e5%86%85%e5%ad%98%e5%88%86%e9%85%8d%e7%ad%96%e7%95%a5/ 一、Memcache内存分配机制关于这个机制网上有很多解释的,我个人的总结如下。 Page为内存分配的最小单位。 Memcached的内存分配以page…

论排列组合,持续更新
今天刚好碰到了一个排列组合问题,因为之前对这方面的学习比较少,所以用的非常蠢的方法做了四位数中取三位的排列,写的程序太有局限性,源码如下#define _CRT_SECURE_NO_WORNINGS 1#include<stdio.h>#include<stdlib.h>…

Python 中少为人知的 10 个安全陷阱
作者:Dennis Brinkrolf译者:豌豆花下猫Python猫原题:10 Unknown Security Pitfalls for Python英文:https://blog.sonarsource.com/10-unknown-security-pitfalls-for-pythonPython 开发者们在使用标准库和通用框架时,…
JS+CSS3 360度全景图插件 - Watch3D.js
日常闲扯 从上一篇文章到这篇中间快过了一年了,时间真滴过得快。不是在下中间没想过写新的文章,而是自己确实变懒了(体重1 1 1 1....) 。。OTL。。。不过到最后觉得还是需要写点东西,不然人就真废了,于是便有了这样一个插件&#…

CQRS学习——最小单元的Cqrs(CommandEvent)[其一]
【说明:博主采用边写边思考的方式完成这一系列的博客,所以代码以附件为准,文中代码仅为了说明。】 结构 在学习和实现CQRS的过程中,首要参考的项目是这个【http://www.cnblogs.com/yangecnu/p/Introduction-CQRS.html】。所以Dpfb…

PHP APC安装与使用
最简单的方法,找到php安装目录的pecl 自动安装: # /usr/local/php/bin/pecl install apc 下面按提示一步步完成即可 配置/etc/php.ini 末尾加入extensionapc.so 手动安装: 官网 http://cn2.php.net/manual/zh/book.apc.php 下载http://p…

AIphaCode 并不能取代程序员,而是开发者的工具
编译 | 禾木木 出品 | AI科技大本营(ID:rgznai100) DeepMind 是 AI 研究实验室,它引入了一种深度学习模型,可以生成具有显著效果的软件源代码。该模型名为 AIphaCode,是基于 Transformers,OpenAI 在其代码生…

源码阅读:SDWebImage(六)——SDWebImageCoderHelper
该文章阅读的SDWebImage的版本为4.3.3。 这个类提供了四个方法,这四个方法可分为两类,一类是动图处理,一类是图像方向处理。 1.私有函数 先来看一下这个类里的两个函数 /**这个函数是计算两个整数a和b的最大公约数*/ static NSUInteger gcd(N…

基于 OpenCV 的网络实时视频流传输
作者 | 努比来源 | 小白学视觉大多数人会选择使用IP摄像机(Internet协议摄像机)而不是CCTV(闭路电视),因为它们具有更高的分辨率并降低了布线成本。在本文中,我们将重点介绍IP摄像机。IP摄像机是一种数字 摄…

【转】让Chrome化身成为摸鱼神器,利用Chorme运行布卡漫画以及其他安卓APK应用教程...
下周就是十一了,无论是学生党还是工作党,大家的大概都会有点心不在焉,为了让大家更好的心不在焉,更好的在十一前最后一周愉快的摸鱼,今天就写一个如何让Chrome(google浏览器)运行安卓APK应用的教…

PHP安装parsekit扩展查看opcode
也可以通过VLD查看,具体请看本人写的http://blog.csdn.net/21aspnet/article/details/7002644安装parsekit扩展 http://pecl.php.net/package/parsekit 下载最新的 #wget http://pecl.php.net/get/parsekit-1.3.0.tgz 安装过程省略 可以参考 本人写的http://blog.c…

group by 查找订单的最新状态 join
Order:snProcedures:sn,status1、 有订单表和流程表。订单表含有订单的详细信息【假设没有订单状态哈】,每个订单有好多种状态:已付款、处理中、待收货等等。现在的需求可能是查询订单状态是待收货的所有订单的信息。【答】先找到…

Xcache安装与使用
官网:http://xcache.lighttpd.net 最新版本下载地址:http://xcache.lighttpd.net/wiki/Release-1.3.2 安装: # wget http://xcache.lighttpd.net/pub/Releases/1.3.2/xcache-1.3.2.tar.gz # tar zvxf xcache-1.3.2.tar.gz # cd xcache-1.3…

安装mysql_python的适合遇到mysql_config not found解决方案(mac)
为什么80%的码农都做不了架构师?>>> 安装mysql_python的适合遇到mysql_config not found解决方案(mac) 用pip安装MySQL-python时候遇到报错: ------我是分割线------ Complete output from command python setup.py e…

推荐 6 个好用到爆的 Pycharm 插件
作者 | 小欣来源 | Python爱好者集中营相信对于不少的Python程序员们都是用Pycharm作为开发时候的IDE来使用的,今天小编来分享几个好用到爆的Pycharm插件,在安装上之后,你的编程效率、工作效率都能够得到极大地提升。安装方法插件的安装方法一…
Kibana 用户指南(使用Flight仪表盘探索Kibana)
使用Flight仪表盘探索Kibana 你是Kibana的新手并希望尝试一下,只需单击一下,你就可以安装Flights样本数据并开始与Kibana交互。 Flight数据集包含四家航空公司的数据,你可以从Kibana主页加载数据和预配置的仪表盘。 在主页上,单击…

php扩展xdebug安装以及用kcachegrind系统分析
一:安装 安装方法一:编译安装1、下载PHP的XDebug扩展,网址:http://xdebug.org/# wget http://pecl.php.net/get/xdebug-2.1.2.tgz# tar -xzf xdebug-2.1.2.tgz# xdebug-2.1.2# cd xdebug-2.1.2# /usr/local/php/bin/phpize# ./con…

Meta AI 新研究,统一模态的自监督新里程碑
作者 | 青苹果来源 | 数据实战派虽然 AI 领域不断涌现出新的突破和进展,却始终难以逃离单一领域的束缚——一种用于个性化语音合成的新颖方法,却并不能用于识别人脸的表情。为了解决这个问题,不少研究人员正在致力于开发功能更强大、应用更广…

细说Debug和Release区别
VC下Debug和Release区别 最近写代码过程中,发现 Debug 下运行正常,Release 下就会出现问题,百思不得其解,而Release 下又无法进行调试,于是只能采用printf方式逐步定位到问题所在处,才发现原来是给定的一个…

26期20180601目录管理
6月1日任务2.1/2.2 系统目录结构2.3 ls命令2.4 文件类型2.5 alias命令系统目录结构ls - list所有的用户在系统里都有自己的家目录,比如现在登陆的是root用户,登陆进去就是在root的家目录中,可以看到之前创建的公钥文件也是在这。但是如果是其…

thttpd安装与调试
http://www.acme.com/software/thttpd/ thttpd是一个非常小巧的轻量级web server,它非常非常简单,仅仅提供了HTTP/1.1和简单的CGI支持,在其官方网站上有一个与其他web server(如Apache, Zeus等)的对比图Benchmark&…

7 款可替代 top 命令的工具!(二)
作者 | JackTian来源 | 杰哥的IT之旅上一篇文章中给大家介绍了《11 款可替代 top 命令的工具!》,今天我再来给大家推荐 7 款可替代 top 命令的工具,看完这两篇替代品的文章相信能让你对 Linux 操作系统下一个小小的命令大开眼界。一、atopato…

Error:Execution failed for task ':app:dexDebug'. com.android.ide.common.process.ProcessException
异常Log: Error:Execution failed for task ‘:app:dexDebug’. > com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process ‘command ‘/Library/……/java” finished with non-zero exit value 2 错误原因&am…

# 学号 2017-2018-20172309 《程序设计与数据结构》第十一周学习总结
---恢复内容开始--- 学号 2017-2018-20172309 《程序设计与数据结构》第十一周学习总结 教材学习内容总结 第23章 初识Android操作系统:一个多用户的Linux系统,一个运用程序运行时与其他的运用运行是独立的。发展:在Android4.4之前所有的应用…