首頁 > 軟體

python爬蟲模擬登入之圖片驗證碼實現詳解

2022-08-05 14:02:29

我們在用爬蟲對入口網站進行模擬登入是總會有輸入圖片驗證碼的,例如這種

那我們怎麼解決這個問題實現全自動的模擬登入呢?只要思想不滑坡,辦法總比困難多。我這裡使用的是百度智慧雲裡面的文字識別功能,每天好像可以免費使用個幾百次,識別效果也還行,對一般人而言是夠用了。

接下來說說,怎麼使用。

首先,開啟百度智慧雲(https://cloud.baidu.com/)進行登入,再進入人工智慧->文字識別裡建立應用。

在使用名稱和底下應用描述隨便寫寫,然後點立即建立。 

 建立完成,就可以拿到 AppID 、API Key 、Secret Key

之後要在pycharm下載baidu-aip,然後匯入AipOcr包。

from aip import AipOcr       #aip在baidu-aip中

 再然後就是初始化百度API

#百度API
APP_ID = '你的之前拿到的AppID'
API_KEY = '你的之前拿到的API Key'
Secret_Key = '你的之前拿到的Secret Key'

我們先要把 圖片驗證碼下載下來進行二值化處理,這樣識別的準確率高一些。

這裡要下載pillow庫,然後匯入Image包

from PIL import Image         #PIL在pillow庫中
    #圖片處理
    # 二值化處理 灰度閾值設為127,高於這個值的點全部填白色
    img_old = Image.open('code.jpg')
    img_old = img_old.convert('L') # 灰度圖 模式「L」 每個畫素用8個bit表示,0表示黑,255表示白
    threshld = 127 #設定閾值,圖片的畫素範圍(0,255)
    table = []
    for i in range(256):
        if i <threshld:
            table.append(0)
        else:
            table.append(1)
    img_old = img_old.point(table,'1') # 對影象畫素操作 模式「1」 為二值影象,非黑即白。但是它每個畫素用8個bit表示,0表示黑,255表示白
    img_old.save('code.jpg')

對於那些有干擾線,特別還是明暗交替的圖片驗證碼來說,這樣很好的避免了被幹擾。

這裡的圖片中沒有太多幹擾線且也沒有明暗交替所以看起來不明顯,只是想讓大家看看對比。

處理前                                                                                                                       處理後

後面就是呼叫baidu_aip來讀取圖片中的內容。baidu_aip.handwriting

    #讀取處理後的驗證碼
    with open('code.jpg','rb') as fp:
        img_new = fp.read()
    baidu_aip = AipOcr(APP_ID,API_KEY,Secret_Key)
    result = baidu_aip.handwriting(img_new)   #使用的是識別手寫文字,返回一個字典,其中words_result是一個列表,裡面有識別結果也是一個字典
    print('驗證碼是:',result['words_result'][0]['words'])

 baidu_aip.handwriting這裡面有很多識別文字的方法,我用的是識別手寫文字,如果大家使用這個方法感覺效果不好可以選擇其他方法。

最後是完整的程式碼。

# -- coding:UTF-8 --
import requests
from PIL import Image
from aip import AipOcr
 
 
 
 
if __name__ == "__main__":
    #百度API
    APP_ID = '你的之前拿到的AppID'
    API_KEY = '你的之前拿到的API Key'
    Secret_Key = '你的之前拿到的Secret Key'
 
    headers = {
        "user-agent": "Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 97.0.4692.71Safari / 537.36Edg / 97.0.1072.55"
    }
    url = 'http://www.hyocr.com/captcha.php'
    #下載驗證碼圖片
    session = requests.session()
    img_data = session.get(url=url,headers=headers).content
    with open('./code.jpg','wb') as fp:
        fp.write(img_data)
    #圖片處理
    # 二值化處理 灰度閾值設為127,高於這個值的點全部填白色
    img_old = Image.open('code.jpg')
    img_old = img_old.convert('L') # 灰度圖 模式「L」 每個畫素用8個bit表示,0表示黑,255表示白
    threshld = 127 #設定閾值,圖片的畫素範圍(0,255)
    table = []
    for i in range(256):
        if i <threshld:
            table.append(0)
        else:
            table.append(1)
    img_old = img_old.point(table,'1') # 對影象畫素操作 模式「1」 為二值影象,非黑即白。但是它每個畫素用8個bit表示,0表示黑,255表示白
    img_old.save('code.jpg')
 
    #讀取處理後的驗證碼
    with open('code.jpg','rb') as fp:
        img_new = fp.read()
    baidu_aip = AipOcr(APP_ID,API_KEY,Secret_Key)
    result = baidu_aip.handwriting(img_new)   #使用的是識別手寫文字,返回一個字典,其中words_result是一個列表,裡面有識別結果也是一個字典
    print('驗證碼是:',result['words_result'][0]['words'])

這只是百度智慧雲裡面的一個小功能,還有很多其他的功能,大家感興趣可以去看看百度智慧雲裡面的官方檔案 ,還有視訊教學。

總結

到此這篇關於python爬蟲模擬登入之圖片驗證碼實現的文章就介紹到這了,更多相關python爬蟲圖片驗證碼內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com