前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何用Python下载百度指数的数据

如何用Python下载百度指数的数据

作者头像
Python进阶者
发布于 2021-12-01 13:48:07
发布于 2021-12-01 13:48:07
94500
代码可运行
举报
运行总次数:0
代码可运行

百度指数(Baidu Index) 是以百度海量网民行为数据为基础的数据分析平台,它能够能够告诉用户:某个关键词在百度的搜索规模有多大,一段时间内的涨跌态势以及相关的新闻舆论变化,关注这些词的网民是什么样的,分布在哪里,同时还搜了哪些相关的词。

百分十先生分享过如何使用uiautomation采集百度指数:百度指数 如何批量获取?

不过个人感觉这方法好像有点杀鸡用牛刀,对于网页使用selenium完全足以,当然对于专门针对selenium进行反爬检测的网页就需要特殊修改。

本文不演示如何使用UI自动化工具采集百度指数,为了采集更简单将直接读取并解析接口。

关于uiautomation,PC端的UI自动化可以查看教程:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://blog.csdn.net/as604049322/article/details/121391639

打开百度指数发现查看指数必须要先登录,比如我们对比一个python和Java最近一周的指数:

当鼠标移动到每天的坐标上时会显示当天的数据,例如:

如果我们采用UI自动化的方式,至少得模拟移动到每天的坐标。

打开开发者工具,重新查询发现获取数据的接口:

实际的指数数据就存储在这个data字段中,但是以某种加密方式加密了。

然后注意第二个接口的某个参数与当前接口返回的数据某个值一致。

此时我全局搜索decrypt,找到了加密函数:

此时打上断点重新搜索,可以看到传入该函数的t参数与ptbk接口返回的值一致:

说明我们只需要将这段js翻译为python来解密加密数据即可。

下面我们总结一下指数数据获取的思路:

  1. 通过index接口获取uniqid和加密后的指数数据userIndexes
  2. 通过ptbk接口传入uniqid获取密钥key
  3. 通过解密函数根据密钥key解密userIndexes

下面我们分别用代码来实现,首先获取指数数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import requests
import json

headers = {
    "Connection": "keep-alive",
    "Accept": "application/json, text/plain, */*",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36",
    "Sec-Fetch-Site": "same-origin",
    "Sec-Fetch-Mode": "cors",
    "Sec-Fetch-Dest": "empty",
    "Referer": "https://index.baidu.com/v2/main/index.html",
    "Accept-Language": "zh-CN,zh;q=0.9",
    'Cookie': cookie,
}

words = '[[{"name":"python","wordType":1}],[{"name":"java","wordType":1}]]'
start = '2021-11-15'
end = '2021-11-21'
url = f'http://index.baidu.com/api/SearchApi/index?area=0&word={words}&area=0&startDate={start}&endDate={end}'
res = requests.get(url, headers=headers)
data = res.json()['data']
data

cookie需要在登录后复制粘贴获取,就是请求中的这段字符串(直接复制粘贴即可):

结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{'userIndexes': [{'word': [{'name': 'python', 'wordType': 1}],
   'all': {'startDate': '2021-11-15',
    'endDate': '2021-11-21',
    'data': 'WQ3Q-nWQ.yGnWQ.y3nW3yQsnWW.Q-nysXV3ny.-VG'},
   'pc': {'startDate': '2021-11-15',
    'endDate': '2021-11-21',
    'data': 'y3yVXny3yWyny3GWWny3QyVnyQG33nXGsQn-..G'},
   'wise': {'startDate': '2021-11-15',
    'endDate': '2021-11-21',
    'data': 'XWVXnXQ-XnX3XWnX-WynX3X3n--XynsQyG'},
   'type': 'day'},
  {'word': [{'name': 'java', 'wordType': 1}],
   'all': {'startDate': '2021-11-15',
    'endDate': '2021-11-21',
    'data': '-XW.n-ssXnXG3GnXG..nXyyGnVQyWn.QQQ'},
   'pc': {'startDate': '2021-11-15',
    'endDate': '2021-11-21',
    'data': '.VVVn.3Xsn.XX3n.-VWn.sW3nQG-snWVWQ'},
   'wise': {'startDate': '2021-11-15',
    'endDate': '2021-11-21',
    'data': 'QW.XnQW-WnQG3VnQyXQnQQ-VnQWW.nWsyG'},
   'type': 'day'}],
 'generalRatio': [{'word': [{'name': 'python', 'wordType': 1}],
   'all': {'avg': 21565, 'yoy': -24, 'qoq': 7},
   'pc': {'avg': 12470, 'yoy': -32, 'qoq': 3},
   'wise': {'avg': 9095, 'yoy': -10, 'qoq': 12}},
  {'word': [{'name': 'java', 'wordType': 1}],
   'all': {'avg': 8079, 'yoy': -23, 'qoq': 11},
   'pc': {'avg': 4921, 'yoy': -33, 'qoq': 6},
   'wise': {'avg': 3157, 'yoy': '-', 'qoq': 18}}],
 'uniqid': '5f0a123915325e28d9f055409955c9ad'}

这些数据中,wise表示移动端,all表示pc端+移动端。userIndexes是指数详情数据,generalRatio是概览数据。

下面我们只关心各个关键字的整体表现。

下面我们获取uniqid并获取ptbk:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
uniqid = data['uniqid']
res = requests.get(
    f'http://index.baidu.com/Interface/ptbk?uniqid={uniqid}', headers=headers)
ptbk = res.json()['data']
ptbk
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
'LV.7yF-s30WXGQn.65+1-874%2903,'

下面我将下面这段Js代码翻译为python:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
decrypt: function(t, e) {
  if (t) {
    for (var n = t.split(""), i = e.split(""), a = {}, r = [], o = 0; o < n.length / 2; o++)
      a[n[o]] = n[n.length / 2 + o];
    for (var s = 0; s < e.length; s++)
      r.push(a[i[s]]);
    return r.join("")
  }
}

python代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def decrypt(ptbk, index_data):
    n = len(ptbk)//2
    a = dict(zip(ptbk[:n], ptbk[n:]))
    return "".join([a[s] for s in index_data])

然后我们遍历每个关键字解密出对应的指数数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for userIndexe in data['userIndexes']:
    name = userIndexe['word'][0]['name']
    index_data = userIndexe['all']['data']
    r = decrypt(ptbk, index_data)
    print(name, r)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
python 23438,23510,23514,24137,22538,17964,15860
java 8925,8779,9040,9055,9110,6312,5333

检查实际网页中的数据发现确实一致:

那么我们就可以轻松获取任意指定关键字的指数数据。下面我将其整体封装一下,完整代码为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import requests
import json
from datetime import date, timedelta

headers = {
    "Connection": "keep-alive",
    "Accept": "application/json, text/plain, */*",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36",
    "Sec-Fetch-Site": "same-origin",
    "Sec-Fetch-Mode": "cors",
    "Sec-Fetch-Dest": "empty",
    "Referer": "https://index.baidu.com/v2/main/index.html",
    "Accept-Language": "zh-CN,zh;q=0.9",
    'Cookie': cookie,
}


def decrypt(ptbk, index_data):
    n = len(ptbk)//2
    a = dict(zip(ptbk[:n], ptbk[n:]))
    return "".join([a[s] for s in index_data])


def get_index_data(keys, start=None, end=None):
    words = [[{"name": key, "wordType": 1}] for key in keys]
    words = str(words).replace(" ", "").replace("'", "\"")
    today = date.today()
    if start is None:
        start = str(today-timedelta(days=8))
    if end is None:
        end = str(today-timedelta(days=2))

    url = f'http://index.baidu.com/api/SearchApi/index?area=0&word={words}&area=0&startDate={start}&endDate={end}'
    print(words, start, end)
    res = requests.get(url, headers=headers)
    data = res.json()['data']
    uniqid = data['uniqid']
    url = f'http://index.baidu.com/Interface/ptbk?uniqid={uniqid}'
    res = requests.get(url, headers=headers)
    ptbk = res.json()['data']
    result = {}
    result["startDate"] = start
    result["endDate"] = end
    for userIndexe in data['userIndexes']:
        name = userIndexe['word'][0]['name']
        tmp = {}
        index_all = userIndexe['all']['data']
        index_all_data = [int(e) for e in decrypt(ptbk, index_all).split(",")]
        tmp["all"] = index_all_data
        index_pc = userIndexe['pc']['data']
        index_pc_data = [int(e) for e in decrypt(ptbk, index_pc).split(",")]
        tmp["pc"] = index_pc_data
        index_wise = userIndexe['wise']['data']
        index_wise_data = [int(e)
                           for e in decrypt(ptbk, index_wise).split(",")]
        tmp["wise"] = index_wise_data
        result[name] = tmp
    return result

测试一下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
get_index_data(["python", "java"])
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{'startDate': '2021-11-15',
 'endDate': '2021-11-21',
 'python': {'all': [23438, 23510, 23514, 24137, 22538, 17964, 15860],
  'pc': [14169, 14121, 14022, 14316, 13044, 9073, 8550],
  'wise': [9269, 9389, 9492, 9821, 9494, 8891, 7310]},
 'java': {'all': [8925, 8779, 9040, 9055, 9110, 6312, 5333],
  'pc': [5666, 5497, 5994, 5862, 5724, 3087, 2623],
  'wise': [3259, 3282, 3046, 3193, 3386, 3225, 2710]}}

结果非常不错。

这篇文章出自小小明的博客,原文链接:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://blog.csdn.net/as604049322/article/details/121490054
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-11-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python爬虫与数据挖掘 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
做动态图表,没有数据?用Python就能获取!
先看一下B站2019年「数据可视化」版块的情况,第一个视频超2百万的播放量,4万+的弹幕。
小F
2020/11/09
7000
做动态图表,没有数据?用Python就能获取!
Python关键词百度指数采集,抓包Cookie及json数据处理
百度指数(Baidu Index)是以百度海量网民行为数据为基础的数据分析平台,是当前互联网乃至整个数据时代最重要的统计分析平台之一,自发布之日便成为众多企业营销决策的重要依据。
二爷
2020/07/22
1.7K0
Python关键词百度指数采集,抓包Cookie及json数据处理
10分钟让你学会百度指数跑分图
这种跑分图其实还是很有意思的。所以Up自己也想做着玩玩。所以就有了今天这篇文章。 首先先给大家看看最后做完的效果:
萌萌哒的瓤瓤
2022/08/30
7760
10分钟让你学会百度指数跑分图
Python与SEO,Python百度移动端搜索下拉词采集工具及源码
众所周知,现在移动端流量占比是越来越重,尤其是app抢占了大量的移动端入口流量,而搜索引擎中移动端的流量也不容忽视,前面本渣渣有分享过百度搜索下拉词的挖掘采集工具及源码,今天就为大家分享Python百度移动端搜索下拉词采集工具及源码。
二爷
2022/06/14
2.2K0
Python与SEO,Python百度移动端搜索下拉词采集工具及源码
AI网络爬虫-自动获取百度实时热搜榜
标题:<div class="c-single-text-ellipsis"> 东部战区台岛战巡演练模拟动画 <!--48--></div>
AIGC部落
2024/06/24
2280
AI网络爬虫-自动获取百度实时热搜榜
质量看板开发实践(二):利用python获取jira数据-进阶篇
上一篇介绍了如何利用python的jira库操作jira,我们能通过项目的key获取项目的相关信息,同时也能利用jql查询一些信息,例如查询bug、故事、子任务等等,但是有些属性却不能通过这种方式直接拿到
冰霜
2022/04/05
1.1K0
python 股票历史数据(python获取股票历史数据)
大家好,又见面了,我是你们的朋友全栈君。 因为最近需要用到股市的各种指数数据,刚开始想的是从同花顺等交易软件直接导出,结果发现要用滚轮滚到最开始的日期,这过于繁琐了,我对于这种重复性的劳动一向不耐烦,而且这种方法在以后每日更新的时候也很不方便。所以我把视线转向了网上的各种api。网上比较普遍的主要有两种,一种是新浪的api,一种是雅虎的api。新浪的api很方便,速度也很快,不过就网上的资料而言,似乎只能提取当天的数据。雅虎的api功能更齐全,但是连接速度比较慢,有时候一个连接请求都要10多秒甚至20
全栈程序员站长
2022/08/01
2K0
Python爬虫实战入门:爬取360模拟翻译(仅实验)
点击网络刷新之后,在点击Fetch/XHR,随意输入一个单词,点击翻译会发现出现一个数据包,这个数据包就是我们所需要的。
爱喝兽奶的熊孩子
2024/04/10
2180
Python爬虫实战入门:爬取360模拟翻译(仅实验)
用Python实现交互式股市大盘指数查询与个股股价显示端
在开始之前,需要做好准备工作,我们需要安装一些必要的Python库,主要包括requests(用于发送HTTP请求)、json(用于处理JSON数据)、pandas(用于数据处理和展示)和tabulate(用于在shell端展示数据),这里主要使用以下命令进行安装:
三掌柜
2024/02/04
6554
用Python实现交互式股市大盘指数查询与个股股价显示端
【JS 逆向百例】百度翻译接口参数逆向
JS逆向百例_快代理logo.png 逆向目标 目标:百度翻译接口参数 主页:https://fanyi.youdao.com/ 接口:https://fanyi.baidu.com/v2transapi 逆向参数: Form Data: sign: 706553.926920 token: d838e2bd3d5a3bb67100a7b789463022 逆向过程 抓包分析 我们在百度翻译页面随便输入文字,可以看到没有刷新页面,翻译结果就出来了,由此可以推断是 Ajax 加载的,打开开发者工具,选择 X
K哥爬虫
2021/08/05
1.4K0
【JS 逆向百例】百度翻译接口参数逆向
AI网络爬虫:deepseek爬取百度新闻资讯的搜索结果
https://www.baidu.com/s?rtt=1&bsst=1&cl=2&tn=news&ie=utf-8&word=%E8%85%BE%E8%AE%AF%E4%BA%91%E6%99%BA%E8%83%BD%E8%AF%AD%E9%9F%B3+++%E9%87%91%E8%9E%8D
AIGC部落
2024/06/28
2490
AI网络爬虫:deepseek爬取百度新闻资讯的搜索结果
python3百度指数抓取 前言:代码在我的github上面:
哥那么叼的人怎么会被他吓到,于是乎花了零零碎碎加起来大约2天半搞定,在此鄙视一下土福
机器学习和大数据挖掘
2019/07/02
1.3K0
python3百度指数抓取
		前言:代码在我的github上面:
AI百度接口以及图灵接口的使用
耳朵 = 倾听 = 麦克风 = 语音识别 ASR:Automatic Speech Recognition
GhostCN_Z
2020/04/03
9000
AI百度接口以及图灵接口的使用
Python爬虫:爬取拉勾网职位并分析
本文从拉勾网爬取深圳市数据分析的职位信息,并以CSV格式保存至电脑,之后进行数据清洗,生成词云,进行描述统计和回归分析,最终得出结论。
数据科学社区
2018/07/30
1.6K0
Python爬虫:爬取拉勾网职位并分析
python下载百度音乐
我把百度音乐的网页代码稍微分析了一下,如果要求不高,下载普通音质的歌曲是不需要登陆的(当然如果你用浏览器打开下载的话,普通音质也是要求登陆下载的)
bear_fish
2018/09/20
8300
Python 打造基于百度翻译的命令行翻译工具
版权声明:本文为 FengCms FungLeo 原创文章,允许转载,但转载必须注明出处并附带首发链接 https://blog.csdn.net/FungLeo/article/details/81045207
FungLeo
2019/05/26
1.3K0
使用Python进行百度链接提交 加速百度收录
也就是说,如果我们的站点产生了一个新的链接,等待爬虫去发现这个链接可能速度要有十天或以上更长的时间,通过链接提交工具可以将产生的链接主动发送给百度爬虫,然后等待百度爬虫爬取,增快收录,但是否决定收录,要根据百度标准。
KEVINGUO_CN
2020/03/16
1.4K0
python自动化高效办公第二期,带你项目实战【二】{数据可视化、发送邮件(定时任务监控)、python聊天机器人(基于微信、钉钉)}
API商城_API_API接口大全_API一站式采购基地百度智能云API商城-API一站式采购基地,API商城提供天气查询API、实名认证API、短信验证码、OCR识别等海量API服务。选购API服务,首选百度智能云API商城。
汀丶人工智能
2022/12/21
1.1K0
python自动化高效办公第二期,带你项目实战【二】{数据可视化、发送邮件(定时任务监控)、python聊天机器人(基于微信、钉钉)}
爬虫篇| 爬取百度图片(一)
网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。(来源:百度百科)
润森
2019/09/02
5.4K1
爬虫篇| 爬取百度图片(一)
站长工具关键词挖掘采集,Python关键词批量挖掘采集工具
对于seoer而言,关键词的重要性毋庸置疑,关于关键词的挖掘有很多种方法,借助平台工具是必需的,而想要批量获取关键词数据,你需要更好的方法!
二爷
2020/07/22
1.3K0
站长工具关键词挖掘采集,Python关键词批量挖掘采集工具
推荐阅读
相关推荐
做动态图表,没有数据?用Python就能获取!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验