摘要:下面我們便來講種驗(yàn)證碼的識(shí)別方式和一些思路。哈哈庫其實(shí),驗(yàn)證碼識(shí)別歸根到底還是對各種各樣圖片的識(shí)別和操作,中有很對圖像處理的庫,其中就是其中之一。所以在處理驗(yàn)證碼識(shí)別之前,必須先了解庫和。第五步,按照規(guī)定軌跡進(jìn)行拖動(dòng),完成驗(yàn)證。
寫在前面
現(xiàn)在,很多網(wǎng)站采取各種各樣的措施來反爬蟲,其中之一就是使用驗(yàn)證碼。當(dāng)我們訪問網(wǎng)頁時(shí),必須先通過驗(yàn)證碼才能夠訪問頁面。下面我們便來講2種驗(yàn)證碼的識(shí)別方式和一些思路。當(dāng)然我們也可以直接使用付費(fèi)的打碼平臺(tái),那樣可以增加識(shí)別的準(zhǔn)確度,畢竟出了錢的嘛。哈哈!
PIL庫其實(shí),驗(yàn)證碼識(shí)別歸根到底還是對各種各樣圖片的識(shí)別和操作,python中有很對圖像處理的庫,其中PIL就是其中之一。 所以在處理驗(yàn)證碼識(shí)別之前,必須先了解PIL庫和tesserocr。 下面附上其API源碼地址,以及對應(yīng)的學(xué)習(xí)博客。
源碼地址:https://pillow-cn.readthedocs.io/zh_CN/latest/reference/index.html
參考博客:https://blog.csdn.net/louishao/article/details/69879981
下面我們就開始驗(yàn)證碼識(shí)別之路了。
以中國知網(wǎng)為例:
首先,我們先拿到上圖中綠線標(biāo)記的驗(yàn)證碼,下載到本地項(xiàng)目文件中,
然后,編寫如下代碼:
import tesserocr from PIL import Image image = Image.open("image.png") res = tesserocr.image_to_text(image) print(res) # F8BS
輸出結(jié)果為:F8BS, 可是實(shí)際圖片為F8B8,這是因?yàn)轵?yàn)證碼內(nèi)多余線條干擾了圖片的識(shí)別,像這類情況,還需要做出額外的處理,比如轉(zhuǎn)灰度,二值化等。當(dāng)然,實(shí)際處理中并不是這樣,一般我們會(huì)先對模糊圖片進(jìn)行灰度處理后,再設(shè)定二值化的閾值,實(shí)際處理如下:
import tesserocr from PIL import Image image = Image.open("code.jpg") # 創(chuàng)建image對象 image = image.convert("L") threshold = 150 # 指定二值化閾值 table = [] for i in range(256): if i < threshold: table.append(0) else: table.append(1) image = image.point(table, "1") image.show() res = tesserocr.image_to_text(image) print(res)
輸出結(jié)果:F8B8
進(jìn)行識(shí)別時(shí),先設(shè)定好二值化閾值threshold,進(jìn)行適當(dāng)調(diào)試,直到圖片能正常識(shí)別為止。
過程分析:
滑動(dòng)驗(yàn)證碼主要的驗(yàn)證方式是拖動(dòng)滑塊,拼合圖像;如圖象完全拼合,則驗(yàn)證成功,即表單提交成功,否則需要重新驗(yàn)證。
如圖:
下面,我們就以極驗(yàn)的驗(yàn)證碼為例,來講訴一下識(shí)別方法。
因?yàn)闃O驗(yàn)的驗(yàn)證碼在拖動(dòng)驗(yàn)證碼后會(huì)生成一個(gè)加密的表單提交到后臺(tái),所有為了避免麻煩我們直接用selenium模擬瀏覽器行為來完成驗(yàn)證。
登陸網(wǎng)站:極驗(yàn)官網(wǎng)
目標(biāo)站點(diǎn):https://account.geetest.com/l...
首先,我們發(fā)現(xiàn)登陸界面有個(gè)智能按鈕,一般來說,在輸入郵箱之后,點(diǎn)擊按鈕就會(huì)彈出滑動(dòng)驗(yàn)證窗口,然后我們在拖動(dòng)驗(yàn)證碼完成圖像拼接,完成驗(yàn)證。
所以,滑塊驗(yàn)證識(shí)別需要完成以下步驟:
模擬點(diǎn)擊驗(yàn)證按鈕
識(shí)別滑塊的缺口位置
模擬拖動(dòng)滑塊
如何實(shí)現(xiàn)以上步驟呢?我們先需要將任務(wù)進(jìn)行分解,看似只有三大步驟,其實(shí)里面坑還有很多的,稍后會(huì)做解釋。
第一步,輸入賬號(hào),獲取智能按鈕,使用selenium模擬點(diǎn)擊,獲取帶有缺口的圖片。
第二步,獲取上面缺口圖片中的完整圖片。這里有個(gè)地方要注意,正常情況下我們在網(wǎng)頁源代碼里是找不到完整圖的,因?yàn)樗浑[藏了,必須執(zhí)行javascript語句才能出現(xiàn)完整圖。
我們將display參數(shù)改為block,opacity參數(shù)改為1,然后進(jìn)行截圖,就可以拿到完整的驗(yàn)證碼圖片了。
第三步,對比兩張圖片的所有RGB像素點(diǎn),得到缺口位置。
第四步,模擬人的拖動(dòng)習(xí)慣,這里也有坑,極驗(yàn)的驗(yàn)證碼增加了機(jī)器軌跡識(shí)別,勻速移動(dòng),或者隨機(jī)速度移動(dòng)滑塊都不能通過驗(yàn)證,所以我們將需要拖動(dòng)的總位移分成一段一段小的軌跡,先勻加速拖動(dòng)后勻減速拖動(dòng)。
第五步,按照規(guī)定軌跡進(jìn)行拖動(dòng),完成驗(yàn)證。
第六步,完成賬號(hào)登陸。
過程分析完了,下面我們就來寫代碼試一下:
首先,我們先將整個(gè)代碼的一個(gè)邏輯思路做一個(gè)大致的概括吧。
def main(): """主函數(shù)""" # 獲取帶缺口驗(yàn)證碼圖片image1, 傳入的參數(shù)后綴為: .png image1 = get_unFull_captcha("unfull_captcha.png") # print(image1.load()[12,25]) # 獲取完整驗(yàn)證碼圖片image2 image2 = get_full_captcha("full_captcha.png") # 對比上述圖片像素點(diǎn),獲取缺口位置,得到偏移距離 distance = get_quekou_distance(image1, image2) print("缺口偏移量:", distance) # 獲取滑塊的移動(dòng)軌跡 track = get_track(distance) # 模擬人的行為,拖動(dòng)滑塊,完成驗(yàn)證 slider = get_slider() move(slider, track) success = wait.until(EC.text_to_be_present_in_element((By.CLASS_NAME, "geetest_success_radar_tip_content"), "驗(yàn)證成功")) print(success) if success: login() else: main()
接下來,我們便來逐一完成main函數(shù)里要實(shí)現(xiàn)的功能了。
代碼示例:
通過以上代碼我們便拿到了完整的驗(yàn)證碼和帶有缺口的驗(yàn)證碼。
缺口圖片:
def get_unFull_captcha(name): """ 獲取帶缺口驗(yàn)證碼圖片 :return: unfull captcha """ top, bottom, left, right = get_captcha_position("geetest_canvas_slice") print("驗(yàn)證碼1位置:", top, bottom, left, right) screenshot = get_screenshot() unfull_captcha = screenshot.crop((left, top, right, bottom)) # 按圖片位置裁剪 unfull_captcha.save(name) # 這里傳入的name要以xxx.png命名 return unfull_captcha
完整圖片:
def get_full_captcha(name): """ 獲取完整驗(yàn)證碼圖片 :return: full_captcha """ # 這里要執(zhí)行JavaScript腳本才能拿到完整圖片的截圖 show_Full_img1= "document.getElementsByClassName("geetest_canvas_fullbg")[0].style.display="block"" browser.execute_script(show_Full_img1) show_Full_img2 = "document.getElementsByClassName("geetest_canvas_fullbg")[0].style.opacity=1" browser.execute_script(show_Full_img2) # 等待完整圖片加載 time.sleep(2) top, bottom, left, right = get_captcha_position("geetest_canvas_fullbg") print("驗(yàn)證碼2位置:", top, bottom, left, right) screenshot = get_screenshot() full_captcha = screenshot.crop((left, top, right, bottom)) # 同上 full_captcha.save(name) return full_captcha
這里我在調(diào)試的時(shí)候碰到一個(gè)坑,因?yàn)閏hrome中,location方法不滾動(dòng),直接返回相對整個(gè)html的坐標(biāo),我的電腦是15.6寸的,顯示設(shè)置上布局的縮放大小被放大到1.25倍,導(dǎo)致location返回的坐標(biāo)與驗(yàn)證碼的坐標(biāo)有誤差。修改布局為100%后就解決了。 下面便是對比圖片找出缺口位置。這里我們需要遍歷圖片的坐標(biāo)點(diǎn),獲取像素點(diǎn)的RGB數(shù)據(jù)。
代碼示例
def get_quekou_distance(image1, image2): """ 對比像素點(diǎn),獲取缺口位置 :param image1: 缺口圖片 :param image2: 完整圖片 :return: 缺口的偏移距離 """ # 缺口在滑塊右側(cè),設(shè)定遍歷初始橫坐標(biāo)left為59 left = 60 # 像素對比閾值 threshold = 60 for i in range(left, image2.size[0]): for j in range(image2.size[1]): rgb1 = image1.load()[i, j] rgb2 = image2.load()[i, j] res1 = abs(rgb2[0] - rgb1[0]) res2 = abs(rgb2[1] - rgb1[1]) res3 = abs(rgb2[2] - rgb1[2]) if not (res1 < threshold and res2 < threshold and res3 < threshold): return i-7 # 返回缺口偏移距離,這里需測試幾次
接下來就是獲取滑塊的移動(dòng)路徑和模擬拖動(dòng)行為了。
執(zhí)行代碼:
def get_track(distance): """ 獲取移動(dòng)路徑 :param distance: 偏移量 :return: track:移動(dòng)軌跡 """ # 存放移動(dòng)軌跡 track = [] # 當(dāng)前位置 current = 0 # 設(shè)定加速段和減速段臨界點(diǎn)為路徑的3/4處 mid = distance*4/5 # 時(shí)間間隔time, 取0.2~0.3之間隨機(jī)數(shù),避免被網(wǎng)站識(shí)別出來 t = random.randint(2, 3)/10 # 初速度 v = 0 while current < distance: if current < mid: # 勻加速移動(dòng),加速度a a = 2 else: a = -3 # 初速度 v0 = v # 當(dāng)前速度 v = v0 + a*t # 移動(dòng)距離 s = v0*t + 1/2 * a * t*t # 當(dāng)前位移 current += s # 加入到移動(dòng)軌跡 track.append(round(s)) return track def move(slider, track): """ 模擬鼠標(biāo)操作,點(diǎn)擊,移動(dòng)滑塊按鈕 :param: 滑塊 :param: 軌跡 :return: """ ActionChains(browser).click_and_hold(slider).perform() # 操作鼠標(biāo)按軌跡移動(dòng) for x in track: ActionChains(browser).move_by_offset(xoffset=x, yoffset=0).perform() time.sleep(0.3) # 松開 ActionChains(browser).release().perform()
最后終于成功了,踩了這么多坑,終于完成了滑塊驗(yàn)證碼的破解。。。現(xiàn)在已經(jīng)實(shí)現(xiàn)功能,因?yàn)檫€可能出現(xiàn)其他情況,接下來我們還需要完善一下代碼,其實(shí)也可封裝成一個(gè)類,測試的時(shí)候我們會(huì)發(fā)現(xiàn),圖片會(huì)彈出小怪獸被吃了,那是因?yàn)橄到y(tǒng)識(shí)別我們是機(jī)器行為,所以不通過,這里我們需要修改加速度參數(shù),再增加一個(gè)回調(diào)。
這樣我們就成功破解驗(yàn)證碼,并登陸到網(wǎng)頁界面了。。。忙活了一上午,吃飯去了。
好像現(xiàn)在極驗(yàn)官網(wǎng)改了, 但是滑動(dòng)驗(yàn)證碼思路基本上就是這樣的...
源碼地址:https://github.com/appleguardu/spider_projects/tree/master/Captcha
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/103198.html
摘要:可惜收費(fèi)的,今天要介紹的完美驗(yàn)證碼識(shí)別系統(tǒng)是類似的免費(fèi)產(chǎn)品。調(diào)用函數(shù)相當(dāng)簡單的,對比復(fù)雜的參數(shù),這個(gè)識(shí)別是相當(dāng)?shù)目旖荨? 此文已由作者徐迪授權(quán)網(wǎng)易云社區(qū)發(fā)布。 歡迎訪問網(wǎng)易云社區(qū),了解更多網(wǎng)易技術(shù)產(chǎn)品運(yùn)營經(jīng)驗(yàn)。 講到驗(yàn)證碼識(shí)別,大家第一個(gè)可能想到tesseract。誠然,對于OCR而言,tesseract確實(shí)很強(qiáng)大,自帶的字模能識(shí)別絕大多數(shù)規(guī)整的中英文。但是驗(yàn)證碼畢竟不是OCR。對于現(xiàn)在...
摘要:圖片驗(yàn)證碼是目前最常用的一種。神經(jīng)網(wǎng)絡(luò)以上驗(yàn)證碼識(shí)別都依賴于字符切分,切分的好壞幾乎直接決定識(shí)別的準(zhǔn)確程度。目前驗(yàn)證碼識(shí)別最先進(jìn)的是谷歌在識(shí)別街景圖像中門牌號(hào)碼中使用的一套的算法。 全自動(dòng)區(qū)分計(jì)算機(jī)和人類的圖靈測試(Completely Automated Public Turing test to tell Computers and Humans Apart,簡稱CAPTCHA),...
摘要:驗(yàn)證碼的識(shí)別成功率跟圖片質(zhì)量關(guān)系密切,一般拿到后的驗(yàn)證碼都得經(jīng)過灰度化,二值化,去噪,利用就可以很方便的做到。 了解驗(yàn)證碼 什么是驗(yàn)證碼? 所謂驗(yàn)證碼,就是將一串隨機(jī)產(chǎn)生的數(shù)字或符號(hào),生成一幅圖片,圖片里加上一些干擾象素(防止OCR),由用戶肉眼識(shí)別其中的驗(yàn)證碼信息,輸入表單提交網(wǎng)站驗(yàn)證,驗(yàn)證成功后才能使用某項(xiàng)功能,通俗說就是一種區(qū)分用戶是計(jì)算機(jī)和人的公共全自動(dòng)程序 驗(yàn)證碼的作用 可以...
摘要:為了應(yīng)付這種情況,很多網(wǎng)站加大驗(yàn)證碼識(shí)別難度,復(fù)雜的驗(yàn)證碼甚至讓用戶都很難識(shí)別了,這種方式劣勢十分明顯,糟糕的用戶體驗(yàn)最終會(huì)讓網(wǎng)站流失用戶,這便是為什么有人吐槽網(wǎng)站的驗(yàn)證碼的原因了。 歡迎訪問網(wǎng)易云社區(qū),了解更多網(wǎng)易技術(shù)產(chǎn)品運(yùn)營經(jīng)驗(yàn)。 首先來談?wù)勻?yàn)證碼的機(jī)制,驗(yàn)證碼作為一種人機(jī)識(shí)別手段,其終極目的,就是區(qū)分正常人和機(jī)器的操作。而對于沒有驗(yàn)證碼的場景,比如用戶登陸,則機(jī)器可以同時(shí)、大批量...
摘要:下面我們便來講種驗(yàn)證碼的識(shí)別方式和一些思路。哈哈庫其實(shí),驗(yàn)證碼識(shí)別歸根到底還是對各種各樣圖片的識(shí)別和操作,中有很對圖像處理的庫,其中就是其中之一。所以在處理驗(yàn)證碼識(shí)別之前,必須先了解庫和。第五步,按照規(guī)定軌跡進(jìn)行拖動(dòng),完成驗(yàn)證。 寫在前面 現(xiàn)在,很多網(wǎng)站采取各種各樣的措施來反爬蟲,其中之一就是使用驗(yàn)證碼。當(dāng)我們訪問網(wǎng)頁時(shí),必須先通過驗(yàn)證碼才能夠訪問頁面。下面我們便來講2種驗(yàn)證碼的識(shí)別方...
閱讀 1987·2021-11-24 09:39
閱讀 984·2021-11-11 16:55
閱讀 1439·2021-10-09 09:43
閱讀 1421·2021-10-08 10:17
閱讀 1657·2021-08-25 09:41
閱讀 430·2019-08-30 13:02
閱讀 632·2019-08-29 15:14
閱讀 1010·2019-08-29 13:53