热门推荐
【项目小结】爬虫学习进阶:获取百度指数历史数据
2024-10-31 22:05

目录

【项目小结】爬虫学习进阶:获取百度指数历史数据

序言

问题描述

问题解决

登录百度账号

接口参数说明以及注意事项

参数word

参数startDate与endDate

参数area

JS逆向获取解密逻辑

源码

baiduindex_manage.py

baiduindex_config.py

baiduindex_index.py

baiduindex_utils.py 

结语


前排致谢longxiaofei@githubrepository: spider-BaiduIndex

前几天前室友yy询问笔者是否做过百度指数的爬虫,笔者没有尝试过,随即打开百度指数的网站做了一些分析,发现呈现数据的canvas画布上的数据都被加密了Figure 1👇

Figure 1 百度搜索指数抓包响应结果

考虑到之前在网易云音乐爬虫编写上有过一些JS逆向解密的经验,正好也有一段时间没有写点爬虫了,并不想用借助selenium驱动浏览器对canvas画布上的折线图进行图像识别来获取数据,想借这个机会再试试JS逆向,可是百度的JS实在是又臭又长,熬了一夜再加整了一天也没搞清楚究竟是在哪里发生解密的PS:笔者很想知道这种解密JS代码的定位到底有什么比较高效率的方法,比如通过断点调试什么的)。

无奈在同性交友网上找找有没有人做过类似的事情,于是找到了spider-BaiduIndex,笔者一直觉得像这种需要编写解密逻辑的爬虫时效性是很差的,只要稍微修改一下密钥或者加密方法就完全不可行了,该repository截至2020-07-29依然可行。但是longxiaofei@github并没有在README里详细描述爬取思路,笔者在借鉴该脚本后,在本文中将详细解析百度指数爬取的思路,并对spider-BaiduIndex进行一定程度的完善。

声明:如有侵权,私信删除

事实上百度指数搜索结果页面上除了搜索指数媒体指数资讯指数三张canvas图表上的数据存在被加密的情况Figure 2 ~ Figure 7👇

Figure 2 搜索指数接口URL Figure 3 搜索指数抓包响应 Figure 4 媒体指数接口URL Figure 5 媒体指数抓包响应 Figure 6 资讯指数接口URL Figure 7 资讯指数抓包响应

其他的数据如地域分布以及性别年龄兴趣分布,包括媒体指数具体的新闻来源信息都是没有被加密的Figure 8 ~ Figure 10,在爬虫获取上是没有太大障碍的,因此不在本文的涉及范围内👇

Figure 8 地域分布抓包响应 Figure 9 性别年龄兴趣分布抓包响应 Figure 10 媒体指数具体相关来源抓包响应

以下列出上述提到的各个接口的URL,以及接口需要提交的参数信息示例,本文主要是对前三个接口(搜索指数API_SEARCH_INDEX,媒体指数API_NEWS_INDEX,资讯指数API_FEEDSEARCH_INDEX)数据获取并解密过程的详细说明,文末附上完整源码👇

解决获取三种指数问题,本文分以下几点展开

  1. 登录百度账号
  2. 接口参数说明以及注意事项
  3. JS逆向获取解密逻辑

百度指数的获取是需要登录百度账号的,为了避开爬虫登录百度账号的问题,我们直接从百度首页进行登录后,随便选取一个域名为www.baidu.com的数据包,取得其中请求头的cookie信息即可Figure 11👇

Figure 11 百度账号登录cookies获取

为了验证cookie是否可用,可以使用以下代码进行测试,代码逻辑是通过携带cookie信息访问百度首页以确定用户名图标退出登录按钮以及登录按钮是否存在来进行判定,但是随着百度首页的更新可能需要有所修正,之所以选取了三个元素也是增强判定的可信度👇

通过简单抓包观察可以发现,搜索指数API_SEARCH_INDEX,媒体指数API_NEWS_INDEX,资讯指数API_FEEDSEARCH_INDEX的参数都是相同的👇

以下分别对每个参数的说明以及注意点

参数word

Figure 12 word参数来源

参数word是一个json格式的二元列表,因为百度指数支持多关键词指数查询以及不同关键词之间的对比查询Figure 12,目前支持至多5组关键词的对比,每组关键词的数量不超过3,因此需要对传入的关键词组进行有效性检查👇

此外并非每个关键词百度指数都有收录,通过抓包可以看到在指数查询前会有对该关键词的存在性进行检查的接口调用Figure 13,可以查询的关键词(如计算机)与无法查询的关键词(如囚生CY)如下所示Figure 14 & Figure 15👇

Figure 13 关键词存在性接口URL Figure 14 百度指数收录的关键词检查结果 Figure 15 百度指数未收录的关键词检查结果

由上图发现可以查询的关键词响应结果的result字段为空列表,而不可查询的关键词响应结果的result字段是非空的,通过这个规律我们可以对每个关键词进行预筛选注意一定要在登录状态下访问该check接口,否则返回结果的message字段将会是not login👇

参数startDate与endDate

Figure 2 Figure 4 Figure 6中我们看到请求参数并没有startDateendDate,而是days,这是因为默认显示的指数时间跨度为最近30天,需要在百度指数页面上自定义设置后再抓包就可以看到这两个请求参数Figure 16👇

Figure 16 百度指数自定义时间跨度

这里需要注意的是,时间跨度的天数超过366(截至20200731测试结果)后,指数的折现图将不再按照每天展示,而更改为每周显示Figure 17 & Figure 18👇

Figure 17 跨度为365天的指数结果(20190101~20191231 Figure 17 跨度为367天的指数结果(20190101~20200102

指数数据是按日或按周可以通过响应结果中的type字段看出,如果是按周,则type字段值将为week👇Figure 18

Figure 18 API响应结果判定by day或by week

出于可适性考虑笔者建议不要使得时间跨度超过一年366,使用按日的数据总是要比按周的要更划算的。

参数area

参数area的默认值为0,表示统计全国的指数,也可以分地区考虑,通过查询文件名开头为main_vendorJS文件可以找到全国各个区域,各个省份,各个城市的编号Figure 19 ~ Figure 21👇

Figure 19 main_vendor.js抓包 Figure 20 main_vendor.js中的省份编号 Figure 21 main_vendor.js中的区域编号与城市编号

简单点直接从JS里复制下来用就可以了👇

例如实际使用中将area参数替换成901就可以获得山东省的指数数据。

最后就是应当如何处理Figure 3 Figure 5 Figure 7中红框里的加密数据了,我们再重新仔细看一遍Figure 18👇

Figure 20 重新查看Figure 18

红框里的uniqid字段非常关键,现在我们还不能知道这个字段究竟是用于做什么的。

这里可以看到加密数据显然不可能是通用的标准加密算法得到的,因为显然加密结果并非随机,加密结果中频繁且规律性地出现相同字符。笔者起初试图在JS中找到解密算法的逻辑,但是百度指数的JS实在是又臭又长,没有指向性地去读JS实在是非人地折磨,后来又想通过找规律的方法试出这个加密算法,又无所得。最后终于还是在文件名以main.开头的JS文件中找到了加密逻辑Figure 21 & Figure 22👇

Figure 21 main.xxxxxxxxxxxxx.js抓包 Figure 22 main.xxxxxxxxxxxxx.js中的解密逻辑代码

其实笔者得出一个小经验,如果想在JS里找到加解密的逻辑,先试试搜索关键词encryptdecrypt,如果写JS的码农还是个人(假设他不能是个狗,他应该不会给加解密函数随便起个没意义的名字(不过网易云爬虫里面涉及加解密的那部分还真是用abcdef来命名加解密函数的,不过好在网易云的JS很短,很容易就查到在哪里加解密了)。

言归正传Figure 22划线部分即为解密逻辑function(t,e)中变量t显然是Figure 3 Figure 5 Figure 7里那一长串的字符,变量e则是解密的密钥,可以将划线部分用python代码复现👇

可以看出密钥key其实可以转化为一个映射字典,可以将data里的每个字符映射成实际的数据,其实就是一个非常简单的映射加密(想不到百度竟然都不用标准的加密算法来加密,实在是懒得不行)。问题是如何取得密钥key

这时候我们一个个检查XHR中的抓包结果,终于可以在一个文件名以ptbk?uniqid开头的数据包中找到线索Figure 23 & Figure 24👇

Figure 23 密钥请求接口URL Figure 24 密钥请求接口响应

可以看到该数据包的请求用到了Figure 20中的uniqid,对比Figure 24中的响应dataFigure 20中那些加密后的字符串,发现加密字符串中的字符无一例外都可以在Figure 24中的响应的data中找到。有理由相信这个data就是可以用于解密的密钥👇

至此,百度指数爬虫大部分的问题要点已经解决。

以下四个py文件置于同一目录即可,运行第一个baiduindex_manage.py即可👇

    以上就是本篇文章【【项目小结】爬虫学习进阶:获取百度指数历史数据】的全部内容了,欢迎阅览 ! 文章地址:http://dfvalve.xrbh.cn/quote/4310.html 
     行业      资讯      企业新闻      行情      企业黄页      同类资讯      网站地图      返回首页 迅博思语资讯移动站 http://keant.xrbh.cn/ , 查看更多