详解百度指数搜索指数js逆向

一、相关环境

开发工具:PyCharm 2022.3.1 (Community Edition)

开发环境:Python 3.9

操作系统:Windows10

二、目标数据

在 百度指数首页登录,然后输入一个关键词进入搜索指数页面,以下操作全是基于该页面进行。

我们要抓取的是指定关键词的搜索指数趋势图中某一段时间的数据,这里以python的搜索指数为例:

需要获取曲线上每一个这样的点对应的数据。打开开发者工具,在元素栏中Ctrl+F搜索其中一个数据,搜索结果为0条,说明网页源代码中不存在需要的数据,而是动态获取的。

三、获取动态数据

打开开发者工具->切换到网络栏->选中XHR项->刷新页面

逐个点击左侧请求的名称并查看右侧的响应预览,发现index开头的请求中包含数据,观察一下发现应该是我们需要的数据,但是data被加密了,那么下一步需要js逆向找到加密方式。

四、JS逆向

我们分析上述请求返回的json数据,其形式大致如下:

{
  "data": {
    "generalRatio": [
      {}
    ],
    "userIndexes": [
      {
        "word": [],
        "all": {
          "data": "",
          "endDate": "",
          "startDate": ""
        },
        "pc": {},
        "wise": {},
        "type": "day"
      }
    ],
    "uniqid": "xxxxxxxxxx"
  }
}

当前端拿到这样的加密数据来解密时,必然要用到类似data.generalRatio、data.userIndexes这样的方式来取出整个数组;更进一步考虑,前端会使用all.data来获取最后一层数据。由于编译过的js中整个数据一般会赋值给单字母,而all和data这种单词又过于常见,因此我们的思路是先用generalRatio、userIndexes去搜索,没有结果的话再用all.data去搜索。

Ctrl+Shift+F调出全局搜索框,搜索userIndexes(因为我们找的是userIndexes中的数据),定位到两个js。

逐个查看后发现第一个js中userIndexes只有一处,是在处理请求的函数中。第二个js中userIndexes有三处,第一处是向后端发送axios请求,说明我们的目标就在这个js中;第二处和第三处在一起,可以很明显得发现这里在构造趋势图的数据,除了赋值操作之外,我们可以看到有一个decrypt函数,且分别用它操作了all.data、pc.data、wise.data,至此我们可以确定这个函数就是解密函数。

decrypt函数传入了两个参数,第二个参数可以看出是从后端获取的加密数据,第一个参数暂时看出来是,我们在其中一个decrypt函数处打断点进行调试,跳转至decrypt函数内部时,可以看到第一个参数是"-GlAwgjW3yBdeQm7,%5+940831-6.2"这样的加密字符串,在网络栏中搜索一下看是不是从后端传过来的,结果显示这个参数是https://index.baidu.com/Interface/ptbk?uniqid=47ec7818050d810e4d02951afcbd38c7的返回。

再搜索一下参数uniqid,发现好几个请求都有该参数返回且值相同,同时请求数据的接口也返回了该参数。

最后整理一下思路:

程序 api/SearchApi/index接口 Interface/ptbk接口 登录 请求数据 加密数据、uniqid 参数:uniqid 解密参数ptbk 通过解密参数ptbk解密数据 程序 api/SearchApi/index接口 Interface/ptbk接口

五、代码实现

导入所需的包
import requests
import pandas as pd
from fake_useragent import UserAgentnt
获取Cookie

百度指数的请求会验证用户是否登录,所以发起请求前需要获取Cookie信息,百度Cookie的核心是BDUSS,只能自己登录账号->开发者工具->应用程序->Cookie->BDUSS然后复制值。

在前面拼接BDUSS=即可构造Cookie

cookies = 'BDUSS=XXXXXXXXXX'
请求数据
1.请求头及参数构造

网络栏查看api/SearchApi/index请求,有三个参数:

1.area:省份代码,默认0表示全国

2.word:由关键词构造的二维数组,形如[[{“name”: “python”, “wordType”: 1}]]

3.days:返回数据是最近多少天,默认30

然后复制请求头,将Cookie传入

search_param = {'area': '0', 'word': '[[{"name": "python", "wordType": 1}]]', 'days': '60'}
search_url = 'https://index.baidu.com/api/SearchApi/index?'

headers = {
    'Accept': 'application/json, text/plain, */*',
    'Accept-Encoding': 'gzip, deflate, br',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Cipher-Text': '1672733200884_1672792253933_1NLQa+cgc5N2JSNoinHAaMmrDrPtwqHL6D2NHONACx//1P+9YXcg/erBma8ucj43shvH2VsAi3Dzlo9cFfqA3k/PmqixjXJEslJCwNzCzNCVHs+/y7su33mGAxAtFWXrl55rYxzEJNGi4xM6jb4UUibTrVbOl46gKWq/7PVKAIzRyrJbxQP9pKmxECIpO12JbXFrA3leOj8xDZk69P1O/tNU6lD8eMPylUrgCp5k89c9EAD+Q4lgHhsZpTktcKTzKSbrJ5/l0GYNxNS96gEpS/0BnesBc6X52rqE7K4fNzrxm5cfgwbCJx/2+1ayhkI2gUMNDabQ1dnR0hr/NyWxeh7nYvxqarQHsZ+cu3XCt5uEHE4aAPgcXTfDgMsCQOrtMfDGKuxX5PiMDzDODjxSn8cDFRnJ+RMvfPjIIfq2P4k=',
    'Connection': 'keep-alive',
    'Cookie': cookie,
    'Host': 'index.baidu.com',
    'Referer': 'https://index.baidu.com/v2/main/index.html',
    'Sec-Fetch-Dest': 'empty',
    'Sec-Fetch-Mode': 'cors',
    'Sec-Fetch-Site': 'same-origin',
    'User-Agent': str(UserAgent().random)
}
2.发送请求,解析数据

使用requests发送get请求,获取加密数据,同时保存uniqid

response = requests.get(search_url, params=search_param, headers=headers)
encrypted_data = response.json()['data']
uniqid = encrypted_data['uniqid']
解密数据
1.获取解密参数
ptbk_url = f'http://index.baidu.com/Interface/ptbk?uniqid={uniqid}'
ptbk_response = requests.get(ptbk_url, headers=headers)
ptbk = ptbk_response.json()['data']
2.改写解密函数

JS中的解密函数

Python版本的解密函数


def decrypt(ptbk, encrypted_data):
    """
    :param ptbk: 解密参数
    :param encrypted_data: 加密数据
    :return: 解密后的数据
    """
    if not ptbk:
        return ""
    n = len(ptbk) // 2
    d = {ptbk[o]: ptbk[n + o] for o in range(n)}
    decrypted_data = [d[data] for data in encrypted_data]
    return ''.join(decrypted_data)

顺带把填充零的函数写了

def fill_zero(data):
    """
    :param data: 字符串格式的数据
    :return:data为空则返回0,否则返回原数据
    """
    if data == '':
        return 0
    else:
        return data
3.解析数据并保存到csv
result = pd.DataFrame(columns=['关键词', '日期', '全部', '电脑端', '移动端'])
for userIndexes_data in encrypted_data['userIndexes']:
    word = userIndexes_data['word'][0]['name']

    start_date = userIndexes_data['all']['startDate']
    end_date = userIndexes_data['all']['endDate']
    timestamp_list = pd.date_range(start_date, end_date).to_list()
    date_list = [timestamp.strftime('%Y-%m-%d') for timestamp in timestamp_list]

    encrypted_data_all = userIndexes_data['all']['data']
    decrypted_data_all = [int(fill_zero(data)) for data in decrypt(ptbk, encrypted_data_all).split(',')]
    encrypted_data_pc = userIndexes_data['pc']['data']
    decrypted_data_pc = [int(fill_zero(data)) for data in decrypt(ptbk, encrypted_data_pc).split(',')]
    encrypted_data_wise = userIndexes_data['wise']['data']
    decrypted_data_wise = [int(fill_zero(data)) for data in decrypt(ptbk, encrypted_data_wise).split(',')]
    df = pd.DataFrame({'关键词': word, '日期': date_list, '全部': decrypted_data_all, '电脑端': decrypted_data_pc, '移动端': decrypted_data_wise})
    result = pd.concat([result, df])
result.to_csv('./result.csv',index=False)
扩展
1.同时搜索多个关键词

在word参数中添加多个关键词,最多五个,超过五个只会返回前五个的结果

'word': '[[{"name": "python", "wordType": 1}],[{"name": "java", "wordType": 1}],[{"name": "c", "wordType": 1}],[{"name": "c++", "wordType": 1}],[{"name": "go", "wordType": 1}]'
2.指定时间段

将days参数修改为startDate、endDate这两个参数

'startDate': '2022-12-01',
'endDate': '2022-12-31'
3.指定省份

可以只搜索某一个省份的数据,将area参数改为相应省份的代码即可,如北京市的代码为911,其他省份的代码可以在步骤四的js文件中找到:

青貉
关注 关注
  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
百度指数 Cipher-Text、百度翻译 Acs-Token 逆向分析
m0_72134256的博客
08-20 925
K 哥之前写过一篇关于百度翻译逆向的文章,也在 bilibili 上出过相应的视频,最近在 K 哥爬虫交流群中有群友提出,百度翻译新增了一个请求头参数 Acs-Token,如果不携带该参数,直接按照以前的方法进行处理,会出现 1022 报错,并且如果直接将 Acs-Token 写成定值,前几次可能能成功,多查询几次也会报同样的错误,现对其进行逆向分析,对往期代码进行重构。
详解python3百度指数抓取实例
09-21
本篇文章主要介绍了python3百度指数抓取,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧。
Python爬虫实战!爬取百度指数并可视化
法纳斯特
02-28 1442
大家好,我是小F~这两年AI可以说是非常火,尤其是AIGC领域。而这其中很多都是基于Python实现的,比如ChatGPT、AI绘画、声音克隆等等。对于普通人来说,想直接学习这些高难度的Python项目,还是比较困难的。小F是非常建议大家学Python,可以从Python爬虫入门。相对来说简单一点,可以通过学习爬虫案例来入门Python,为了以后学AI打下基础。今天就给大家介绍一个百度指数数据爬取...
利用Python爬取百度指数数据
最新发布
u014363023的博客
03-23 849
利用Python的requests库编写爬取百度指数数据的爬虫程序
百度指数数据分析python完整示例代码
JYSG9的专栏
06-25 248
当涉及到旅游数据分析时,Python是一种非常强大和流行的编程语言,可以用于数据收集、数据处理、可视化和建模等任务。
百度指数工具链接:https://pan.baidu.com/s/1djG9o1bQphyiXZVgmo9gNw  提取码:l5md
04-29
软件支持从2006年6月改版后的百度指数,批量采集百度指数的整体指数,移动指数,导出从2011年开始的每天的整体指数,移动指数数据。 支持如下功能: 1)可以从文件导入关键词,不限导入数量。 2)可以批量导出关键词及指数数据为excel文件。 3)支持百度验证码自动识别(第三方打码平台)。 4)支持百度指数数据的自动保存,自动恢复(退出软件自动保存,打开软件自动恢复上次查询的结果及未查询的关键词列表) 5)支持查询百度指数有近一天整体指数/近一天PC指数/近一天移动指数/一周平均整体指数/一周平均PC指数/一周平均移动指数/月平均整体指数/月平均PC指数/月平均移动指数/周环比/周同比/月环
Python进阶篇:百度指数解密【抓包|JS逆向|数据区分】
五包辣条的博客
07-13 3010
过往给大家更新了不少基础相关的,今天给大家上点硬货,基础不好的慎入,免得打击你们的积极性~
js逆向-百度登陆参数
逆向新手的博客
08-20 3526
网站: 接口:抓包后会发现post请求会提交很多的参数,有很多参数都加密了。所以今天的逆向是个大工程。 老规矩还是以搜索为主,搜索passoword。 有12个文件,文件内容比较多。搜索比较费劲,搜索一下别的关键字试一下。 搜索完美!就一个文件,点进去继续寻找。 典型RSA加密,打下断点,重新调试。console中打印结果。 此时就已经完成了加密。值和(不清除数据)为固定值,网页源码中可以直接找到,这个没有什么说的,写死就可以。 gid的生成逻辑 至于as、ds、tk其实在另一个请求中就可以得到,这里就不做
百度上线搜索指数3.0含义
leo12036okokok的博客
08-31 461
百度经过几个月的调整终于上线了搜索指数3.0,这也是很多站长预料之中的,移动端现在百度APP由于安装量和在线量达到每天活动上亿的数据看,百度还是要推自己的百家号和小程序,门槛以后会越来越高,首先必须是企业认证才会给权益,然后是钱必须到位。 搜索资源指数3.0已于8月30日上线,搜索资源指数3.0由三部分构成:智能小程序指数、站点指数、平台任务分。这些说法都是虚的很,说百度氪金够了...
python-numpy-指数分布实例详解
01-21
如下所示: # Seed random number generator np.random.seed(42) # Compute mean no-hitter time: tau tau = np.mean(nohitter_times) # Draw out of an exponential distribution with parameter tau: inter_...
百度指数批量查询工具
07-07
百度指数批量查询工具,之前有人需要就自己做了一个,具体接口能用的什么时候我也不知道,随缘吧。2019.07.07
数据接口:百度、谷歌、头条、微博指数,宏观数据,利率数据-Python开发
05-25
数据接口:百度、谷歌、头条、微博指数,宏观数据,利率数据,货币汇率,千里马、独角兽公司,新闻联播文字稿,影视票房数据,高校名单,疫情数据… gopup (python3) 建议安装方法 pip install gopup 升级方法 pip install gopup --upgrade GoPUP 支持Python 3.7+,旨在使获取数据尽可能方便,主要用于学术研究目的。 GoPUP 项目所采集的数据皆来自公开的数据源,不涉及任何个人隐私数据和非公开数据。 同时本项目提供的数据接口及相关数据仅用于学术研究,任何个人、机构及团体使用本项目的数据接口及相关数据请注意商业风险。 文档:中文文档 快速开始 import gopup as gp df = gp.weibo_index(word="疫情", time_type="1hour") print(df) 数据仓库 指数数据 微博指数数据 百度指数数据 百度搜索数据 百度资讯指数 百度媒体指数 百度需求图谱 百度人群画像年龄分布 百度人群画像性别分布 百度人群画像兴趣分布 头条指数数据
百度指数工具 V2.3 百度指数采集 资讯指数采集 百度指数软件
12-05
链接:https://pan.baidu.com/s/1djG9o1bQphyiXZVgmo9gNw  提取码:l5md
2020 百度指数工具 V2.4 百度指数采集 资讯指数采集 百度指数软件
12-06
链接:https://pan.baidu.com/s/1djG9o1bQphyiXZVgmo9gNw  提取码:l5md
一次二次三次指数平滑案例详解.xlsx
04-21
该文档为原创文档,内容是一次二次三次指数平滑方法的3份数据和对应的操作,对我们深刻理解指数平滑有很大帮助哦。
Python指数与E记法的区别详解
09-18
今天小编就为大家分享一篇Python指数与E记法的区别详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
百度指数接口解密
qq_36532060的博客
06-29 395
百度指数接口解密
mybatis逆向工程配置文件详解
08-13
MyBatis逆向工程是指通过数据库表结构自动生成Java代码的工具。配置文件是MyBatis逆向工程的重要组成部分,下面是对其进行详细解释。 在逆向工程配置文件中,首先需要配置数据库连接信息。包括数据库的URL、用户名...

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • scipy.spatial.distance.cdist函数 5260
  • 用pyecharts做2019-nCoV疫情数据可视化 2299
  • Python安装包时遇到There was a problem confirming the ssl certificate…的解决办法 1932
  • pycharm中设置自动不显示波浪线 1512
  • pytorch快速安装 1466

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • 使用PicGo为Marktext设置Gitee图床
  • Python安装包时遇到There was a problem confirming the ssl certificate…的解决办法
  • scipy.spatial.distance.cdist函数
2023年2篇
2021年2篇
2020年3篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

PHP网站源码飞来峡网络营销价格天门外贸网站设计价格三明百度竞价包年推广阜新外贸网站制作推荐吴忠外贸网站建设吕梁网站优化推荐广元建网站哪家好德宏建站推荐扬州外贸网站建设推荐福田百度关键词包年推广价格烟台seo优化推荐贵阳百搜标王报价长春百度关键词包年推广哪家好衡阳网站推广系统公司荷坳网络营销廊坊百度网站优化排名哪家好舟山网站推广方案公司黑河设计公司网站公司楚雄网站优化软件报价吴忠品牌网站设计公司山南阿里店铺托管多少钱邢台建站永州百度竞价包年推广推荐成都网站制作价格朔州模板制作多少钱大浪网站设计哪家好南宁百度爱采购价格永新网站建设设计报价丽水百度爱采购平凉营销网站歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

PHP网站源码 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化