您的位置:首页 > 理论基础 > 计算机网络

web数据采集核心技术分享系列(四)利用神经网络实现网页验证码破解

2016-07-29 17:03 961 查看



http://www.cnblogs.com/keven1006/archive/2012/08/10/2631336.html

目录:
web数据采集核心技术分享系列(一)做一个强大的web数据采集系统,你需要什么?
web数据采集核心技术分享系列(二)如何提取信息?字符串?正则?xpath?xslt?自定义?...什么才是王道?
web数据采集核心技术分享系列(三)如何破解验证码?图像分析?特征匹配?人工智能?第三方集成?...哪个最强大?  
web数据采集核心技术分享系列(四)利用神经网络实现网页验证码破解 
 
应各位热心看客的要求建了个QQ群:254764602,欢迎大家加群一起讨论,互相学习进步。
加群请输入暗号“数据采集”,否则不加
 
写了上篇验证码破解的文章后,有朋友在群里表示希望看到更深入的应用,所以今天就跟他家一起讨论一下如何利用神经网络来破解验证码,如果看了上篇的朋友应该都清楚,网页验证码破解有一个通用的过程,但是其中有两个难点,第一是图像处理,第二是特征匹配,如果对这点还有不清楚,请先看上篇。
 
好了,回到今天主题,神经网络是人工智能的一个分支,原理上是利用模仿人脑神经元的结构和工作方式来实现逻辑处理,如果你不懂神经网络,可能需要事先查找一些文章,这样就会更好理解本文, 对于神经网络,有几个关键点,大家必须清楚:
1.神经元的结构,这里给个图
 


它是由具有很多枝状突起(称为树突(dendrite))的细胞体和单个分支(称为轴突(axon))组成的。树突可以接收来自其他神经元的信号。对于程序来说相当于输入,当这些树突接收脉冲的混合结果超过某个阈值后,神经元便会激发,从而产生一个脉冲(或者尖峰)传向轴突。轴突末端的分支形成了与其他神经元相连的突触(synapse)。相当于程序中的输出,突触是神经元彼此之间的联系点;突触可以分为激妇型(excitatory)和抑制型(inhibitory),对应于把到达的脉冲加入到总信号中或是从总信号中减去这个脉冲,神经网络就是很多神经元组成的网络
2.神经网络结构,真正地神经网络由非常多的神经元组成,我们为了便于理解,看一个很简单的神经网络


 
这个图中输入层,中间层,输出层,给定一系列数据数据,加载到输入层,然后经过中间层的运算,会在数据层得到数据结果,对于如何编程实现一个神经网络,超出了本文的范围,网上有一些开源的类库,感兴趣的同学可以去研究其源码,本文以 BrainNet.NeuralFramework 这个库为例,重点将如何利用神经网络来破解网页验证码。
 
我将尝试用最贴近程序员而不是神经网络科研人员的方式来解释一些应用话题,在了解了神经网络之后呢,大家应该都明白了,神经网络能做的就相当于一个函数,接受一组数据作为输入,输出一组数据作为输出,看来他能帮我们的事情很少,图像处理应该帮不了,那么特征匹配呢,我们来分析一下,当我们对一个验证码进行图像处理之后(参考上篇)我们得到了一个图像数组,每个图像代表一个字符,一般来说大小固定,或者我们可以进行缩放以做到大小固定,这里假设一个16*16的黑白图片,黑色为字符,白色为背景,那么这个图像中的每个点,都可以用0,或1来表示,假设1代表黑色点,0代表白色点,那么我们就把这个图像可以处理为一个0和1组成的串,这个串有多少位,我们就需要多少个神经元在输入端,即输入层,每个单元接受一个0,或者1作为输入参数,在输出端,假设我们认为所有的都是数字,那么输出只能为0-9,即可以用0001-1001这样的二进制来表示输出,看到这里大家都明白了,我们需要4个单元在输出端,中间我们暂且不考虑。那么我们在输出端每个单元上得到一个0或者1,组合起来就得到一个0-9的数字,这就完成了一个字符图像到字符的特征匹配过程。是不是很简单呢?呵呵
 
该看代码了,不过还有一件事情要说明,神经网络不是天生就认得数字,就跟人不是生下来就认得数字一样,它具备对一组输入抓换为一组输出的能力而已,所以我们需要像教小孩认数字一样教他,这个过程就是训练,一般的特征匹配都是建立在事先训练的基础上的,那么训练对于程序来说是神马呢?说白了,就是告诉他,这个输入组合对应到那个输出组合的一个对应关系,这样,你给他同样的输入或者相似的输入的时候,他就会给出同样的或者近似的输出。
 
边看代码边讲解
 

BackPropNetworkFactory factory = new BackPropNetworkFactory();

                ArrayList layers = new ArrayList();

                layers.Add(256);

                layers.Add(256);

                layers.Add(4);

                network = factory.CreateNetwork(layers);

                NetworkSerializer serializer = new NetworkSerializer();

                serializer.LoadNetwork(path, ref network); 
 
我们看到这个神经网络有256个单位在输入层,256在中间层,4个在输出层,正好跟我之前说的一样,可以识别0-9的数字。
 
  INeuralNetwork network = BrazilNeuralNet.GetInstance();

            ImageProcessingHelper imgHelper = new ImageProcessingHelper();

            ArrayList inputArray = imgHelper.ArrayListFromImage(input as Image);

            ArrayList outputArray = network.RunNetwork(inputArray);

            PatternProcessingHelper patternHelper = new PatternProcessingHelper();

            long number = patternHelper.NumberFromArraylist(outputArray);

            return Convert.ToInt32(number).ToString();

 这个代码完全就是前面思路的实现,应该很容易理解,这个返回值就是我们要的验证码字符,呵呵,是不是好像也不难,那你就赶紧自己试试吧,对了,新建的qq群里面貌似有高手比我厉害多的,大家赶紧加群,听他讲讲更高级的图像处理和神经网络算法吧。
 

神经网络在网页数据验证码破解的应用先讲到这里,回头根据大家的反馈我再写下一篇,欢迎大家交流

 

 本系列 web数据采集核心技术分享注重分享思路,所有的代码都是为了配合思路的讲解,想要关注如何搭建一个完整的采集系统的童鞋稍安勿躁,后续会关注这个话题,不想关注思路,只想复制代码,F5运行,点鼠标进行数据抓取的童鞋请理解。

 
PS: 因本人能力有限,虽在web数据采集领域奋战多年,却也不可能在web数据采集的各个方面都提供最牛逼的解决方案和思路,还请各位看官本着互相交流学习,一起进步成长的态度来批评指正,欢迎留言。   

 
 

分类: web数据采集和数据挖掘
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: