抓取百度指数引发的图像数字识别
作者介绍:
叶成,数据分析师,就职于易居中国,热爱数据分析和挖掘工作,擅长使用Python倒腾数据。
前言
学习爬虫也有段时间了,闲着无趣,想找点项目练练手,于是乎通过顺祥老师介绍,接到了一个关于百度指数的爬虫需求。(百度指数可以反映一个词在一段时间内的搜索热度,不知道百度指数的同学们可以自行百度)。好的,话不多说,开始我们的项目。
百度指数页面
输入查询的关键字
嗯?跳转到了登陆界面!(赶紧拿出小本本记下,这里需要登陆)。
登陆后的展现
心中窃喜,脑子里满是抓包分析,模拟请求,获取指数,gameover!!!然而事实并没那么简单,根据爬虫的套路,需要查看属性(在上图中右键检查,找到文件):
正常来说这里的json文件中应该就有我们需要的文本内容,然而打开后发现它是一张图片,而且还是一张拼图,如下图所示:
并且这个图片链接包含了三个参数,如下图所示(黄色标出):
看得脑壳都大了,先不说怎么分析加密参数,就算是破解了拿到图片链接,也无法直接取出需要的数字,因为还需要进行图像识别…沉思中…没办法,打算曲线救国,我们直接模拟鼠标移动,然后截取悬浮的黑框图片,再进行图像识别,得到百度指数。新的思路就是这样,开搞。具体步骤如下:
模拟登陆
我们使用selenium驱动谷歌浏览器,定位到输入框,清空并输入关键词,跳转登陆页面后在登陆百度指数。
构建截图区域
这当中的核心是ActionChains(browser).move_to_element_with_offset(xoyelement, x_0, 0).perform()。这个是用来确定鼠标的悬浮位置,我们先是通过css定位到xoyelement,然后通过offset(xoyelement, x_0, 0),确定偏移的位置,我们这里使x_0初始值为1,是因为发现为0时数值不出现。
下图中显示的是viewbox, 为了防止鼠标移动时没有viewbox的情况,我们通过判断样式是否为隐藏来确定viewbox是否出现。
要确保viewbox出现后才能进行屏幕截图。
Rangle的构建
我们想要的是这个图片中的数字,并不是整个屏幕的截图,所以需要我们构建rangle,把真正的数值从屏幕截图中抠出来:
先定位到viewbox位置,然后我们构建了一个关键字长度的公式,以及rangle的范围的公式,这当中绝大部分参考百度,感谢百度!通过上面的布置,可以把百度指数的图片给下载下来,接下来的工作就是从这些图片中进行数字的识别。
图片数字识别
这里的主要思想是:先将图片放大一倍从而提高识别率,然后用pytesseract这个模块进行识别,因为我们截取的数字在图片中十分‘干净’,无需做什么处理,很开心,只需对识别结果中的 ’,’ 或者是 ’.’ 去除即可。
结语
- python获取日期和判断字符串
- python处理get请求和post请求
- OVN实战二之Overlay实现
- SQLI-LABS 更新帖(一)
- 众测备忘手册
- 我博客上的围棋js程序
- Laravel 开发 RESTful API 的一些心得
- Hive使用十六进制分隔符异常分析
- 智能家居系统结构
- 一个简单的完全信息动态博弈的解答
- Struts2远程代码执行漏洞S2-052 复现&防御方案
- CENTOS6.5安装CDH5.12.1(二)
- @ControllerAdvice + @ExceptionHandler 处理 全部Controller层异常
- 动态增加表单元素并获取元素的text和value提交
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- flink实战-实时计算平台通过api停止流任务
- JAVA初级岗面试知识点——基础篇
- flink实战-flink streaming sql 初体验
- flink实战教程-使用set实时计算当天网站uv
- 贪心-HDU3348 coins(钱币问题)
- 归并排序详解 -HDU4911 Inversion(逆序对)
- 数据结构与算法——稀疏数组
- Maven安装配置详细教程
- 数据结构与算法——冒泡排序
- MyBatis Generator逆向工程-你还在手写mapper吗?
- JSR303后端校验详解
- SSM整合开发实战 SSM-MALL
- SQL Server获取元数据所有方法和示例
- 数据结构与算法——选择排序
- SmtpJS发送邮件教程