Python爬取百度指数中的搜索指数

本文是在实际需要中使用爬虫获取数据,然后进行对应的数据分析,仅是学习用途,特此记录。

1.环境:Python3.7+PyCharm 1.1 所需要的库:datetime,requests,execjs(非必须)

1.2 为了更好的查看json数据,建议在chrome中安装JSONView插件(https://github.com/gildas-lormeau/JSONView-for-Chrome)

2.百度指数中的数据获取难点: 2.1 百度指数的URL请求地址返回的数据,并不是可以直接进行json解析使用的数据,而是加密之后的数据和uniqid,需要通过uniqid再次请求对应的地址(后面部分介绍)获取到解密的密钥,然后在前端页面进行解密,然后再渲染到折线图中。

2.2 必须要在百度指数页面登录百度账号,由于时间关系,本次数据爬取都是在登录之后进行的操作。

2.3 需要将前端解密代码转化为Python代码,获取直接使用前端代码也可以。

2.3.1 不转换像下面这样使用也可以解密,直接利用execjs直接JavaScript代码即可。

# Python的强大之处就在于,拥有很强大的第三方库,可以直接执行js代码,即对解密算法不熟悉,无法转换为Python代码时,直接执行js代码即可
    js = execjs.compile('''
            function decryption(t, e){
                for(var a=t.split(""),i=e.split(""),n={},s=[],o=0;o<a.length/2;o++)
                    n[a[o]]=a[a.length/2+o]
                for(var r=0;r<e.length;r++)
                    s.push(n[i[r]])
                return s.join("")
            }
    ''')
    res = js.call('decryption', key, source)  # 调用此方式解密,需要打开上面的注解

2.3.2 前端JavaScript代码对应的Python代码

2.4 获取自己登陆之后的Cookie(必须要有,否则无法获取到数据),具体的Cookie获取如下图,请注意看我下图标红的地方。

3.爬取数据的步骤 3.1 构建请求头,爬虫必须,请求头直接全部复制2.4中的请求头即可。

其中,汉字和部分符号被替换,只需找到对应的汉字部分即可,%22是",所以,哪里是汉字,对比浏览器的地址栏就晓得了吧,url最后的days=30,代表获取一个月的数据,从当前日期的前一天往前推一个月,可以根据需要修改days获取更多的数据或者更少的数据。在浏览器中输入dataUrl中的内容,可以得到以下数据

经过对all,pc,wise对应的数据进行解密,和搜索指数的折线图显示的数据对比,发现all部分的数据就是搜索指数的数据。本次请求返回的数据就在这里了,可以看到uniqid,而且每次刷新加密的数据和uniqid都会变。

3.2.2 获取密钥的url

经过多次分析,发现请求数据的url下面的uniqid出现在了下面这个url中

因此需要先对请求数据对应的url进行数据获取,解析出搜索指数对应的加密数据和uniqid,然后拼接url获取密钥,最后调用解密方法解密即可获取到搜索指数的数据。

3.2.3 找到了对应的url,我们的爬虫也就完成了,接下来就是发送请求,解析数据,然后对数据进行解密即可。

4.完整代码

5.总结 总的来说,本次爬虫大体完成,在代码的编写之余,查阅了解密算法的Python实现,还查看了对日期的操作博客,所有的博客地址如下:

感谢各位大牛的博客,因为有了你们我才能完成这篇博客,本文只为记录我在实际中遇到的问题和解决的方法,如有不足还请见谅,若有更好的解决方式,可以评论出来大家一起参考。

自己使用抓取指数程序

  • baidu.py

  • _env.py

_

  • 关键词放在: 关键词.txt

百度首页搜索关键词获取URL

Last updated