详解百度指数搜索指数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 942
K 哥之前写过一篇关于百度翻译逆向的文章,也在 bilibili 上出过相应的视频,最近在 K 哥爬虫交流群中有群友提出,百度翻译新增了一个请求头参数 Acs-Token,如果不携带该参数,直接按照以前的方法进行处理,会出现 1022 报错,并且如果直接将 Acs-Token 写成定值,前几次可能能成功,多查询几次也会报同样的错误,现对其进行逆向分析,对往期代码进行重构。
Python进阶篇:百度指数解密【抓包|JS逆向|数据区分】
五包辣条的博客
07-13 3038
过往给大家更新了不少基础相关的,今天给大家上点硬货,基础不好的慎入,免得打击你们的积极性~
2024年Python进阶篇:百度指数解密【抓包 JS逆向 数据区分】(1),算法面试宝典
最新发布
2401_84141219的博客
05-10 590
别在网上瞎学了,我最近也做了一些资源的更新,只要你是我的粉丝,这期福利你都可拿走。我先来介绍一下这些东西怎么用,文末抱走。这是我花了几天的时间去把Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。最近我才对这些路线做了一下新的更新,知识体系更全面了。
js逆向-百度登陆参数
逆向新手的博客
08-20 3669
网站: 接口:抓包后会发现post请求会提交很多的参数,有很多参数都加密了。所以今天的逆向是个大工程。 老规矩还是以搜索为主,搜索passoword。 有12个文件,文件内容比较多。搜索比较费劲,搜索一下别的关键字试一下。 搜索完美!就一个文件,点进去继续寻找。 典型RSA加密,打下断点,重新调试。console中打印结果。 此时就已经完成了加密。值和(不清除数据)为固定值,网页源码中可以直接找到,这个没有什么说的,写死就可以。 gid的生成逻辑 至于as、ds、tk其实在另一个请求中就可以得到,这里就不做
百度上线搜索指数3.0含义
leo12036okokok的博客
08-31 463
百度经过几个月的调整终于上线了搜索指数3.0,这也是很多站长预料之中的,移动端现在百度APP由于安装量和在线量达到每天活动上亿的数据看,百度还是要推自己的百家号和小程序,门槛以后会越来越高,首先必须是企业认证才会给权益,然后是钱必须到位。 搜索资源指数3.0已于8月30日上线,搜索资源指数3.0由三部分构成:智能小程序指数、站点指数、平台任务分。这些说法都是虚的很,说百度氪金够了...
百度指数接口解密
qq_36532060的博客
06-29 417
百度指数接口解密
详解python3百度指数抓取实例
09-21
本篇文章主要介绍了python3百度指数抓取,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧。
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_...
一次二次三次指数平滑案例详解.xlsx
04-21
该文档为原创文档,内容是一次二次三次指数平滑方法的3份数据和对应的操作,对我们深刻理解指数平滑有很大帮助哦。
Python指数与E记法的区别详解
09-18
今天小编就为大家分享一篇Python指数与E记法的区别详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
百度指数
anbingzhong1132的博客
12-20 206
百度指数数据是拼成图片在客户端显示,要用到OCR识别,在此我了google和百度自带的两张OCR识别 # !/usr/bin/python3.4 # -*- coding: utf-8 -*- # 百度指数的抓取 # 截图教程:http://www.myexception.cn/web/2040513.html # # 登陆百度地址:https://passpor...
百度指数工具链接:https://pan.baidu.com/s/1djG9o1bQphyiXZVgmo9gNw  提取码:l5md
04-29
软件支持从2006年6月改版后的百度指数,批量采集百度指数的整体指数,移动指数,导出从2011年开始的每天的整体指数,移动指数数据。 支持如下功能: 1)可以从文件导入关键词,不限导入数量。 2)可以批量导出关键词及指数数据为excel文件。 3)支持百度验证码自动识别(第三方打码平台)。 4)支持百度指数数据的自动保存,自动恢复(退出软件自动保存,打开软件自动恢复上次查询的结果及未查询的关键词列表) 5)支持查询百度指数有近一天整体指数/近一天PC指数/近一天移动指数/一周平均整体指数/一周平均PC指数/一周平均移动指数/月平均整体指数/月平均PC指数/月平均移动指数/周环比/周同比/月环
百度指数批量查询工具
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
webmagic百度指数查询
java编程学习_java基础教程_booyzhang的博客
06-27 382
需求:本地一批关键词,需要查询百度指数,5118一次只能查100条,5W不得手软,看接口0.013元1条,网上找了百度指数接口,都不怎么便宜,那就自己动手了,用webmagic也是很方便快捷的。 1、配置 webmagic两个包、打包成jar可以挂在服务器慢慢运行。 <dependencies> <!-- webmagic核心包 --> <dependency> <groupId>us.codec
百度指数-批量查询器
qq_14937049的博客
12-18 509
因为百度指数应该也是一个比较出名的东西,应该会有一些类似批量查询的工具吧。所以,开始到网上找,“百度指数 批量查询”,还真有,没想到遍地都是,就尝试着下载了几个来看看 度指数查询软件更新换代频繁,如今还有哪个软件能用呢? 本编正好略懂编程, 简单的写了点代码,实现百度指数全自动查询功能: 只需导入关键词,点击开始,结果会自动保存在软件目录下的 “查询结果 百度指数查询工具V1.0(请解压后运行!).rar - 蓝奏云 ...
mybatis逆向工程配置文件详解
08-13
MyBatis逆向工程是指通过数据库表结构自动生成Java代码的工具。配置文件是MyBatis逆向工程的重要组成部分,下面是对其进行详细解释。 在逆向工程配置文件中,首先需要配置数据库连接信息。包括数据库的URL、用户名、密码等,这些信息用于建立与数据库的连接,保证能够正常读取到数据库的表结构。 接着需要配置逆向工程生成的文件保存的目标路径。可以指定生成的Java文件、Mapper接口和Mapper.xml文件的保存路径。这样生成的文件就会按照配置的路径保存到指定的目录下。 配置生成的实体类的包名和类名前缀,可以通过这些配置项来自定义生成的实体类的命名规则。例如可以指定包名为com.example.entity,类名前缀为"Sys",那么生成的实体类就会以"Sys"开头,如"SysUser"。 配置生成的Mapper接口的包名和后缀名,可以通过这些配置项来自定义生成的Mapper接口的命名规则。例如可以指定包名为com.example.mapper,后缀名为"Dao",那么生成的Mapper接口就会以"Dao"结尾,如"UserDao"。 配置生成的Mapper.xml文件的包名和后缀名,可以通过这些配置项来自定义生成的Mapper.xml文件的命名规则。例如可以指定包名为com.example.mapper,后缀名为"Mapper",那么生成的Mapper.xml文件就会以"Mapper"结尾,如"UserMapper"。 此外,还可以在配置文件中添加特定的Table标签来过滤要生成的表,只生成需要的部分表的代码。 通过以上配置,我们可以轻松地使用MyBatis逆向工程自动生成与数据库表结构对应的Java代码,极大地提高了开发效率。当数据库表结构发生变化时,只需重新运行逆向工程,就可以自动更新生成的代码,避免手动修改带来的错误。

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

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

热门文章

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

最新文章

  • 使用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、付费专栏及课程。

余额充值

聚圣源猫爪草和夏枯草的副作用逆天问道攻略缺水火起名女孩名字吗双肩包什么牌子的好给小孩起小名字女16年倒吊砍手事件是什么信给十五岁的自己前程无招聘网1921电影演员表他吻陶瓷店面起什么名好用牛字饭店起名四个字物流公司名称起名大全双胞胎起名男孩算八字取名起名谷姓女孩起名子起个蛋糕店名字大全至高剑神1314电影有机肥公司起名字建材店起名回到三国的特种兵晨字起名男孩堂鼓工商起名字查询软件卢布对人民币汇率好看的恐怖小说五岳独尊网球宝贝官网茶业商标起名大全淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费

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