驗證碼(CAPTCHA),是一種區分用戶是計算機還是人的公共全自動程序。對于研究爬蟲來說,這應該是爬蟲的“天敵”。
原因就是在于,現在各大網站為了反爬,都加入了點選圖片驗證碼,滑動驗證碼,英文亂碼等驗證碼干擾,因此想要爬取網站,需要做的第一步就是解決驗證碼的問題。
聊到驗證碼,簡單的看圖輸入型的數字驗證碼,英文驗證碼,中文驗證碼,都已經被爬蟲工程師機靈的攻克了,孕育而生的又有需要按照圖片顯示的數據公式進行計算后輸入結果的驗證碼,以及非常有名的12306魔鬼點選驗證碼。
這一類的驗證碼很難通過簡單的機器學習等方式進行操作,畢竟遇到點選“白百合”還是“王珞丹”,人臉識別也要束手無策。
本篇就針對12306的點選驗證碼進行講解和破解。讓我們一起來學習一下。
點選驗證碼是近代用于驗證是否為人類的一種措施之一。他的驗證方式是通過給出需要點擊的圖片類型,用戶需要根據給出的幾種圖片中,正確點擊出正確的圖片,否則就會視為自動化腳本,不給予通過驗證。這為反爬蟲工作提升了一個新的高度,因為基本上傳統的破解方式都已經不能繞過該驗證碼。若真想破解點選驗證碼,只有使用深度學習網絡,訓練出圖片分類器,才可能有機會破解點選驗證碼。
個人觀點: 對于開發周期太短,技術實現太復雜的情況我其實是推薦用服務商的接口。因為如果花太多時間在繞過驗證碼這方面,還不如優化一下代碼,使得代碼運行速度更快、魯棒性更強,(另外實在不行的情況下我們也可以讓功能先上線再說…技術的東西慢慢不上),畢竟攻城獅能合理調配資源解決問題也是牛攻城獅;
另外對于點選驗證碼,這種的破解難度十分高,為什么這么說呢?
是因為如果要破解點選圖片驗證碼,這就與計算機視覺(CV)的知識有交叉了。我來簡單說下計算機是如何識別圖片的。
首先現在的一般圖片都是由二維的像素點加通道數構成的,在計算機眼里,就是一個三位數組,每個像素點的值代表的是亮度,0-255之間;舉個例子,對于一張灰度圖片例如長這樣:
它由字母以及噪聲構成,他對應的量化矩陣就只有一個通道,圖片尺寸大小的一個矩陣。如果想要訓練計算機認識這個圖片,人們肯定不想把噪聲也放進去的,人們就會通過矩陣與卷積核進行卷積,得到一張過濾后的圖片,卷積核就是相當于一個濾波器。
常見的卷積核有拉普拉斯算子,高斯算子等,用已知的這些算子可以對圖片進行平滑化的操作,但我們想要的是圖片的關鍵部分啊!!!
這時候深度學習就出來了,通過一個數據池,里面有很多這種類型的驗證碼,通過計算,不斷地擬合出一個適合這個數據池使用的卷積核,最后通過人工設置的數輪計算后,拿到卷積核,我們便可以拿這個擬合出來的卷積核對新的圖片進行卷積,從而判斷這個圖片是什么。但這個只是一個通道,尺寸比較小的圖片,對于一些尺寸較大的、彩色的圖片,那么這個計算量就十分之大了。
回到12306的驗證碼,驗證碼所顯示的圖片類型是完全隨機的,一會是洗潔精圖片,一會是黑板的圖片,一會是瑪雅神殿的圖片,對于一般的開發者來說,不可能通過深度學習訓練出一個適合12306的圖片預測器,因為數據量實在是太大了。
這時我們不妨可以借用第三方接口,來滿足我們的需要,俗話說得好:”永遠不要用自己的業余挑戰別人的職業”。
別人通過專業的機器、大量的人員來解決專業領域的問題,我們可以通過分享部分的利潤,來實現自己的功能,這個雙贏的局面,也能增加全球的GDP嘛哈哈。直接使用第三方平臺吧,直接調用別人的接口快速完成業務是真的爽。
本文使用的第三方服務:
https://2captcha.com/zh?from=8873291
根據本人測試,這是目前識別率最高的平臺,而且調用他們家的api也是十分簡單而且響應速度也不錯。另外他們家除了有點選驗證碼外,還有很多的驗證碼解決方案。
下面直接敲代碼,一起體驗使用api的快感。
首先看下官方文檔:
基本意思是我們得要先把圖片發至:
https://2captcha.com/in.php
后再從
https://2captcha.com/res.php
取得我們所需要的坐標。而這個就是官方提供的參數:
其中說明一下這兩個參數:
下面,直接封裝一個請求函數,我已經將常用的參數都寫進函數里面了,以后調用的時候就可以十分方便了,美滋滋!
from requests import Sessionfrom urllib.parse import urlencodefrom json import loads class Captcha: def__init__(self, key): self.send_url ='https://2captcha.com/in.php' self.result_url ='https://2captcha.com/res.php' self.key = key self.session = Session() defclick_image_captcha(self, image_name, method='post', imginstructions='', textinstructions=''): data ={ 'key': self.key, 'method': method, 'coordinatescaptcha':1, 'json':1, } if textinstructions: data['textinstructions']= textinstructions if textinstructions: data['imginstructions']= imginstructions files ={ 'file':open(image_name,'rb') } params ={ 'method':'post', 'url': self.send_url, 'data': data, 'files': files, } response = loads(self.session.request(**params).text) return response defget_result(self, request_id): params ={ 'key': self.key, 'action':'get', 'id': request_id, 'json':1 } response = self.session.request(method='get', url=self.result_url +'?'+ urlencode(params)) return response.text
這個是測試用的png,命名為111.png。
根據上面給出的函數接口,直接調用并傳入圖片文件111.png,讓我們一起看看返回結果。
t = Captcha('85c*****************a939')answer = t.click_image_captcha(image_name='111.png', textinstructions='click on images with seal.')print(answer)
請求并打印一下得到這個。
而拿到的這個是什么東西呢?這是平臺給出的,用于請求答案的唯一request-id碼,我們將拿到的request值再通過請求函數請求一次。
answer = t.get_result('63283539784')print(answer)
我們最后對照后發現,我們得到了兩個坐標,我們可以使用圖片工具打開圖片:
通過上圖發現,這兩個坐標的位置正是驗證碼中那兩個符合條件的印章位置,最后我們可以通過selenium模擬登陸,模擬點擊完成驗證碼的突破了。
另外需要提醒的是,selenium模擬點擊的坐標需要另外計算,也就是說先要知道圖片所在瀏覽器的坐標位置,再通過這個位置,與拿到的坐標相加再點擊才能正確點擊該點的位置,還有使用selenium庫點擊后,鼠標點擊的坐標并不會回到絕對坐標中的0,0位置,而是會在點擊后的原有位置設為絕對坐標(0,0),用人話說就是需要在點擊以后,另外做一個反向移動的操作,這個操作我已經封裝了一個函數了,需要的自取把,在這里就不演示了 因為下面順便發出封裝好的selenium模擬點擊。
defclick_locxy(dr, x, y, left_click=True): if left_click: ActionChains(dr).move_by_offset(x, y).click().perform() else: ActionChains(dr).move_by_offset(x, y).context_click().perform() ActionChains(dr).move_by_offset(-x,-y).perform()
本文介紹到這里。
總結
在這篇文章里,我們針對“12306”魔鬼驗證碼進行了實驗??梢钥吹骄冗€是相當高的,確實是給爬蟲操作解決了大麻煩。
2captcha 本身我看到很多爬蟲博主都在使用,其針對滑動驗證碼,以及谷歌系列的點選驗證碼的效果都非常好。另外調用api的形式簡單方便,確實是非常值得推薦的。
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...
在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...
在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...
如何成為qq心悅會員?心悅會員是一款拿來為騰訊游戲充值話費后臺在內優先可以體驗的特權,要想擁有那個會員要滿足下條件。1.簡單你的有帳號,然后把用帳號進來,心悅會員俱樂部,然后那就是再積累你的成長值,這個成長值是你用你的帳號在手機充值游戲的時候花的錢,1元錢不等于10成長會值,積累知識50000成長值的時候是會自動啟動下一界心悅會員。怎么開通騰訊會員?第1種:網支付在線支付的這個可以可分、財付通、支...
2021年PS歷史記錄怎么打開?1.打開PS軟件,導入圖片進行處理,點擊 "窗口歷史 "在菜單欄中。2.右邊可以看到打開的有歷史的窗口,點擊對應的歷史操作記錄可以回到動作前的狀態。PS中的歷史記錄不見了怎么找回?Ps:窗口-歷史上面的菜單欄,調出就可以了,歷史的步數也可以設置。希望能幫到你~Photoshop怎么返回上一步?在Photoshop上方的菜單欄中單擊“編輯”,然后在下拉選項中單擊“返回...
沈陽農業大學招生章程與注意事項?楊農業大學2020年全日制普通本科招生簡章一、學校全稱沈陽農業大學二、學校地址遼寧省沈陽市沈河區東陵路120號第三,學校的類型公立高等教育機構四。辦學水平本科課程動詞(verb的縮寫)辦學形式全部時間的不及物動詞辦學的主要條件校園占地面積197.2萬平方米(約2957.4畝);平均教學行政用房面積17.2平方米;平均宿舍面積8.6平方米;生師比16.3;專任教師12...