实战录 | 爬虫的坎坷之路-数字验证码识别
Posted 云端卫士
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实战录 | 爬虫的坎坷之路-数字验证码识别相关的知识,希望对你有一定的参考价值。
《实战录》导语
云端卫士的新栏目《实战录》将会定期分享一些我们的工程师伙伴们在产品研发的过程中总结的实践经验,希望对于热爱技术且关注安全领域的受众有所裨益。本期分享人为云端卫士平台运营安全工程师李博玉。
何谓爬虫?
爬虫就是通过程序自动化的从网络中抓取各种网页或者其他你想要的信息。
爬虫和欲爬的网站就好比矛和盾,所以编写爬虫时我们会遇到各种问题,包括欲爬网站的反爬虫技术,验证码识别等。
今天云端卫士平台运营安全工程师李博玉将会简单介绍一下爬虫中数字验证码识别的问题。
要想实现验证码识别我们需要简单了解学习研究图像匹配识别的基本原理原理,识别基本分四步:图片预处理、分割、训练和识别。
我们如何识别如下图片呢?
去除验证码图片背景的干扰元素, 这里用到的主要是二值化方法,即将图片转换成只有黑白两色的图片。通常做法是确定一个阀值,如果图片上的像素大于阀值为白色,否则为黑色。
/**
* 验证码预处理:去掉背景干扰
* @throws Exception
*/
public static BufferedImage removeBackgroud(String picFile)
throws Exception {
BufferedImage img = ImageIO.read(new File(picFile));
int width = img.getWidth();
int height = img.getHeight();
for (int x = 0; x < width; ++x) {
for (int y = 0; y < height; ++y) {
if (isWhite(img.getRGB(x, y)) == 1) {
img.setRGB(x, y, Color.WHITE.getRGB());
} else {
img.setRGB(x, y, Color.BLACK.getRGB());
}
}
}
return img;
}
/**
* 判断像素值是否为背景干扰色(包括白色+干扰色)
* @param colorInt
* @return
*/
public static int isWhite(int colorInt) {
Color color = new Color(colorInt);
if (color.getRed() + color.getGreen() + color.getBlue() >= 450) {
return 1;
}
return 0;
}
处理完图片效果为:
因为图片的位置是固定的,所以处理起来就相对简单了很多,直接截取相应位置即可。
/**
*分割图片中的数字
*/
public static List<BufferedImage> splitImage(BufferedImage img)
throws Exception {
List<BufferedImage> subImgs = new ArrayList<BufferedImage>();
subImgs.add(img.getSubimage(7, 5, 8, 11));
subImgs.add(img.getSubimage(20, 5, 8, 11));
subImgs.add(img.getSubimage(33, 5, 8, 11));
subImgs.add(img.getSubimage(46, 5, 8, 11));
return subImgs;
}
直接拿几张图片,包含0-9,每个数字一个样本就可以了,将文件名对应相应的数字。
由于图片中的数字是固定大小,固定位置,所以识别也很简单。直接拿分割的图片跟这个十个标准图片一个像素一个像素的比,相同的点最多的就是结果。比如如果跟2.jpg最相似,那么识别的结果就是2。经本人测试,识别准确率基本为100%,如下图所示。
长按二维码,关注“云端卫士官方微信”!
关注企业网络安全!
以上是关于实战录 | 爬虫的坎坷之路-数字验证码识别的主要内容,如果未能解决你的问题,请参考以下文章