【Python爬蟲】圖片驗證碼的處理

什么是圖片驗證碼?

驗證碼(CAPTCHA)是"Completely Automated Public Turing test to tell Computers and HumansApart”(全自動區分計算機和人類的圖靈測試)的縮寫,是一種區分用戶是計算機還是人的公共全自動程序。

圖片驗證碼的處理方案

  1. 手動輸入(input)這種方法僅限于登錄一次就可持續使用的情況
  2. 圖像識別引擎解析使用光學識別引擎處理圖片中的數據,目前常用于圖片數據提取,較少用于驗證碼處理
  3. 打碼平臺爬蟲常用的驗證碼解決方案

圖片識別引擎

OCR(Optical Character Recognition)是指使用掃描儀或數碼相機對文本資料進行掃描成圖像文件,然后對圖像文件進行分析處理,自動識別獲取文字信息及版面信息的軟件。

什么是tesseract

Tesseract,一款由HP實驗室開發由Google維護的開源OCR引擎,特點是開源,免費,支持多語言,多
平臺。
項目地址:https:/github.com/tesseract-ocr/tesseract

圖片識別引擎環境的安裝

-mac環境下直接執行命令:brew install --with-training-tools tesseract

-windows環境下的安裝可以通過exe安裝包安裝,下載地址:Home · UB-Mannheim/tesseract Wiki · GitHub
安裝完成后記得將Tesseract 執行文件的目錄加入到PATH中,方便后續調用。

配置教程:超詳細解決pytesseract.pytesseract.TesseractNotFoundError: tesseract is not installed or it’s not in yo… - 簡書 (jianshu.com)

  • 從第5步開始看
  • 其中第9步的修改py文件的文件路徑在報錯里可以找到(這個報錯在下面的"使用代碼"執行后可以得到)
  • 當然,如果配置成功就沒有報錯了

-linux環境下的安裝:sudo apt-get install tesseract-ocr

Python庫的安裝

# PIL用于打開圖片文件
pip install pillow
# pytesseract模塊用于從圖片中解析數據
pip install pytesseract

使用代碼

# 圖像識別引擎
from PIL import Image
import pytesseractim = Image.open("圖片路徑")
result = pytesseract.image_to_string(im)
print(result)

其他OCR平臺

微軟Azure 圖像識別:https://azure.microsoft.com/zh-cn/services/cognitive-services/computer-vision/
阿里云圖文識別:https://www.aliyun.com/product/cdi/
騰訊OCR文字識別:https://cloud.tencent.com/product/ocr

國內的識別引擎對于中文的支持會更好

常見的驗證碼的種類

url地址不變,驗證碼不變

這是驗證碼里面非常簡單的一種類型,對應的只需要獲取驗證碼的地址,然后請求,通過打碼平臺識別即可

url地址不變,驗證碼變化

這種驗證碼的類型是更加常見的一種類型,對于這種驗證碼,大家需要思考:在登錄的過程中,假設我輸入的驗證碼是對的,對方服務器是如何判斷當前我輸入的驗證碼是顯示在我屏幕上的驗證碼,而不是其他的驗證碼呢?

在獲取網頁的時候,請求驗證碼,以及提交驗證碼的時候,對方服務器肯定通過了某種手段驗證我之前獲取的驗證碼和最后提交的驗證碼是同一個驗證碼,那這個手段是什么手段呢?

很明顯,就是通過cookie來實現的,所以對應的,在請求頁面,請求驗證碼,提交驗證碼的到時候需要保證cookie的一致性,對此可以使用requests.session來解決

打碼平臺——2Captcha的使用

筆者自己使用的,需要付費;可自行使用其他平臺

網址:https://2captcha.com/zh

以下教程來源:Python驗證碼破解程序——在線識別驗證碼和2Captcha的Anti Captcha API

pip3 install 2captcha-python

TwoCaptcha類實例可按照如下方法創建:

from twocaptcha import TwoCaptchasolver = TwoCaptcha('YOUR_API_KEY')
# 您還能為已創建的實例設置選項:
config = {'server':           '2captcha.com','apiKey':           'YOUR_API_KEY','softId':            123,'callback':         'https://your.site/result-receiver','defaultTimeout':    120,'recaptchaTimeout':  600,'pollingInterval':   10,}
solver = TwoCaptcha(**config)

實例選項

選項默認值說明
服務器‘2captcha.com’API服務器。您可以將注冊賬戶設置為‘rucaptcha.com’。
softId-您將在2Captcha軟件目錄發布后獲得軟件ID
回調函數-驗證碼識別結果會發送至網絡服務器URL,但應先在賬戶的pingback設置中注冊URL
defaultTimeout120除reCAPTCHA外的驗證碼的輪詢超時時間(秒),用于判定模塊嘗試從res.phpAPI端點獲得答案的時間
recaptchaTimeout600reCAPTCHA的輪詢超時時間(秒),用于判定模塊嘗試從res.phpAPI端點獲得答案的時間
pollingInterval10res.phpAPI端點發送請求的間隔時間(秒),不建議設置在5秒以內

重要提示:一旦回調函數確定用于TwoCaptcha實例,那么所有方法都只返回驗證碼ID,無法通過輪詢API獲得結果。結果將發送至回調URL。請通過getResult方法進行人工破解。

您在提交圖片驗證碼時可提出額外選項,以便2Captcha的員工能夠正確破解。

驗證碼選項

選項默認值說明
numeric0判定驗證碼是否由數字或其他符號組成,詳情請見API文檔。
minLength0最小答案長度
maxLength0最大答案長度
phrase0判定答案是否由多個詞語組成
caseSensitive0判定答案是否區分大小寫
calc0確定驗證碼需要計算
lang-確定驗證碼語言,見可用語言列表。
hintImg-所有驗證碼員工可見的提示圖片
hintText-員工可見的驗證碼提示或任務文字

驗證碼類別

您可以利用以下方法繞過normal captcha(帶有扭曲文字的圖片)。這個方法也可用于識別圖片上的任何文字。

result = solver.normal('path/to/captcha.jpg', param1=..., ...)

這種方法可用于繞過需要回答清晰文字問題的驗證碼。

result = solver.text('If tomorrow is Saturday, what day is today?', param1=..., ...)

此方法可破解reCAPTCHA V2,并獲得令牌實現繞過保護。

result = solver.recaptcha(sitekey='6Le-wvkSVVABCPBMRTvw0Q4Muexq1bi0DJwx_mJ-',url='https://mysite.com/page/with/recaptcha',param1=..., ...)

此方法利可破解reCAPTCHA V3,并返回令牌。

result = solver.recaptcha(sitekey='6Le-wvkSVVABCPBMRTvw0Q4Muexq1bi0DJwx_mJ-',url='https://mysite.com/page/with/recaptcha',version='v3',param1=..., ...)

FunCaptcha(Arkoselabs)破解方法,并返回令牌。

result = solver.funcaptcha(sitekey='6Le-wvkSVVABCPBMRTvw0Q4Muexq1bi0DJwx_mJ-',url='https://mysite.com/page/with/funcaptcha',param1=..., ...)

此方法可破解GeeTest拼圖驗證碼,并返回一組JSON格式的令牌。

result = solver.geetest(gt='f1ab2cdefa3456789012345b6c78d90e',challenge='12345678abc90123d45678ef90123a456b',url='https://www.site.com/page/',param1=..., ...)

此方法可破解hCaptcha,并返回可以繞過驗證碼的令牌。

result = solver.hcaptcha(sitekey='10000000-ffff-ffff-ffff-000000000001',url='https://www.site.com/page/', param1=..., ...)

通過令牌形式破解KeyCaptcha。

result = solver.keycaptcha(s_s_c_user_id=10,s_s_c_session_id='493e52c37c10c2bcdf4a00cbc9ccd1e8',s_s_c_web_server_sign='9006dc725760858e4c0715b835472f22-pz-',s_s_c_web_server_sign2='2ca3abe86d90c6142d5571db98af6714',url='https://www.keycaptcha.ru/demo-magnetic/', param1=..., ...)

以令牌形式繞過Capy拼圖驗證碼。

result = solver.capy(sitekey='PUZZLE_Abc1dEFghIJKLM2no34P56q7rStu8v',url='http://mysite.com/',api_server='https://jp.api.capy.me/',param1=..., ...)

Grid法最初名為Old reCAPTCHA V2法,先在圖中畫好網格,點擊特定網格框,以繞過任何類型的驗證碼。這種方法會返回方框數。

result = solver.grid('path/to/captcha.jpg', param1=..., ...)

Canvas法需要圍著圖中物體畫一條線。這種方法會返回一組點坐標,用于繪制多邊形。

result = solver.canvas('path/to/captcha.jpg', param1=..., ...)

ClickCaptcha會返回驗證碼圖片的點坐標,若您需要點擊圖片的特定點,就可以使用這種方法。

result = solver.coordinates('path/to/captcha.jpg', param1=..., ...)

這種方法可破解需要旋轉物體的驗證碼,主要用于繞過FunCaptcha。它會返回旋轉角度。

result = solver.rotate('path/to/captcha.jpg', param1=..., ...)

一些方法&&操作

send / getResult

上述方法可用于人工提交驗證碼和答案輪詢。

import time
. . . . . id = solver.send(file='path/to/captcha.jpg')
time.sleep(20)code = solver.get_result(id)

balance

以此方法獲取賬戶余額:balance = solver.balance()

report

以此方法報告驗證碼答案之優劣。

solver.report(id, True) # captcha solved correctly
solver.report(id, False) # captcha solved incorrectly

如發生錯誤,驗證碼破解程序會提示異常。妥善處理這類情況很重要。我們推薦使用try/except來處理異常。

Try:result = solver.text('If tomorrow is Saturday, what day is today?')
Except ValidationException as e:# invalid parameters passedprint(e)
Except NetworkException as e:# network error occurredprint(e)
Except ApiException as e:# api respond with errorprint(e)
Except TimeoutException as e:# captcha is not solved so farprint(e)

代理

您可以將代理作為參數應用于以下方法:recaptcha、funcaptcha、geetest。代理將被轉發至API以破解驗證碼。

proxy={'type': 'HTTPS','uri': 'login:password@IP_address:PORT'
}

異步回調

您也可以利用asyncio進行異步回調。

import asyncio
import concurrent.futures
from twocaptcha import TwoCaptchacaptcha_result = await captchaSolver(image)async def captchaSolver(image):loop = asyncio.get_running_loop()with concurrent.future.ThreadPoolExecutor() as pool:result = await loop.run_in_executor(pool, lambda: TwoCaptcha(API_KEY).normal(image))return result

使用selenium

完整教程請看:Selenium驗證碼求解器:如何使用反驗證碼2Captcha服務自動繞過reCAPTCHA、hCaptcha、Cloudflare、Arkose labs以及任何驗證碼

from selenium.webdriver.common.by import By
from twocaptcha import TwoCaptcha
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
from selenium import webdriver# 實例化 WebDriver
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))# 加載目標頁面
captcha_page_url = "https://recaptcha-demo.appspot.com/recaptcha-v2-checkbox.php"
driver.get(captcha_page_url)# 解決驗證碼問題
print("Solving Captcha")
solver = TwoCaptcha("2CAPTCHA_API_KEY")
response = solver.recaptcha(sitekey='SITE_KEY', url=captcha_page_url)
代碼 = response['code']
print(f "Successfully solved the Captcha. The solve code is {code}")# 設置已解決的驗證碼
recaptcha_response_element = driver.find_element(By.ID, 'g-recaptcha-response')
driver.execute_script(f'arguments[0].value = "{code}";', recaptcha_response_element)# 提交表單
submit_btn = driver.find_element(By.CSS_SELECTOR, 'button[type="submit"]')
submit_btn.click()# 暫停執行,以便在關閉驅動程序前查看提交后的屏幕情況
輸入("按回車鍵繼續")
driver.close()

2CAPTCHA_API_KEYSITE_KEY 替換為它們的值,然后運行代碼,驗證碼將被破解,你將看到成功界面。

簡單示例

from twocaptcha import TwoCaptcha
import timesolver = TwoCaptcha('your own key')
config = {'server':           '2captcha.com','apiKey':           'your own key','defaultTimeout':    120,'recaptchaTimeout':  600,'pollingInterval':   10,}
solver = TwoCaptcha(**config)
result = solver.normal('captcha.jpg', caseSensitive=1)
id = solver.send(file='captcha.jpg')
time.sleep(20)
code = solver.get_result(id)
print(code)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/16028.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/16028.shtml
英文地址,請注明出處:http://en.pswp.cn/web/16028.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Markdown魔法手冊:解鎖高效寫作的新技能

邊使用邊更新0.0... 文章目錄 一、如何在Markdown中插入表情?二、文字樣式設置1.文本顏色設置2.文本字號設置3.文本字體設置4. 實戰演練5.黃色高亮 一、如何在Markdown中插入表情? 在Markdown中插入表情(emoji)的方法取決于你使用…

如何提升百度小程序的收錄?百度小程序如何做優化?

? 如何通過百度小程序獲得更多的自然流量?這是做百度小程序肯定要考慮的問題,做百度小程序的目的就是想借助百度生態,做相應的關鍵詞給自己的小程序引流,如何把流量給做起來呢,接下來我從不同的方面給大家進行分析講解…

最新ChatGpt Desktop for Mac 安裝使用教程

1. 下載地址 請點擊鏈接下載 ChatGPT Desktop for MacOS 2. 使用要求 MacOS 版本 14需要時M1芯片的,如果你是因特爾的暫時還還不行 就算下載了也會出現下面的異常 3. 獲取權限資格 目前 ChatGPT MacOS Desktop還不是全量開放的, 如果你沒有收到通知說明你還沒…

在 Dockerfile 中遇到了連接到 pypi.org 超時的問題

看起來你在 Dockerfile 中遇到了連接到 pypi.org 超時的問題。這可能是由于網絡連接問題導致的。你可以嘗試以下方法解決這個問題: 1. 更換鏡像源: 有時候 pypi.org 的訪問會受到地理位置或網絡環境的影響,你可以考慮使用國內的鏡像源來代…

Oracle的ROWID解析

目錄 一、ROWID基礎概念二、ROWID的類型三、ROWID的用途四、注意事項五、管理與監控 Oracle的ROWID是一個非常核心的概念,它代表了一行數據在數據庫中的物理位置標識。 一、ROWID基礎概念 唯一性與不變性:ROWID是每行數據的唯一標識符,它在行…

【Spark】調整hive表在HDFS存的每個文件的大小

配置參數: spark.hadoop.hive.exec.orc.default.stripe.size78643200 spark.hadoop.orc.stripe.size78643200 spark.hadoopRDD.targetBytesInPartition78643200 spark.hadoop.hive.exec.dynamic.partition.modenonstrict spark.sql.sources.partitionOverwriteMode…

ipa 覆蓋算法測試

相關文章 ipa 功能包測試 ipa 分區算法 ipa 分區算法總結,部分算法圖解 ipa 覆蓋算法分析(一) ipa 覆蓋算法分析(二) 測試 網上找的地圖: fig.1 測試地圖 opencv fig.2 opencv 顯示的覆蓋路徑 rviz fi…

6.定時器分時復用測量占空比

1.CUBEMAX配置 測量PA6,PA7輸出的占空比,只需要把主要的配置,配置為A6口就行,A7口黃色表示配置不正確,不用管。 2.軟件代碼 TIME.c中找到TIM3的初始化,在后面初始化A7口 void MX_TIM3_Init_PA7(void) {/*…

創新實訓2024.05.25日志:Web應用技術選型

我們的web應用使用python web的fastapi框架,通過uvicorn開啟web服務。 1. refs 官網文檔:FastAPI (tiangolo.com) github:https://github.com/tiangolo/fastapi 2. 環境配置 python:3.11 uvicorn:0.29.0 pip install "uvicorn[stan…

老外賣27刀每月的教程已經更新

用了兩天半的時間,邊學習,邊整理了一份老外的視頻教程,涉及Facebook,YouTube,tiktok等大的流量平臺,有案例,有分析,有如何做。 這個教程是老外講的,沒有什么玄乎的塑造價…

理解矩陣內積與矩陣乘法的區別及其應用

文章目錄 矩陣內積(逐元素乘積)矩陣內積的用途矩陣乘法(矩陣積)矩陣乘法的用途區別總結結論 在數據科學、機器學習、計算機圖形學和圖像處理等領域,矩陣運算是非常基礎且重要的操作。然而,矩陣內積和矩陣乘…

【java程序設計期末復習】chapter3 運算符、表達式和語句

運算符、表達式和語句 Java提供了豐富的運算符,如算術運算符、關系運算符、邏輯運算符、位運算符等。 Java語言中的絕大多數運算符和C語言相同,基本語句,如條件分支語句、循環語句等也和C語言類似,因此,本章就主要知識…

聊聊ChatGPT的本質

這是鼎叔的第九十八篇原創文章。行業大牛和剛畢業的小白,都可以進來聊聊。 階段性總結下我對ChatGPT的基礎理解,算是一篇學習思考筆記吧。其中難免有很多不準確的,或過于簡略的地方,將來再迭代學習。 OpenAI做ChatGPT的底層邏輯…

GitLab的原理及應用詳解(六)

本系列文章簡介: 隨著軟件開發的不斷進步和發展,版本控制系統成為了現代軟件開發過程中不可或缺的一部分。而GitLab作為其中一種流行的版本控制工具,在軟件開發領域享有廣泛的應用。GitLab不僅提供了強大的版本控制功能,還集成了項…

如何利用線程池實現互聯網驗證碼保護服務

如何利用線程池實現互聯網驗證碼保護服務 1、業務背景與實現思路2、代碼實操1、業務背景與實現思路 首先介紹一下業務背景,假設我們的系統是一個短視頻播放網站,每個新加入的用戶都需要注冊賬號并綁定手機號。為了驗證用戶手機的正確性,我們的系統會發送一條驗證碼到用戶注…

HBase到底是列式存儲還是行式存儲?

行存和列存 在行存儲的數據庫系統中,一行中的所有字段值都是連續存儲的;在基于行存儲的表中,即使只需要讀取指定列時,也需要先將對應行的數據讀取到內存,再過濾目標列,這樣會導致過多的磁盤IO、內存和時間…

隊列——鏈式存儲

核心思路: 1、首先定義隊列結點,包含數據域和指針域;然后定義鏈式隊列,包含隊列節點類型的隊頭和隊尾指針。 2、初始化:     帶頭結點:給頭結點分配內存,然后隊頭和隊尾指針指向頭結點&…

每日一題 字符串排序

目錄 1.前言 2.題目解析 3.算法原理 4.代碼實現 1.前言 在編程練習中,字符串的全排列問題是一個經典的算法問題。通過對字符串進行全排列,可以得到該字符串的所有可能的排列組合。本文將探討如何對含有重復字符的字符串進行全排列,并且解決…

K8s的kubectl的基本操作

K8s的kubectl的基本操作 K8s基本信息的查看 查看版本信息 kubectl versio查看資源對象簡寫 kubectl api-resources查看集群信息 kubectl cluster-info配置kubectl自動補全 source <(kubectl completion bash)查看master節點狀態 kubectl get cs查看命名空間 kubectl…