百度指数有一个详细的帮助文档,下面列出来的几个点是我的个人总结:
- 百度指数是度量网民搜索量多寡的指数,可以用来描述社会对某某某的关注度。
- 百度指数大众版不要钱,百度指数专业版要钱,但不对个人用户开放。
- 百度指数不提供API直接获取数据,需要自行爬取。
- 百度指数每天更新,PC端数据最早到2006年6月,移动端数据最早到2011年1月。如需要获取2011年以前的百度指数,请仅获取PC端搜索数据。
- 如果检索的百度指数跨度超过一年,页面上显示的数据将是周指数而不是日指数,如果需要大段时间内的百度指数,需要分段获取后手工拼接。
- 使用可以汇总若干个关键词的检索量,比如这个关键词的百度指数是和的百度指数的和,百度指数最多支持三个关键词的累加搜索。
- 使用(英文输入法下的逗号)可以将不同的关键词隔开,用来做对比分析,最多支持五个关键词的比较。
- 百度指数需要登录以后才能访问。
- 还有许多功能尚未提及,感兴趣的老铁多玩一下百度指数应该就能知道它们都是啥意思了。
毫不意外,百度指数是通过Ajax获取的,我们通过简单的查找后可以发现它是通过下面这个请求获得的:
获取百度指数的Ajax请求
URL当中有一些格式化以后的字符,直接看不知道是啥意思,把它的具体内容截图:
表示要获取的关键词为炸鸡,区域是全国范围内,时间是30天以内
事实上,我第一次做百度指数爬虫的时候,参数都不是长这个样子的,说明百度指数更新了,故而在这里强调一下,我写下这篇专栏文章的日期是2020年8月5日。如果您阅读这篇文章的时间距离这个日期太过久远的话,本文可能就只有借鉴意义了。
下图给出的是该请求返回的JSON格式的数据,其中代表的数据,和分别代表着PC端和移动端的检索数据,展开以后对应的数据就是返回的百度指数,和分别对应的便是这条百度指数的截止日期和开始日期。
上述GET请求返回的JSON数据
很明显,我们拿到的数据是加密后的密文,我们为了拿到真实数据需要知道它的解密方式。通过互联网检索,不难得知,百度指数的解密方式非常简单,它首先从服务器上获取到一个解密密码,然后再调用Javascript进行解密。下图展示的是为了拿到密码而发送的GET请求,该请求有一个参数,其取值正是上一个请求返回的JSON数据中键对应的内容,感兴趣的老铁可以放大这段文字上下的两张图,做一个简单的对比。
为获取密码而发送的GET请求
拿到密码之后就可以百度一下百度指数的解密方式,可以搜索到现成的解密代码。我则想给大家看一下如何查找解密代码,算是授人以渔吧。通过下图介绍的方法可以看到这条请求究竟是如何发送出来的,我们可以一个一个点进去,看看有没有设置回调函数(就是拿到了服务器的返回值以后要执行的函数)。经验告诉我们开头的那些函数都不用去看,因为它们应该是框架vue提供的代码。点击名为的触发器,我想我们就找到了我们想要的回调函数了。
为获取解密密码而发送的请求的触发器列表
首先这段代码的头上写着,感觉非常像一个回调函数,然后在第二个红线框内明晃晃地写着这样的字样。在这一行加上一个断点,然后刷新一下网页,看看这个名为的函数定义是啥。
点击触发器得到的回调函数代码
虽然不太明白为什么设置的断点跳转到了另一个文件当中,但左右是可以看到这个函数的定义了,我们把鼠标滑到那个 上点一下就可以跳转到它的定义了,具体代码见下一张图(直接跳转过去的时候没有直接显示下面这个函数的定义,可以通过Ctrl+F定位一下)。
看注释也知道它在干一件啥样的工作了
剩下的工作就是把这一段Javascript代码用python改写一下就可以了。
明白了百度指数是如何获取、解密后,还差一点辅助工作才能够正式开始爬虫。
首先,百度指数只有在登录状态下才能够获取数据,那我们必须拿一个可用的cookie,经过试验证明,我们只要拿到cookie中键名为的值就可以了,大家通过F12打开开发者工具,然后在应用程序选项卡-->cookie侧边栏中找到这个值就行了。
然后,前文演示用的例子只是查找30天以内的全国范围内的百度指数,我们要查找的应当是某个区域某一个时间段以内的百度指数。可以先在网页上设置好相应的检索条件,然后再打开开发者工具查看设置好这些条件以后发送的请求参数:
查找2011年1月1日到2011年12月31日澳门关于炸鸡的百度指数
不难发现,其实就是多了startDate和endDate两个参数而已。
当有了前面这些知识以后,我们可以很轻松地写出一个获取百度指数的爬虫,我将我写好的代码放在了我的Gitee仓库当中,感兴趣的老铁可以自行取阅。源代码当中写了比较多的注释,有一定python基础的同学应该能比较轻松地看懂。下面主要是介绍一下我这段源代码的使用方法。