目錄:
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的數字,這就完成了一個字符圖像到字符的特征匹配過程。是不是很簡單呢?呵呵
該看代碼了,不過還有一件事情要說明,神經網絡不是天生就認得數字,就跟人不是生下來就認得數字一樣,它具備對一組輸入抓換為一組輸出的能力而已,所以我們需要像教小孩認數字一樣教他,這個過程就是訓練,一般的特征匹配都是建立在事先訓練的基礎上的,那么訓練對於程序來說是神馬呢?說白了,就是告訴他,這個輸入組合對應到那個輸出組合的一個對應關系,這樣,你給他同樣的輸入或者相似的輸入的時候,他就會給出同樣的或者近似的輸出。
邊看代碼邊講解
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();
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數據采集的各個方面都提供最牛逼的解決方案和思路,還請各位看官本着互相交流學習,一起進步成長的態度來批評指正,歡迎留言。
