作者介绍:
叶成,数据分析师,就职于易居中国,热爱数据分析和挖掘工作,擅长使用Python倒腾数据。
在开始本位之前,这里先感谢一下本人公司的伟哥和孟哥(虽然孟哥也没帮上啥忙,但是以后有的是机会,哈哈)。
上次发了篇运用selenium自动截取百度指数并识别的文章,点这里《抓取百度指数引发的图像数字识别》,其实感觉也是有些投机取巧的意思在里面,而且正如大家所知,用selenium比较吃内存,而且因为要渲染网页,爬去效率也比较低。所以这次我们直接请求图片,通过抠图、拼接、再识别的方式来完成这个百度指数爬虫项目。
使用到的Python第三方包:
百度指数如下图所示,需要登录!
和之前一样,爬取百度指数,第一个要面对的问题便是登陆问题,随手百度了一下,关于百度登陆的文章还是不少的,不过说句实话,小编太菜,弄个fiddler抓包,chrome浏览器总是报错,折腾了半天,对于那个rsa加密什么的也是一头雾水,算了,与其复制黏贴,不如以后咱再话时间慢慢弄个明白,这次我们还是用selenium登陆获取cookie。
成功登陆并获取cookie后,我们来分析下需要请求的图片:
每次移动都会加载出这些文件,我们选一个看看:
我们格式化一下这个json文件,可以看出他是一串css样式,图片url也在里面:
我们把url拿出来,下载图片看看,(这是我随便找的一条,不是的上面链接)
没错!你没看错!我们请求的图片就是长这样,怎么还原成前端渲染后的图片,咱们稍后讲,先看看怎么获取图片。
我们看到这里有6个参数,其中classType、className都是不变的,其他4个参数都是变化的,先看最下面这个参数,是一个时间戳,这个好办。剩下res、res2、res3,我寻寻觅觅找到了res3,它藏在这个文件中:
这个userIndexes_enc便是我们请求页面中所有图片的res3参数,所以我们请求图片前要先获取这个文件中的res3,那么我们看下这个文件:
这里同样需要res、res2,头疼!!!各位观众老爷,我对不住你们,我翻看了网页上很多js脚本,没能破解出这个res、res2,这里先当我欠你们的,以后一定还,好不好。既然不能还原它们的生成方式,也不能阻止我的前进,那我们就先拿现成的好了,于是乎我:
还是通过selenium执行js脚本后,拿到res、res2,这两个日期参数就不用多说了,好了请求图片网址的所有参数我们都拿到了,直接开始构建请求吧!
我们先拿到json文件后我们取出了其中需要的res3参数放进列表,接下来我们需要拿着res3再去请求图片网址:
取出网址还不行,我们还要把原图还原成前端渲染后的样子:即从下图
变成下图
所以我们将css样式中的width 和margin_left全部都拿下来,方便等会裁剪拼接图片:
咱们这里模拟他的渲染方式来裁剪图片,然后再将裁剪的图片拼接起来。这里随便找张图片看看:
裁剪
拼接
最后一部分就是图像识别了,和之前一样,我们还是使用pytesseract识别。
我们先把图像放大2倍,再识别,并对识别结果容易发生错误的部分进行了修正,一起来看看最后的结果图吧。
Ps:文明爬虫(为了不给网站服务器造成太大压力,大家请求时请放点慢速度)
好了,今天就到这里了,今天是12月31号,2017年的最后一天(对不住大家,小编推送晚了。。。),这篇文章就当做是自己将近半年来学习python的总结吧,还有很多不会的东西,还有很多想学的东西,只希望2018的自己,能够每天进步一点点,望大家共勉!
print (‘2017再见!’)
print (‘2018你好!’)
谨遵原作者的意思,这里就不单独发放源代码了,敬请原谅。
本文来自企鹅号 - 每天进步一点点2015媒体
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文来自企鹅号 - 每天进步一点点2015媒体
如有侵权,请联系 cloudcommunity@tencent.com 删除。