爬蟲面試必備,幾種驗證碼的解決方案

2021-02-14 Python學習開發

點擊上方「Python學習開發」,選擇「加為星標」

第一時間關注Python技術乾貨!

截止到今天鹹魚已經寫了很多期關於 Js 逆向的文章,不過這麼多的文章都有一個共同點,都是關於加密參數或者密碼加密的解析,很多讀者在後臺私信希望能夠出一些關於滑動驗證或者人機驗證的分析教程。

於是鹹魚總結了目前遇到過的的驗證碼類型以及總結出來的相關處理方式和大家聊一聊。

現在市面上的驗證碼的類型大致有下面幾種類型。

圖形驗證碼

比較常見的英文數字組合成的圖形驗證碼,常常輔以各類幹擾線扭曲圖片中的內容達到提高混淆難度的目的,並且通過加長圖片中的文字長度提升識別成本。

7位英數-難度高4位英數-難度中等4位英數-難度低

像這類驗證碼的處理方案有很多種,簡單給大家概括一下。

難度中低的兩類驗證碼,安裝 tesserocr,通過 OCR 技術結合 Python 的 tesserocr 庫可以就可以完成識別。如果驗證碼中帶有簡單幹擾線可以使用灰度和二值化的方法提高代碼的識別率。

常用示例代碼:

import tesserocrfrom PIL import Imageimage = Image.open('code2.jpg')image = image.convert('L')threshold = 127table = []for i in range(256):    if i < threshold:        table.append(0)    else:        table.append(1)image = image.point(table, '1')result = tesserocr.image_to_text(image)print(result)

難度較高的多位英數+扭曲的圖形驗證碼包括上面總結的中低難度的圖形驗證碼,可以通過 TensorFlow 訓練的方式達到識別驗證碼的目的。

之前我有一個系列文章介紹了整個訓練部署的流程,大家可以點擊參考。

大佬說 | 寫給程式設計師的TensorFlow教程-準備篇

大佬說 | 寫給程式設計師的TensorFlow教程-編碼篇

大佬說 | 寫給程式設計師的TensorFlow教程-上線篇

使用這個方式的朋友記得要先準備好足夠的驗證碼的樣本,只要你的模型不是太差,通過足量的樣本,不斷調優是可以達到一個較為可觀的識別率。

目前體驗過最好的程序是冷月的四位英數,識別成功率高達 99.99% ,不過據知情人透露整個訓練的樣本達到了 6000 W ,耗費的時間精力可想而知。

旋轉驗證碼

這類驗證碼是將驗證碼的圖片旋轉並且需要用戶拖動下方滑塊完成將圖片擺正的操作才可以完成驗證。

旋轉驗證碼

不過某家的這個驗證碼有一些小小的 bug,依靠勞苦大眾的智慧,我在 GitHub 上發現了一個很 Nice 的項目。

項目地址:https://github.com/scupte/xuanzhaunyanz

因為圖庫的容量問題,沒有超大的圖庫作為後盾,將全部的原圖抓取下來對比完全可以得到旋轉的角度了。

不過鑑於該家的驗證碼並沒有普及所以了解一波即可。

部分對比代碼:

# -*- coding: utf-8 -*-import cv2import numpy as np
imagepath = '9_1.png'img = cv2.imread(imagepath)gray = cv2.cvtColor ( img , cv2.COLOR_BGR2GRAY )ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) #cv2.drawContours(img,contours,-1,(0,0,255),1) for cnt in contours:
# 最小外界矩形的寬度和高度 width, height = cv2.minAreaRect(cnt)[1]
if width* height > 100: # 最小的外接矩形 rect = cv2.minAreaRect(cnt) box = cv2.boxPoints(rect) # 獲取最小外接矩形的4個頂點
box = np.int0(box) print box
if 0 not in box.ravel():
#繪製最小外界矩形 for i in range(4): cv2.line(img, tuple(box[i]), tuple(box[(i+1)%4]), 0) # 5 theta = cv2.minAreaRect(cnt)[2] if abs(theta) <= 45: print('圖片的旋轉角度為%s.'%theta)

# angle = thetaprint theta cv2.imshow("img", img) cv2.waitKey(0)

滑動驗證碼

說到滑動驗證碼,一定一定要提某驗,雖然說市面上關於滑動驗證碼的產品有很多,但是某驗的地位就像 10 年前腦白金在保健品市場的地位一樣,業界標杆啊。

它越牛逼,市場上用它做防護的網站也越多,像國家企業信用信息公示系統、B 站、狗東等等。

像某驗的解決方案也有很多,不過原理大同小異。

selenium 模擬滑動

使用 selenium 這個大家都聽過,步驟大致是將缺口圖和原圖進行對比獲取缺口的橫坐標,並使用計算完成拖動軌跡模擬,之後使用 selenium 按照軌跡滑動完成缺口的拼接。

這一類方法的優點是門檻低,原理簡單,缺點是完成滑動耗時較長,成功率無法估計(同一軌跡計算規則使用多次後成功率迅速下降)

常見的軌跡生成代碼:

import numpy as npimport math

def ease_out_expo(x): """ 曲線函數 :param x: :return: """ if x == 1: return 1 else: return 1 - pow(2, -10 * x)

def get_tracks(distance, seconds): """ 軌跡生成函數 :param distance: 滑動總距離 :param seconds: 滑動總時間 :return: """ tracks = [0] # 存放軌跡的數組 offsets = [0] # 存放滑動總距離的記錄數組 for t in np.arange(0.0, seconds, 0.1): # 產生一個數列如[0.0, 0.1, 0.2, 0.3] offset = round(ease_out_expo(t/seconds) * distance) # 根據時間t計算在曲線上的滑動距離 tracks.append(offset - offsets[-1]) # 本次計算的距離減去上一次移動的距離,得到本次的軌跡 offsets.append(offset) # 至本次滑動了的總距離 return offsets, tracks

a, b = get_tracks(138, 3)print(a, b)

def get_tracksb(distance): """ 根據物理的先加速再減速規律計算 :param distance: :return: """ distance += 20 # 加上20是為了滑動超過缺口再回滑 v = 0 # 初速度 t = 0.2 # 以0.2秒為一個計算周期 forward_tracks = [] # 軌跡記錄數組 current = 0 # 初始移動距離 mid = distance * 3 / 5 # 減速閥值即五分之三的距離加速剩下距離減速 while current < distance: # 總移動距離等於輸入距離時結束 if current < mid: # 加速狀態 a = 2 # 加速度為+2 else: # 減速狀態 a = -3 # 加速度-3
s = v * t + 0.5 * a * (t ** 2) # 計算0.2秒周期內的位移 v = v + a * t # 計算本次周期後的速度 current += s # 將之前移動的總距離,加上本次0.2秒周期內移動的距離 forward_tracks.append(round(s)) # 記錄本次0.2秒周期內的移動距離為軌跡
back_tracks = [-3, -3, -2, -2, -2, -2, -2, -1, -1, -1] # 手動將開頭加上的20,生成減去軌跡,即回滑軌跡 return {'forward_tracks': forward_tracks, 'back_tracks': back_tracks}

Js 破解關鍵的參數

這類方法的門檻就比較高了,通過斷點調試 Js,逆向分析滑動後提交參數的生成邏輯完成參數的生成,之後構造請求完成提交,當然這中間也是需要分析圖片的缺口位置與模擬軌跡,不過沒有使用到模擬所以速度快成功率高。

缺點是風險高,代碼維護成本高,更新一個新版本就要重新分析而且逆向相關產品的代碼是有一定的法律風險的,免費吃住也不是開玩笑的,所以很多能夠商業化的大佬們都悶聲發大財不會到處張揚。

使用現有的服務

上面兩種方法各有各的優缺,很多人就想把這一塊的工作量與風險分出去,這就要使用到第三方的服務商了。

不過目前國內市場上的服務商並沒有這類服務,目前鹹魚在使用的是一家俄羅斯的服務商 - 2Captcha

這個服務商提供的驗證碼服務有很多種,其中包含了我們比較關心的 GeeTest 。

每1000次的價格

下面鹹魚給大家簡單介紹下如何使用服務。(不要問為啥收費,人家服務商也要吃飯,況且這個價格實在便宜了)

首先,註冊一個帳號,官網是 http://2captcha.com/zh

首頁

完成註冊之後會跳轉到控制臺界面,這裡最重要的是獲取到屬於你的 API Key 。

API KEY

好,拿到這個 API Key 之後就可以上手使用服務完成滑動的破解了。

通過參考官方的 API 文檔,我們只需要構建兩個 Get 請求就可以了。

第一個 Get 請求的組成是這樣的:

https://2captcha.com/in.php?key= 上面獲取的API KEY &method=geetest&gt= 某驗參數&challenge= 某驗參數&api_server=api-na.geetest.com(可選)&pageurl= 滑動驗證碼所在的網頁地址

參數列表:

參數名參數介紹keyAPI KEYmethod表示驗證碼類型gt某驗參數1challenge某驗參數2api_serverapi-na.geetest.com(選填)pageurl滑動驗證碼所在的網頁地址

這裡解釋下關於 gt 與 challenge 這兩個參數的獲取。

第一個請求中這兩個參數其中 gt這個參數是固定的,找一個使用某驗的網站就可以獲取。例如:

challenge這個參數是由請求返回,你找到這個請求之後按照請求重新獲取一次,如果是 XHR 的話也可以直接 replay XHR 。

完成參數構建,提交完第一個請求之後,成功會返回類似下面的結果。

OK|2122988149 or as JSON {"status":1,"request":"2122988149"}

這裡面的一串數字就是會話 ID。

有了這個會話 ID 之後我們就可以構建下一個請求,記住兩個請求中間需要等待一些時間哦。

https://2captcha.com/res.php?key=API KEY&action=get&id=2122988149

參數列表:

參數名參數介紹keyAPI KEYactionGetid上一個請求返回的會話ID

這個請求返回的結果就是我們需要的加密參數。

{      "challenge":"1a2b3456cd67890e12345fab678901c2de",      "validate":"09fe8d7c6ba54f32e1dcb0a9fedc8765",      "seccode":"12fe3d4c56789ba01f2e345d6789c012|jordan"}

以上常見的幾類驗證碼,已經全部介紹完了。

肯定有人問像 google 家的 ReCaptcha 以及和他相似的 hCaptcha 的解決方案沒有提到啊?

像以上兩類驗證碼,剛剛提到的服務商也同樣有提供接口打碼。

至於其他不依靠服務商的解決方案,目前鹹魚還沒有接觸過,畢竟這兩類驗證碼,鹹魚手動點擊都沒辦法做到一次通過,目前也只能依賴服務商了。

添加微信[gopython3].回復:回復Go或者Python加對應技術群。

相關焦點

  • 懟就完事了,總結幾種驗證碼的解決方案
    於是鹹魚總結了目前遇到過的的驗證碼類型以及總結出來的相關處理方式和大家聊一聊。現在市面上的驗證碼的類型大致有下面幾種類型。圖形驗證碼比較常見的英文數字組合成的圖形驗證碼,常常輔以各類幹擾線和扭曲圖片中的內容達到提高混淆難度的目的,並且通過加長圖片中的文字長度提升識別成本。
  • 最全的 Python 反爬蟲及應對方案!
    爬蟲是 Python 的一個常見應用場景,很多練習項目就是讓大家去爬某某網站。爬取網頁的時候,你大概率會碰到一些反爬措施。這種情況下,你該如何應對呢?本文梳理了常見的反爬措施和應對方案。 1.解決方法:註冊多個帳號、模擬正常操作。實現難度:★★★ 4. Spider Trap蜘蛛陷阱導致網絡爬蟲進入無限循環之類的東西,這會浪費蜘蛛的資源,降低其生產力,並且在編寫得不好的爬蟲的情況下,可能導致程序崩潰。禮貌蜘蛛在不同主機之間交替請求,並且不會每隔幾秒鐘從同一伺服器請求多次文檔,這意味著「禮貌」網絡爬蟲比「不禮貌」爬蟲的影響程度要小得多。
  • Python 爬蟲面試題 170 道
    最近在刷面試題,所以需要看大量的 Python 相關的面試題,從大量的題目中總結了很多的知識,同時也對一些題目進行拓展了,但是在看了網上的大部分面試題都有這幾個問題:有些部分還是 Python2 的代碼回答的很簡單,關鍵的題目沒有點出為什麼
  • 網站反爬蟲常見方法
    網站為了正常運營,通常會設置各種反爬機制,讓爬蟲知難而退。今天神龍代理IP就給大家盤點一下網站常見的反爬蟲機制。反爬蟲機制通過判定訪問請求的頭部中沒有帶UA來識別爬蟲,這種判定方法很低級,通常不會將其作為唯一的判定標準,因為反反爬蟲非常容易,隨機數UA即可針對。2.通過Cookie判定Cookie就是指會員制的帳號密碼登錄驗證,通過分辨這一個帳號在短期內內爬取頻次來判定。這種方法的反反爬蟲也很費勁,需選用多帳戶的方法來爬取。
  • Python 爬蟲面試題 170 道:2019 版
    引言最近在刷面試題,所以需要看大量的 Python 相關的面試題,從大量的題目中總結了很多的知識,同時也對一些題目進行拓展了,但是在看了網上的大部分面試題不是很滿意。反爬蟲措施,你是怎麼解決的?144.為什麼會用到代理?145.代理失效了怎麼處理?146.列出你知道 header 的內容以及信息147.說一說打開瀏覽器訪問 www.baidu.com 獲取到結果,整個流程。
  • 面試妥了!2020 爬蟲面試題目合集
    2.爬蟲可以解決的問題:(1)解決冷啟動問題(2)搜尋引擎的根基:做搜尋引擎少不了爬蟲(3)建立知識圖譜,幫助建立機器學習知識圖譜(4)可以製作各種商品的比價軟體,趨勢分析。3.爬蟲分類(1)通用爬蟲:搜尋引擎的主要組成,作用就是將網際網路的上頁面整體的爬取下來之後,保存到本地。
  • python爬蟲高級技術:破解驗證碼
    驗證碼探究   如果你是一個數據挖掘愛好者,那麼驗證碼是你避免不過去的一個天坑,和各種驗證碼鬥爭,必然是你成長的一條道路,接下來的幾篇文章,我會儘量的找到各種驗證碼,並且去嘗試解決掉它,中間有些技術甚至我都沒有見過,來吧,一起Coding吧   數字+
  • 深度好文 | 了解爬蟲技術方方面面
    後臺爬蟲的三大問題後臺爬蟲在大行其道的時候,也有著些許棘手的、到目前也沒有什麼好的解決方案問題,而歸根結底,這些問題的根本原因是由於後臺爬蟲的先天不足導致,在正式討論之前,我們先思考一個問題,「爬蟲和瀏覽器有什麼異同?」。
  • Python爬蟲知識點梳理
    作為零基礎小白,大體上可分為三個階段去實現,第一階段是入門,掌握必備基礎知識,比如Python基礎、網絡請求的基本原理等,第二階段是模仿,跟著別人的爬蟲代碼學,弄懂每一行代碼,熟悉主流的爬蟲工具,第三階段是自己動手,到了這個階段你開始有自己的解題思路了,可以獨立設計爬蟲系統。
  • 乾貨 | 那些你不知道的爬蟲反爬蟲套路
    二、爬蟲反爬蟲技術現狀下面我們談談,爬蟲和反爬蟲分別都是怎麼做的。1、為python平反首先是爬蟲。爬蟲教程你到處都可以搜的到,大部分是python寫的。而反爬蟲策略經常會變化的翻天覆地,需要對代碼進行大刀闊斧的重構,甚至重寫。這種情況下,python不失為一種合適的解決方案。 舉個例子,你之前是用selenium爬取對方的站點,後來你發現自己被封了,而且封鎖方式十分隱蔽,完全搞不清到底是如何封的,你會怎麼辦?你會跟蹤selenium的源碼來找到出錯的地方嗎?你不會。你只會換個框架,用另一種方式來爬取。
  • Python爬蟲模擬登陸嗶哩嗶哩(bilibili)並突破點選驗證碼功能
    寫在前面今天帶給大家一個突破點選驗證碼的案例,利用爬蟲模擬登陸嗶哩嗶哩,並且把一些採坑的地方給大家強調一下!passport.bilibili.com/login效果圖如下:驗證成功後會自動跳轉B站的登錄界面,為了保護我的信息安全,我用了假用戶名二、編程思路首先利用xpath或者css選擇器等方法找到要輸入內容的元素位置,然後用自動化爬蟲工具
  • 【必收藏】2020 爬蟲面試題目合集
    (2)聚焦爬蟲:聚焦爬蟲在實施網頁抓取時會對內容進行處理篩選,儘量保證只抓取與需求相關的網頁信息。通用爬蟲和聚焦爬蟲的區別:聚焦爬蟲在實施網頁抓取時會對內容進行處理篩選,儘量保證只抓取與需求相關的網頁信息。
  • Python——爬蟲
    一、什麼是網絡爬蟲在隨著大數據時代的到來,網絡爬蟲在網際網路中的地位也越來越重要。而網際網路中的數據是海量存在的,那麼我們如何自動高效地獲取網際網路中我們感興趣的信息並為我們所用就成了一個重要的問題,而爬蟲技術就是為了解決這些問題而產生的。
  • 就想寫個爬蟲,我到底要學多少東西啊?
    正因為涵蓋的方向多,因此學習的東西也非常零散和雜亂,很多初學者搞不清楚究竟要學習哪些知識,學習過程中遇到反爬也不知道用什麼方法來解決,本篇我們來做一些歸納和總結。初學爬蟲一些最基本的網站,往往不帶任何反爬措施。比如某個博客站點,我們要爬全站的話就順著列表頁爬到文章頁,再把文章的時間、作者、正文等信息爬下來就可以了。那代碼怎麼寫呢?
  • 我就想寫個爬蟲,到底要學多少東西啊?
    正因為涵蓋的方向多,因此學習的東西也非常零散和雜亂,很多初學者搞不清楚究竟要學習哪些知識,學習過程中遇到反爬也不知道用什麼方法來解決,本篇我們來做一些歸納和總結。初學爬蟲一些最基本的網站,往往不帶任何反爬措施。比如某個博客站點,我們要爬全站的話就順著列表頁爬到文章頁,再把文章的時間、作者、正文等信息爬下來就可以了。那代碼怎麼寫呢?
  • 一段爬蟲引起的風暴,大數據公司史上最大「危機」
    的文章也是引起了廣泛熱議,文章中寫的是一名程式設計師寫了一段爬蟲後被刑偵的事情,其中,大家最關心的點便是爬蟲究竟是合法還是違法的?在探討爬蟲究竟是合法還是違法之前,先帶大家了解一下爬蟲到底是什麼。網絡爬蟲按照系統結構和實現技術,大致可以分為以下幾種類型:通用網絡爬蟲(General Purpose Web Crawler)、聚焦網絡爬蟲(Focused Web Crawler)、增量式網絡爬蟲(Incremental Web Crawler)、深層網絡爬蟲(Deep Web Crawler)。
  • Python爬蟲:一些常用的爬蟲技巧總結
    、自動化運維:寫過簡單網站、寫過自動發帖腳本、寫過收發郵件腳本、寫過簡單驗證碼識別腳本。爬蟲在開發過程中也有很多復用的過程,這裡總結一下,以後也能省些事情。,於是對爬蟲一律拒絕請求。對於一些簡單的驗證碼,可以進行簡單的識別。
  • 註冊登錄功能設計:3種常見註冊登錄方案邏輯解析
    針對這一問題,目前常用的解決方案是,在用戶使用新設備登錄已註冊手機號時,詢問當前手機號是否是自己的帳號,比如京東商城。更嚴格的產品會在用戶確認是自己的手機號後進行二次驗證,比如支付寶。當然,為了避免這種不必要的糾紛,平臺也會提供手機號的換綁功能。手機號+驗證碼+密碼設置的註冊登錄。
  • 成為一個爬蟲工程師,都需要學習那些知識?
    當然,現在的網站有一些技術挺牛的,能夠辨識出webdriver等驅動,看到你是用的 Selenium 等工具,直接拒絕訪問或不返回數據,所以碰到這種網站,還是需要具體情況具體分析一下,找到解決的方法。如果能再使用上異步協程,就更牛X了,結合使員工 aiohttp、gevent、tornado 等插件,你想搞幾並發就搞幾並發,但還是要控制好速度,一方面是為了避免網站封你 IP、封你帳號、彈驗證碼、返回假數據,另一方面,也要做一個有道德的爬蟲,不能把別人的網站搞癱了。
  • 寫網絡爬蟲程序的難度是怎麼分等級的
    一個有用的爬蟲,只需兩個詞來衡量: 數量:能否抓全所有該類數據 效率:抓完所有數據需要多久一天還是一個月 但要做到這兩個詞,卻是要下很多功夫。自己下功夫是一方面,也很重要的是你要抓全的目標網站給你出了多少難題。綜合起來,就寫一個爬蟲有多少難度。