爬虫——百度指数

蛮早之前公司有个产品问我能不能爬百度指数,我随便瞄了眼,直接回了可以,然后...光速打脸...今儿个有空,研究研究这玩意儿。嫌长的可以直接拉到最后看后记。

目标

先明确下要做什么,目标不是要写出一个可用的完整的爬虫,只是要个思路。

image.png

我们的目标仅仅只是爬取这边的数字,162和125,还有后边的比例。

分析

先说点题外话,业界对数字的加密真是做的丧心病狂,返回假数据然后js重新计算修改都是简单的了,复杂的还有某移动端网页返回数字234,然而因为使用了特殊的字体显示123的,这边还有个更恶心的迷之加密。
开始分析,首先,展示出来的样子,不像是数字,像是分辨率不高的几张图片,让我们看看渲染完的html长啥样的。

爬虫——百度指数_第1张图片
image.png

确实很迷,显示出来好好的类似图片的数字,html里边(而且是渲染完的html)只有几个div和span,class里边倒有几个val,txt,重点怀疑下,要看看哪里用到。而且看上去分辨率很低的图片也还没有出现,而根据我有限的知识,html里边显示出来的图片除了img标签,也就css里的background。很明显,我们在右边找到了背景图,果然,看来问题马上就要解决了,下载下来看看。

爬虫——百度指数_第2张图片
image.png

???这是什么鬼???等等,621215,仅有的几个数字似乎有点熟悉,没错,就是上边那几个指数,看来我们已经找到了,感觉就是span里边的style控制显示的背景(还有这种操作??)。

先让我们验证下上面的猜测,方法很简单,换个关键词,找到那个关键词对应的背景图,拿过来替换到该关键词中,看看数字会不会变。

爬虫——百度指数_第3张图片
image.png

果然,数字变了,变成了几个不知道是什么的东西。应该是有什么地方可以控制显示背景图的第某个位置之类的方法。

继续瞎改html


爬虫——百度指数_第4张图片
image.png

如图,我把imgval 和imgtxt 的style进行了修改,原先的162变成了112,显然,是根据这个来控制显示的值的。这边有两个值,一个是imgval的width,另一个是imgtxt的margin-left。

继续找,这两个值是哪里来的呢?直觉告诉我是js算出来的,一定是某个js 根据一个key,再怎么加密解密(前端就喜欢搞这一套 = = )得到的,一定是。然鹅,当我打开network,竟然发现了这个

爬虫——百度指数_第5张图片
image.png

....... 直接去获取的啊....
其实到了这,我已经能抓取了。我们公司是有爬虫渲染的模块的,但是秉承着负责的态度,继续往下看,那这个url是谁发出的呢?

先放一个url
https://index.baidu.com/Interface/IndexShow/show/?res=XzQxJzIIAyRuCxU5CXgybx5THHx9LRE%2FJSZtHnteBHsBBBw%2BflgJJRokN25aQDZKd34gajodKkEWJFxQfDsWBB0WJzF8MnMtFAR%2BExY3VjkNYxooZBt0NEw6Lh5TVkZEAFwSCVEGCTA%2BOFRVJUUFSFgqRm0lYXYTfCJGVVFkOyZ2fzBVMgJnAW5FIhJTMQBAfSB%2BLm0xIAJFWyZILQQGPl8mE0MEIwc8YEtYHmMUOBYaHAQcb3wgXDd%2FVCEqLn0kNzVwDgNzH1krBBwiGioDAAofGwkvDRE%3D&res2=37ST6.341397.033YAYNLDflArlUE8fO8qIhKkWJnVeMVF4jxf0pBWJlMogXpnn7RTSXE37&classType=2&res3[]=z0&res3[]=Ee&className=profWagv

分析下长得很像的几个发出的url,很容易可以发现大部分字段都是一样的,估计是把keyword再和什么东西加密得到的,然后后边都是明文,所以我们只需要找到res和res2生成的方法就可以了。

过去了两个小时...

没想到啊,竟然卡在这了。
直接给结论吧...res和res2都在直接返回的html里边。
res是直接给的,直接搜PPval.ppt后面一长串就是了。

res.png

res2找了我好久,结果也是这里面。。
找到类似这样的东西

爬虫——百度指数_第6张图片
res2.png

图中的VWO就是了,需要自己写下这个js模拟算下,要注意的是,这几个字母是会变得!!每次都不一样!!

后记

行了,就这样了,比想象的麻烦多了,但回过头来看其实很简单。

  • 获取页面 类似这样https://index.baidu.com/?tpl=trend&type=0&area=0&time=13&word=%C3%C3%D7%D3%B0%C9 ,这边可能需要登录,我没做
  • 提取PPval.ppt记做res 用正则在上面获取到的html中抽出来就好了
  • 获取res2 res2需要跑一下这个html里边有个script,具体找的方式看上一段
  • 拼接 "https://index.baidu.com/Interface/IndexShow/show/?res={res}&res2={res2}&classType=2&res3[]=z0&res3[]=Ee&className=profWagv".format(res=res,res2=res2)
  • 获取数字 上面url返回的有两样东西,一个style,确定数字位置,一个是background。两者就能得到以图片显示的数字了,然后ocr识别一下分分钟就搞定了(说的简单)

你可能感兴趣的:(爬虫——百度指数)