利用Python+Selenium破解春秋航空網(wǎng)滑塊驗證碼的實戰(zhàn)過程
前言
記錄一次利用Python+Selenium破解滑塊驗證碼的實戰(zhàn)過程。
讓我們愉快地開始吧~
開發(fā)工具
Python版本: 3.6.4
相關(guān)模塊:
pillow模塊;
selenium模塊;
numpy模塊;
以及一些Python自帶的模塊。
其他:
chromedriver
環(huán)境搭建
安裝Python并添加到環(huán)境變量,pip安裝需要的相關(guān)模塊即可。
實戰(zhàn)記錄
本文將記錄一次春秋航空的會員注冊頁面所使用的滑塊驗證碼破譯過程,地址為:
https://account.ch.com/NonRegistrations-Regist
一. 驗證碼簡介
驗證碼,即CAPTCHA,全自動區(qū)分計算機和人類的公開圖靈測試
,換而言之,驗證碼是一種用于區(qū)分人類與計算機的測試,只有通過了CAPTCHA,當(dāng)前用戶才被認為是人類。
二.破解滑塊驗證碼
滑塊驗證碼,即用戶使用鼠標(biāo)將滑塊從某個位置拖動到另一個位置,服務(wù)器通過用戶拖動滑塊的軌跡來判斷當(dāng)前用戶是否為人類。本文將嘗試破解的是一種拼圖式的滑塊驗證碼:
首先,我手動完成了一次滑塊驗證碼的驗證,想看看需要向服務(wù)器端發(fā)送什么請求才算是通過了驗證,隨便點開了一個,發(fā)現(xiàn)請求需要的參數(shù)是這樣的:
搞清楚每個參數(shù)當(dāng)然是可以的,簡單想了一下,感覺應(yīng)該是這樣的:
首先,利用圖像處理技術(shù)計算滑塊到缺口的距離。然后,利用機器以與人類行為相似的方式將滑塊拖到缺口位置,完成驗證。
2.1 計算滑塊到缺口的距離
首先,我們利用Selenium進入滑塊驗證碼界面:
也就是這個界面:
那么滑塊到缺口的距離該如何計算呢?
之前看到很多人是這么算的:
出現(xiàn)滑塊驗證碼界面時對屏幕進行截圖(此時背景圖是完整的),然后模擬點擊滑動圓球,使滑塊和缺口出現(xiàn)(此時背景圖是有缺口的),此時再次截圖,通過對比兩次截圖即可輕松地找到缺口位置。
但是,此方案的前提是在點擊滑動圓球之后才出現(xiàn)滑塊和缺口,點擊之前是完整的背景圖。這個方案在不久前還是可行的,但是魔高一尺道高一丈,數(shù)天前滑塊驗證碼版本升級了?。?!滑塊驗證碼直接顯示滑塊和缺口了!??!也就是不給你看原圖了。
既然準備用機器學(xué)習(xí),算法先不考慮,總得先有訓(xùn)練數(shù)據(jù)吧,于是我手動刷新了幾次,想研究一下驗證碼圖片該如何獲取,實在不行就手動保存?zhèn)€幾百張??梢凰⑿?,發(fā)現(xiàn)了一件了不起的事情,這網(wǎng)站滑塊驗證碼的背景圖只有四張!
根本不需要爬驗證碼,手工標(biāo)注,然后訓(xùn)練了。或許有人會問,為什么呢?
因為就四張背景圖?。。?!你完全可以這樣:
對當(dāng)前的滑塊驗證碼界面進行截圖,與對應(yīng)的完整背景圖進行對比,找到缺口位置,即可計算出滑塊到缺口的距離了(滑塊初始位置的橫坐標(biāo)是固定的)。
上述方案有如下兩個問題:
(1)如何獲取完整的背景圖?
答案:當(dāng)你完成滑塊驗證碼的驗證時,還是會出現(xiàn)對應(yīng)的完整背景圖的,通過截屏軟件截下圖就好了。
結(jié)果如下:
(2)怎么找到當(dāng)前滑塊驗證碼對應(yīng)的完整背景圖?
答案:因為只有四張圖,沒必要用一些高大上的圖像匹配算法,看了下四張圖左上角頂點處的像素值,其中R值分別為:255,217,227,100,顯然,通過對比背景圖左上角頂點處的像素值即可找到當(dāng)前滑塊驗證碼對應(yīng)的完整背景圖了,代碼實現(xiàn)如下:
注意,因為截圖是這樣子的:
所以驗證碼背景圖左上角頂點處的坐標(biāo)會隨著電腦和截屏方式的改變而改變(具體而言,Selenium和我電腦上的截屏軟件截出來的圖,驗證碼背景圖的位置坐標(biāo)是不一樣的,需要通過畫圖軟件確定具體位置)。
所以如果你無法用我的代碼完成滑塊驗證碼破解的話,請自行修改(787, 282)和(787, 293)為適合你自己電腦實際情況的坐標(biāo)值。
接下來,我們就可以計算滑塊到缺口的距離了!
先截取當(dāng)前滑塊驗證碼界面,代碼實現(xiàn)如下:
這里我們把滑塊先移動到最右端再截圖,否則滑塊將影響當(dāng)前驗證碼界面與對應(yīng)的完整背景圖之間的像素對比(即第一次找到的像素差異較大點在滑塊上而不是在期望的缺口上)。
然后通過與對應(yīng)的完整背景圖進行像素值對比,找到缺口位置,即可計算出滑塊到缺口的距離了(因為滑塊初始位置的橫坐標(biāo)是固定的):
2.2 將滑塊拖到缺口位置
接下來,我們需要利用機器以與人類行為相似的方式將滑塊拖到缺口位置,完成驗證。
一般而言,人手工拖動滑塊的軌跡是這樣的:
即:先快速向右拖動,快到缺口時,再減速慢調(diào)。那么這樣的軌跡該如何生成呢?
我想了兩種方案:
方案一是根據(jù)物理學(xué)中的加速度減速度來模擬拖動滑塊的軌跡,代碼實現(xiàn)如下:
方案二是直接構(gòu)造一些函數(shù)來模擬拖動滑塊的軌跡,函數(shù)代碼實現(xiàn)如下:
最后,使用Selenium按照設(shè)定的軌跡將滑塊移動到缺口處即可:
文章到這里就結(jié)束了,感謝你的觀看,Python24個小游戲系列,下篇文章分享Python+Selenium破譯B站滑塊驗證碼
到此這篇關(guān)于利用Python+Selenium破解春秋航空網(wǎng)滑塊驗證碼的實戰(zhàn)過程的文章就介紹到這了,更多相關(guān)Python Selenium滑塊驗證碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- python網(wǎng)絡(luò)爬蟲selenium打開多窗口與切換頁面的實現(xiàn)
- python實現(xiàn)selenium網(wǎng)絡(luò)爬蟲的方法小結(jié)
- python網(wǎng)絡(luò)爬蟲 Scrapy中selenium用法詳解
- Python+selenium實現(xiàn)趣頭條的視頻自動上傳與發(fā)布
- Python + selenium 自動化測試框架詳解
- python自動化測試selenium屏幕截圖示例
- Python編程使用Selenium模擬淘寶登錄實現(xiàn)過程
- Python+selenium 自動化快手短視頻發(fā)布的實現(xiàn)過程
- Python結(jié)合Selenium簡單實現(xiàn)Web自動化測試
- python網(wǎng)絡(luò)爬蟲基于selenium爬取斗魚直播信息
相關(guān)文章
Python?Celery動態(tài)添加定時任務(wù)生產(chǎn)實踐指南
elery是一種異步任務(wù)隊列,如果還不熟悉這個開源軟件的請先看看官方文檔,快速入門,下面這篇文章主要給大家介紹了關(guān)于Python?Celery動態(tài)添加定時任務(wù)生產(chǎn)實踐的相關(guān)資料,需要的朋友可以參考下2022-08-08Django-xadmin后臺導(dǎo)入json數(shù)據(jù)及后臺顯示信息圖標(biāo)和主題更改方式
這篇文章主要介紹了Django-xadmin后臺導(dǎo)入json數(shù)據(jù)及后臺顯示信息圖標(biāo)和主題更改方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03python 使用Tensorflow訓(xùn)練BP神經(jīng)網(wǎng)絡(luò)實現(xiàn)鳶尾花分類
這篇文章主要介紹了python 使用Tensorflow訓(xùn)練BP神經(jīng)網(wǎng)絡(luò)實現(xiàn)鳶尾花分類,幫助大家更好的利用python進行深度學(xué)習(xí),感興趣的朋友可以了解下2021-05-05Python-docx 實現(xiàn)整體修改或者部分修改文字的大小和字體類型
這篇文章主要介紹了Python-docx 實現(xiàn)整體修改或者部分修改文字的大小和字體類型,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03