1. 程式人生 > >爬蟲驗證碼解決思路 Python爬蟲四種驗證碼的解決思路

爬蟲驗證碼解決思路 Python爬蟲四種驗證碼的解決思路

參考崔慶才python網路爬蟲開發實戰

Python爬蟲四種驗證碼的解決思路

2018年06月07日 10:17:13 閱讀數:5584

1.輸入式驗證碼


這種驗證碼主要是通過使用者輸入圖片中的字母、數字、漢字等進行驗證。如下圖

 

圖1                           圖2

解決思路:這種是最簡單的一種,只要識別出裡面的內容,然後填入到輸入框中即可。這種識別技術叫OCR,這裡我們推薦使用Python的第三方庫,tesserocr。對於沒有什麼背影影響的驗證碼如圖2,直接通過這個庫來識別就可以。但是對於有嘈雜的背景的驗證碼這種,直接識別識別率會很低,遇到這種我們就得需要先處理一下圖片,先對圖片進行灰度化,然後再進行二值化,再去識別,這樣識別率會大大提高。

2.滑動式驗證碼

這種是將備選碎片直線滑動到正確的位置,如下圖


解決思路:對於這種驗證碼就比較複雜一點,但也是有相應的辦法。我們直接想到的就是模擬人去拖動驗證碼的行為,點選按鈕,然後看到了缺口  的位置,最後把拼圖拖到缺口位置處完成驗證。

第一步:點選按鈕。然後我們發現,在你沒有點選按鈕的時候那個缺口和拼圖是沒有出現的,點選後才出現,這為我們找到缺口的位置提供了靈感。

第二步:拖到缺口位置。我們知道拼圖應該拖到缺口處,但是這個距離如果用數值來表示?通過我們第一步觀察到的現象,我們可以找到缺口的位置。這裡我們可以比較兩張圖的畫素,設定一個基準值,如果某個位置的差值超過了基準值,那我們就找到了這兩張圖片不一樣的位置,當然我們是從那塊拼圖的右側開始並且從左到右,找到第一個不一樣的位置時就結束,這是的位置應該是缺口的left,所以我們使用selenium拖到這個位置即可。這裡還有個疑問就是如何能自動的儲存這兩張圖?這裡我們可以先找到這個標籤,然後獲取它的location和size,然後 top,bottom,left,right = location['y'] ,location['y']+size['height']+ location['x'] + size['width']  ,然後截圖,最後摳圖填入這四個位置就行。具體的使用可以檢視selenium文件,點選按鈕前摳張圖,點選後再摳張圖。最後拖動的時候要需要模擬人的行為,先加速然後減速。因為這種驗證碼有行為特徵檢測,人是不可能做到一直勻速的,否則它就判定為是機器在拖動,這樣就無法通過驗證了。


3.點選式的圖文驗證 和  圖示選擇

圖文驗證:通過文字提醒使用者點選圖中相同字的位置進行驗證。

圖示選擇: 給出一組圖片,按要求點選其中一張或者多張。借用萬物識別的難度阻擋機器。

這兩種原理相似,只不過是一個是給出文字,點選圖片中的文字,一個是給出圖片,點出內容相同的圖片。

這兩種沒有特別好的方法,只能藉助第三方識別介面來識別出相同的內容,推薦一個超級鷹,把驗證碼發過去,會返回相應的點選座標。

然後再使用selenium模擬點選即可。具體怎麼獲取圖片和上面方法一樣。


4.宮格驗證碼

這種就很棘手,每一次出現的都不一樣,但是也會出現一樣的。而且拖動順序都不一樣。

但是我們發現不一樣的驗證碼個數是有限的,這裡採用模版匹配的方法。我覺得就好像暴力列舉,把所有出現的驗證碼儲存下來,然後挑出不一樣的驗證碼,按照拖動順序命名,我們從左到右上下到下,設為1,2,3,4。上圖的滑動順序為4,3,2,1所以我們命名4_3_2_1.png,這裡得手動搞。當驗證碼出現的時候,用我們儲存的圖片一一列舉,與出現這種比較畫素,方法見上面。如果匹配上了,拖動順序就為4,3,2,1。然後使用selenium模擬即可。


參考資料:

Python3網路爬蟲開發實戰教程

				<script>
					(function(){
						function setArticleH(btnReadmore,posi){
							var winH = $(window).height();
							var articleBox = $("div.article_content");
							var artH = articleBox.height();
							if(artH > winH*posi){
								articleBox.css({
									'height':winH*posi+'px',
									'overflow':'hidden'
								})
								btnReadmore.click(function(){
									articleBox.removeAttr("style");
									$(this).parent().remove();
								})
							}else{
								btnReadmore.parent().remove();
							}
						}
						var btnReadmore = $("#btn-readmore");
						if(btnReadmore.length>0){
							if(currentUserName){
								setArticleH(btnReadmore,3);
							}else{
								setArticleH(btnReadmore,1.2);
							}
						}
					})()
				</script>
				</article>

1.輸入式驗證碼


這種驗證碼主要是通過使用者輸入圖片中的字母、數字、漢字等進行驗證。如下圖

 

圖1                           圖2

解決思路:這種是最簡單的一種,只要識別出裡面的內容,然後填入到輸入框中即可。這種識別技術叫OCR,這裡我們推薦使用Python的第三方庫,tesserocr。對於沒有什麼背影影響的驗證碼如圖2,直接通過這個庫來識別就可以。但是對於有嘈雜的背景的驗證碼這種,直接識別識別率會很低,遇到這種我們就得需要先處理一下圖片,先對圖片進行灰度化,然後再進行二值化,再去識別,這樣識別率會大大提高。

2.滑動式驗證碼

這種是將備選碎片直線滑動到正確的位置,如下圖


解決思路:對於這種驗證碼就比較複雜一點,但也是有相應的辦法。我們直接想到的就是模擬人去拖動驗證碼的行為,點選按鈕,然後看到了缺口  的位置,最後把拼圖拖到缺口位置處完成驗證。

第一步:點選按鈕。然後我們發現,在你沒有點選按鈕的時候那個缺口和拼圖是沒有出現的,點選後才出現,這為我們找到缺口的位置提供了靈感。

第二步:拖到缺口位置。我們知道拼圖應該拖到缺口處,但是這個距離如果用數值來表示?通過我們第一步觀察到的現象,我們可以找到缺口的位置。這裡我們可以比較兩張圖的畫素,設定一個基準值,如果某個位置的差值超過了基準值,那我們就找到了這兩張圖片不一樣的位置,當然我們是從那塊拼圖的右側開始並且從左到右,找到第一個不一樣的位置時就結束,這是的位置應該是缺口的left,所以我們使用selenium拖到這個位置即可。這裡還有個疑問就是如何能自動的儲存這兩張圖?這裡我們可以先找到這個標籤,然後獲取它的location和size,然後 top,bottom,left,right = location['y'] ,location['y']+size['height']+ location['x'] + size['width']  ,然後截圖,最後摳圖填入這四個位置就行。具體的使用可以檢視selenium文件,點選按鈕前摳張圖,點選後再摳張圖。最後拖動的時候要需要模擬人的行為,先加速然後減速。因為這種驗證碼有行為特徵檢測,人是不可能做到一直勻速的,否則它就判定為是機器在拖動,這樣就無法通過驗證了。


3.點選式的圖文驗證 和  圖示選擇

圖文驗證:通過文字提醒使用者點選圖中相同字的位置進行驗證。

圖示選擇: 給出一組圖片,按要求點選其中一張或者多張。借用萬物識別的難度阻擋機器。

這兩種原理相似,只不過是一個是給出文字,點選圖片中的文字,一個是給出圖片,點出內容相同的圖片。

這兩種沒有特別好的方法,只能藉助第三方識別介面來識別出相同的內容,推薦一個超級鷹,把驗證碼發過去,會返回相應的點選座標。

然後再使用selenium模擬點選即可。具體怎麼獲取圖片和上面方法一樣。


4.宮格驗證碼

這種就很棘手,每一次出現的都不一樣,但是也會出現一樣的。而且拖動順序都不一樣。

但是我們發現不一樣的驗證碼個數是有限的,這裡採用模版匹配的方法。我覺得就好像暴力列舉,把所有出現的驗證碼儲存下來,然後挑出不一樣的驗證碼,按照拖動順序命名,我們從左到右上下到下,設為1,2,3,4。上圖的滑動順序為4,3,2,1所以我們命名4_3_2_1.png,這裡得手動搞。當驗證碼出現的時候,用我們儲存的圖片一一列舉,與出現這種比較畫素,方法見上面。如果匹配上了,拖動順序就為4,3,2,1。然後使用selenium模擬即可。


參考資料:

Python3網路爬蟲開發實戰教程