1. 程式人生 > 實用技巧 >文字識別還能這樣用?通過Python做文字識別到破解圖片驗證碼

文字識別還能這樣用?通過Python做文字識別到破解圖片驗證碼

前期準備

1. 安裝包,直接在終端上輸入pip指令即可:

# 傳送瀏覽器請求
pip3 install requests
# 文字識別
pip3 install pytesseract
# 圖片處理
pip3 install Pillow

PS:如有需要Python學習資料的小夥伴可以加下方的群去找免費管理員領取

可以免費領取原始碼、專案實戰視訊、PDF檔案等

2. 新建專案

需要的模組安裝好後,新建一個專案wordsDistinguish。

在專案包下新建三個.py檔案

test_pytesseract 和 test_pillow、case_verification。

test_pytesseract:模組 pytesseract 的基本使用測試

test_pillow:模組 Pillow 的基本使用測試
case_verification:實戰案例,破解網站圖片驗證碼驗證

涉及知識

1.Pillow 中的 Image

Python影象庫中最重要的類是 Image,在模組中定義的具有相同名稱的類。

可以通過多種方式建立此類的例項; 通過從檔案載入影象,處理其他影象或從頭開始建立影象。

# -*- coding: utf-8 -*-


# 注意:print_function的匯入必須在Image之前,否則會報錯
from __future__ import print_function
from PIL import Image
""" pillow 模組 中 Image 的基本使用 """ # 1.開啟圖片 im = Image.open("../wordsDistinguish/test1.jpg") print(im) # 2.檢視圖片檔案內容 print("圖片檔案格式:"+im.format) print("圖片大小:"+str(im.size)) print("圖片模式:"+im.mode) # 3.顯示當前圖片物件 im.show() # 4.修改圖片大小,格式,儲存 size = (50, 50) im.thumbnail(size) im.save("1.jpg", "PNG") # 5.圖片模式轉化並儲存,L 表示灰度 RGB 表示彩色
im = im.convert("L") im.save("test1.jpg")

2. 基於 Tesseract-OCR 的 pytesseract

Python-tesseract是python的光學字元識別(OCR)工具。也就是說,它將識別並“讀取”嵌入影象中的文字。

Python-tesseract是Google的Tesseract-OCR引擎的包裝器。

它作為獨立的呼叫指令碼也很有用,因為它可以讀取Pillow和Leptonica成像庫支援的所有影象型別,包括jpeg,png,gif,bmp,tiff等。

此外,如果用作指令碼,Python-tesseract將列印已識別的文字,而不是將其寫入檔案。

要在你的電腦上使用pytesseract模組,你還需要安裝 Tesseract-OCR ,Mac上安裝該工具我比較建議使用Homebrew,安裝好後,直接在終端輸入下面指令即可:

Windows下安裝的話直接下載包即可,然後把其加入系統環境變數(即加入Path裡),比較傻白甜,可以百度一下。

# -*- coding: utf-8 -*-

# 從 Pillow 中匯入圖片處理模組 Image
from PIL import Image
# 匯入基於 Tesseract 的文字識別模組 pytesseract
import pytesseract
"""
@pytesseract:https://github.com/madmaze/pytesseract
"""

# 開啟圖片
im = Image.open("../wordsDistinguish/Resources/1.jpg")
# 識別圖片內容
text = pytesseract.image_to_string(im)
print(text)

小專案:破解圖片驗證碼登陸

目標網站:https://so.gushiwen.org

1. 準備過程

登入過程中需要輸入三個資料:賬號、密碼、驗證碼,首先在瀏覽器內實際登入一次,按F12檢視登入流程。

輸入賬號密碼,和驗證碼,點選登入,注意Network內的變化。

登入後,分析Network內載入的網頁我們發現,在login.aspx裡,傳遞了我們的登入資訊。

這是關鍵,意味著我們只要把資料通過這個地址傳遞給伺服器就可以實現登入了。

2. 程式碼敲起來

現在模擬登入過程的難點主要有:驗證碼的識別和傳遞。

a.驗證碼識別我們根據前面的知識知識裡的,直接採用pytesseract模組。b.登入引數傳遞,利用requests庫傳送post請求即可,問題是如何把驗證碼和登入聯絡起來.

通過前面分析我們知道

驗證碼是在

“https://so.gushiwen.org/RandCode.ashx”裡生成的,

而登入頁面是

“https://so.gushiwen.org/user/login.aspx”,分析發現。

正常瀏覽器登入這兩個網址的cookie是一致的,並且都帶有時間戳,所以,只要在程式碼請求時保證兩者的cookie一致即可,這裡我們利用requests庫的session方法可以實現。

# -*- coding: utf-8 -*-

# 從 Pillow 中匯入圖片處理模組 Image
from PIL import Image
# 匯入基於 Tesseract 的文字識別模組 pytesseract
import pytesseract
# 匯入傳送網路請求的庫 requests
import requests
# 匯入正則庫 re
import re
"""
模擬登入,破解字母數字圖片驗證碼
目標網站:https://so.gushiwen.org
"""
# 請求頭
headers = {
        "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Safari/537.36"
    }
# 通過requests 建立一個 session 會話,保持兩次訪問 cookie 值相同
session = requests.session()


# 下載識別驗證碼圖片函式
def get_verification():
    # 生成驗證碼圖片url
    url = "https://so.gushiwen.org/RandCode.ashx"
    # 通過session傳送get請求,獲取驗證碼
    resp = session.get(url, headers=headers)
    # 將驗證碼保證到本地
    with open(r"../wordsDistinguish/Resources/test.jpg", 'wb') as f:
        f.write(resp.content)
    # 開啟驗證碼圖片檔案
    im = Image.open(r"../wordsDistinguish/Resources/test.jpg")
    # 基本處理,灰度處理,提升識別準確率
    # 儲存處理後的圖片
    im.save("test.jpg")
    # 利用pytesseract進行圖片內容識別
    text = pytesseract.image_to_string(im)
    # 去除識別結果中的非數字/字母內容
    text = re.sub("\W", "", text)
    # 返回驗證碼內容
    return text


def do_login():

    i = 0   # 識別錯誤次數
    # 獲取驗證碼
    captcha = get_verification()
    # 基本檢驗,驗證碼位數必須為四位
    while len(captcha) != 4:
        captcha = get_verification()
        i = i + 1  # i+=1
        print("第%d次識別錯誤" % i)

    print("開始登入,驗證碼為:"+captcha)
    # 傳遞的登入引數
    data = {
        "from": "http://so.gushiwen.org/user/collect.aspx",
        "email": "你的註冊郵箱",
        "pwd": "你的登入密碼",
        "code": captcha,
        "denglu": "登入"
    }
    # 登入地址
    url = "https://so.gushiwen.org/user/login.aspx"
    # 利用 session 傳送post請求
    response = session.post(url, headers=headers, data=data)
    # 列印登入後的狀態碼
    print(response.status_code)
    # 儲存登入後的頁面內容,進一步確認是否登入成功
    with open("gsww.html", encoding="utf-8", mode="w") as f:
        f.write(response.content.decode())


# 開始程式
if __name__ == "__main__":
    do_login()

3. 執行結果

a.控制檯顯示一次驗證成功,返回狀態碼為:200,訪問正常。

b.進一步檢查,對獲取到的原始碼進行檢查

我們在瀏覽器觀察登入後的頁面發現,只有登入後的頁面才有賬號管理模組。

其中有使用者的唯一標識:繫結郵箱的後幾位,我的是[email protected]

所以在我們獲取的原始碼裡直接搜尋[email protected]即可查明是否登入成功,我們發現可以查詢到,即模擬登入成功了。

本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯絡我們以作處理。

文章來源於簡說Python

作者:老表