在很多網(wǎng)站應(yīng)用程序中,為了防止爬蟲或惡意數(shù)據(jù)收集行為的發(fā)生,都加入了驗證碼這一防范機制。有的是靜態(tài)驗證碼,有的是動態(tài)驗證碼,有的是純數(shù)字驗證碼,有的是數(shù)字字符混合驗證碼,有的是滑動驗證碼。簡直是五花八門的存在。
當然了,正所謂,道高一尺魔高一丈,一系列驗證碼破解項目誕生了,當然大多數(shù)的驗證碼破解項目都是圖像數(shù)據(jù)處理技術(shù)與機器學習或者是深度學習相結(jié)合形成的,我們今天先不去扯那么遠了,想要做一個驗證碼識別的項目首先就是要獲取到待識別的驗證碼數(shù)據(jù),今天就是先來進行數(shù)據(jù)的獲取。
本文的目標站點選擇了我們都很熟悉的騰訊QQ登陸的驗證碼數(shù)據(jù),獲取方式很簡單,具體實現(xiàn)如下:
#!usr/bin/env python #encoding:utf-8 from __future__ import division ''' __Author__:沂水寒城 功能: 網(wǎng)絡(luò)驗證碼數(shù)據(jù)采集模塊 ''' import os import sys import time import json import random import urllib2 import datetime import requests import pandas as pd from PIL import Image from selenium import webdriver from multiprocessing import Process from fake_useragent import UserAgent reload(sys) ('utf-8') ip_list=j(open('valid_i;)) #代理IP池 def generateRandomUA(num=100): ''' 生成隨機的 User-Agent 字符串(使用第三方海量ua庫) ''' agent_list=[] user_agent=UserAgent() for i in range(num): one_agent=u agen(one_agent) return agent_list def getPageHtml(url,header,proxy,num_retries=3): ''' 多代理形式、超時重試機制,獲取數(shù)據(jù) ''' try: response=reque(url,headers=header,proxies=proxy,timeout=5) return response except Exception,e: (3,8)) while num_retries: num_retries-=1 print('Left tring number is: ', num_retries) return getPageHtml(url,header,proxy,num_retries) def getVCPics(img_url,start,end,saveDir): ''' 下載驗證碼數(shù)據(jù) ''' if not os.(saveDir): os.makedirs(saveDir) for i in range(start,end): print("Downloading",i+1,"......") header,proxy=buildProxy() try: img=getPageHtml(img_url,header,proxy,num_retries=3) pic_name=saveDir+str(i+1)+'.jpg' file_pic=open(pic_name,'ab') ) () (1,4)) except: pass if __name__ == '__main__': print('captchaDataCollection!!!') url="http://captcha.qq.com/getimage?aid=1007901&r=0.38687027756482356" #驗證碼數(shù)據(jù)采集 getVCPics(url,0,200,'QQ/')上述代碼中,我們加入了高可用IP代理措施,來避免由于頻繁爬取造成的IP被封或者限制的問題,具體的IP代理數(shù)據(jù)我已經(jīng)在之前的文章中提及,也上傳到了我的資源目錄里面,需要的話可以直接拿去使用,效用還是可以的。
getPageHtml(url,header,proxy,num_retries=3)是我們用于采集驗證碼數(shù)據(jù)集,考慮到可能出現(xiàn)的IP失效或者是網(wǎng)絡(luò)請求出錯等其他的問題設(shè)置的頁面超時重傳機制,num_retries表示的是默認的超時重傳次數(shù),比如:這里在第一次數(shù)據(jù)請求失敗后會休眠隨機的時間之后,重新進行請求,直到嘗試到最大的重傳次數(shù)才放棄當次的數(shù)據(jù)獲取工作。這也算是網(wǎng)絡(luò)數(shù)據(jù)采集中的一點容錯機制吧,畢竟不是每一次網(wǎng)絡(luò)請求都是正常進行的,總會有一些意外的問題產(chǎn)生,這也是以往數(shù)據(jù)采集過程中遇上的問題,所以就在這里加入了這樣的容錯機制。
我們暫時獲取了200張圖像數(shù)據(jù),我在每次獲取后都加入了一個隨機休眠時間,做人要厚道不是嘛,別把人家網(wǎng)站搞得太累了呀是不是。數(shù)據(jù)的下載還是很快的,每一個驗證碼數(shù)據(jù)的下載本質(zhì)上就是執(zhí)行了一次get操作,然后將網(wǎng)站的響應(yīng)結(jié)果保存本地就行了,速度還是很快的,但是不要為了過快的速度去設(shè)置很小的時間間隔,這樣對人家網(wǎng)站正常的負載影響還是會挺大的,畢竟只是為了練習技術(shù)的,沒必要不太道德。此外,本文只是出于研究的目的來進行的實驗工作,不要用于其他的用途,造成不必要的麻煩,幾百張的數(shù)據(jù)量對于我們簡單的研究和分析來說肯定是足夠了,如果后面需要做深度學習模型來進行驗證碼的識別的話就需要考慮使用小批量數(shù)據(jù)來進行數(shù)據(jù)增強處理,而不是一味地盲目去大批量進行數(shù)據(jù)采集。
程序運行輸出截圖如下:
采集到的圖像數(shù)據(jù)截圖如下:
從上面的結(jié)果整體來看:基于QQ驗證碼數(shù)據(jù)的完全識別難度還是比較大的。首先:這里原始字符數(shù)據(jù)的傾向、形變、疊壓程度還是比較大的,而且驗證碼都是RGB圖像,且還是空心圖像,這樣經(jīng)過灰度化處理之后就連人都不好去識別了,畢竟驗證碼的本質(zhì)目的就是【讓人很容易識別出來,讓機器很難識別出來】,可以說:QQ驗證碼很好地實現(xiàn)了這個目標。其次,原始圖像數(shù)據(jù)中不同字符的位置,間距極不規(guī)律,在一般的驗證碼識別工作中,往往要對原始的驗證碼數(shù)據(jù)進行切割處理,最終的識別是基于單個字符進行的,但是由于位置、傾斜、間距等因素的存在,導致了字符切割難度的增大,這些都給驗證碼的識別工作帶來的影響。
不過,驗證碼識別不是今天本文的研究內(nèi)容,之后有時間的話再去看看怎么才能更好地識別出來驗證碼數(shù)據(jù)吧,今天的實踐內(nèi)筒到這里就先暫時告一段落了!記錄一下!
1.《qq手機號登錄驗證碼怎么辦看這里!python實現(xiàn)QQ登陸驗證碼數(shù)據(jù)采集》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識,僅代表作者本人觀點,與本網(wǎng)站無關(guān),侵刪請聯(lián)系頁腳下方聯(lián)系方式。
2.《qq手機號登錄驗證碼怎么辦看這里!python實現(xiàn)QQ登陸驗證碼數(shù)據(jù)采集》僅供讀者參考,本網(wǎng)站未對該內(nèi)容進行證實,對其原創(chuàng)性、真實性、完整性、及時性不作任何保證。
3.文章轉(zhuǎn)載時請保留本站內(nèi)容來源地址,http://f99ss.com/gl/2986064.html