最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

利用Python實現(xiàn)生成并識別圖片驗證碼

 更新時間:2024年02月01日 10:46:59   作者:古明地覺的編程教室  
這篇文章主要為大家的詳細介紹了如何利用Python實現(xiàn)生成并識別圖片驗證碼,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

本次來分享一個關(guān)于驗證碼的知識,在登錄網(wǎng)站時,為了確保是人在操作,一般會要求輸入圖片上的驗證碼。那么這個驗證碼要怎么生成呢?以及在做爬蟲的時候,怎么用機器來識別呢?

圍繞著這兩個問題,我們開始今天的內(nèi)容。

生成驗證碼

所謂驗證碼就是一張圖片,圖片上有一些數(shù)字和字母。所以我們只要生成一張圖片,然后在圖片上寫一些內(nèi)容即可。

使用 PIL 模塊可以非常方便做到這一點,沒有安裝的話,需要執(zhí)行 pip install pillow。

from random import randint, sample
import string
from PIL import Image, ImageFont, ImageDraw


# 隨機生成畫板顏色
bg_color = randint(0, 255), randint(0, 255), randint(0, 255)
# 定義畫板的寬和高
width, height = 200, 80
# 創(chuàng)建畫板對象
im = Image.new("RGB", (width, height), bg_color)
# 創(chuàng)建畫筆對象,接收畫板對象
# 這樣一來,畫筆所畫的內(nèi)容都會顯示在畫板上
draw = ImageDraw.Draw(im)
# 繪制噪點,噪點的數(shù)量一般為 width * height * 0.1
for _ in range(int(width * height * 0.1)):
    # 噪點的橫縱坐標(biāo)
    point_pos = randint(0, width), randint(0, height)
    # 噪點的顏色,盡量也是隨機的
    point_color = randint(0, 255), randint(0, 255), randint(0, 255)
    # 繪制
    draw.point(point_pos, point_color)

# 查看繪制的圖片
im.show()

執(zhí)行代碼,會生成圖片,我們看一下長什么樣子。

可以看到噪點此刻繪制出來了,再為其繪制幾條直線和曲線。

# 直線的長度要從畫板的左邊到畫板的右邊
# 因此左端點要在畫板左側(cè)上下變化,右端點要在畫板右側(cè)上下變化
for _ in range(5):
    left_pos = 0, randint(0, height)
    right_pos = width, randint(0, height)
    line_color = randint(0, 255), randint(0, 255), randint(0, 255)
    # 繪制直線
    draw.line([left_pos, right_pos], line_color)

# 繪制曲線,這里繪制的是一個超出畫板的大圓
# 這樣在畫板上顯示的部分只是大圓的一條弧,看起來就像是一條曲線
for _ in range(5):
    left_pos = (-100, -100)
    right_pos = (width * 5, randint(0, height))
    arc_color = randint(0, 255), randint(0, 255), randint(0, 255)
    draw.arc([left_pos, right_pos], 0, 360, arc_color)

# 查看一下,繪制的圖形長什么樣子
im.show()

直線和曲線也繪制好了,看下效果。

效果還是不錯的,最后我們來繪制文字。

# 驗證碼是由文字和數(shù)字組成,先來獲取所有的數(shù)字和字母
alpha_digit = string.ascii_letters + string.digits
# 驗證碼一般是四個字符,從里面隨機選取4個
verify_code = sample(alpha_digit, 4)
# 生成字體對象
font = ImageFont.truetype("/System/Library/Fonts/Courier.ttc", 40)
# 為四個字符創(chuàng)建四種顏色
text_color = [(randint(0, 255), randint(0, 255), randint(0, 255))
              for _ in range(4)]
# 繪制文字
# 注意:坐標(biāo)加上字體的寬度不要超出畫板,否則顯示不全
draw.text((10, 10), verify_code[0], fill=text_color[0], font=font)
draw.text((60, 25), verify_code[1], fill=text_color[1], font=font)
draw.text((110, 15), verify_code[2], fill=text_color[2], font=font)
draw.text((150, 25), verify_code[3], fill=text_color[3], font=font)

# 繪制完成,最后再查看一下
im.show()

到此我們的驗證碼就生成完畢了,那么效果如何呢?我們查看一下。

整體來看還湊合,你也可以對背景色,以及文字的顏色進行調(diào)整。如果覺得背景里的噪點、線段不太好,也可以將它們?nèi)サ簟?/p>

最后再來說說保存,代碼中的 im.show() 實際上是打開了一個臨時文件,我們?nèi)绾螌⑺4嫦聛砟兀?/p>

# 可以輸入一個路徑,然后保存成指定的文件
# 不過更常見的做法是拿到圖片的字節(jié)流,然后直接對字節(jié)流進行渲染
from io import BytesIO
buf = BytesIO()
im.save(buf, "png")
# 此時圖片內(nèi)容就保存在了 buf 中
print(buf.getvalue()[: 6] == b"\x89PNG\r\n")  # True

以上就是繪制驗證碼的過程,代碼是分塊展示的,你可以將它們合在一起,測試一下。

識別驗證碼

說完了生成驗證碼,那么如何識別驗證碼呢?Python 有一個第三方庫 ddddocr,可以幫我們識別,直接 pip install ddddocr 安裝即可。

我們目前已經(jīng)生成了一張驗證碼:

這里補充一句,我們上面生成的驗證碼圖片,在顏色上設(shè)計的不太好,因為背景色和文字顏色都是隨機的,這就導(dǎo)致當(dāng)顏色相近時,看不清文字內(nèi)容。

而當(dāng)文字顏色和背景色比較接近時,ddddocr 識別的準(zhǔn)確率就會降低很多,特別是背景中還有噪點和線段作為干擾。不過一般來說網(wǎng)站的驗證碼圖片都是經(jīng)過設(shè)計的,背景色和文字顏色區(qū)別還是比較大的,所以不用擔(dān)心。

我們測試一下:

import ddddocr

with open("code.png", "rb") as f:
    data = f.read()

# show_ad 默認為 True,執(zhí)行時會輸出一些廣告,我們不讓它輸出
ocr = ddddocr.DdddOcr(show_ad=False)
code = ocr.classification(data)
print(code)  # 7abf

結(jié)果沒有問題,識別出來了。

到此這篇關(guān)于利用Python實現(xiàn)生成并識別圖片驗證碼的文章就介紹到這了,更多相關(guān)Python圖片驗證碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python捕獲全局的KeyboardInterrupt異常的方法實現(xiàn)

    Python捕獲全局的KeyboardInterrupt異常的方法實現(xiàn)

    KeyboardInterrupt異常是Python中的一個標(biāo)準(zhǔn)異常,它通常發(fā)生在用戶通過鍵盤中斷了一個正在運行的程序,本文主要介紹了Python捕獲全局的KeyboardInterrupt異常的方法實現(xiàn),感興趣的可以了解一下
    2024-08-08
  • Python使用PyCrypto實現(xiàn)AES加密功能示例

    Python使用PyCrypto實現(xiàn)AES加密功能示例

    這篇文章主要介紹了Python使用PyCrypto實現(xiàn)AES加密功能,結(jié)合具體實例形式分析了PyCrypto實現(xiàn)AES加密的操作步驟與相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2017-05-05
  • Python3.5實現(xiàn)的羅馬數(shù)字轉(zhuǎn)換成整數(shù)功能示例

    Python3.5實現(xiàn)的羅馬數(shù)字轉(zhuǎn)換成整數(shù)功能示例

    這篇文章主要介紹了Python3.5實現(xiàn)的羅馬數(shù)字轉(zhuǎn)換成整數(shù)功能,涉及Python字符串遍歷與數(shù)值運算相關(guān)操作技巧,需要的朋友可以參考下
    2019-02-02
  • 使用Python批量處理Excel文件并轉(zhuǎn)為csv文件示例

    使用Python批量處理Excel文件并轉(zhuǎn)為csv文件示例

    這篇文章主要介紹了使用Python批量處理Excel文件并轉(zhuǎn)為csv文件示例,文中通過代碼示例給大家介紹非常詳細,對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2023-12-12
  • python中使用正則表達式的連接符示例代碼

    python中使用正則表達式的連接符示例代碼

    在正則表達式中,匹配數(shù)字或者英文字母的書寫非常不方便。因此,正則表達式引入了連接符“-”來定義字符的范圍,下面這篇文章主要給大家介紹了關(guān)于python中如何使用正則表達式的連接符的相關(guān)資料,需要的朋友可以參考下。
    2017-10-10
  • python 寫一個性能測試工具(一)

    python 寫一個性能測試工具(一)

    這篇文章主要介紹了利用python 寫一個性能測試工具,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-10-10
  • Python?time三種時間轉(zhuǎn)換小結(jié)

    Python?time三種時間轉(zhuǎn)換小結(jié)

    本文主要介紹了Python?time三種時間轉(zhuǎn)換小結(jié),主要包括時間戳,結(jié)構(gòu)化時間,字符串時間,文中根據(jù)實例編碼詳細介紹的十分詳盡,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Django中url與path及re_path的區(qū)別說明

    Django中url與path及re_path的區(qū)別說明

    這篇文章主要介紹了Django中url與path及re_path的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • python中pycryptodome模塊實現(xiàn)加密算法庫

    python中pycryptodome模塊實現(xiàn)加密算法庫

    PyCryptodome提供了許多密碼學(xué)算法和協(xié)議的實現(xiàn),包括對稱加密、非對稱加密、消息摘要、密碼哈希、數(shù)字簽名等,本文主要介紹了python中pycryptodome模塊實現(xiàn)加密算法庫,感興趣的可以了解一下
    2023-11-11
  • python多進程提取處理大量文本的關(guān)鍵詞方法

    python多進程提取處理大量文本的關(guān)鍵詞方法

    今天小編就為大家分享一篇python多進程提取處理大量文本的關(guān)鍵詞方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06

最新評論

横峰县| 西昌市| 景东| 巨野县| 德格县| 宣威市| 波密县| 涞水县| 怀宁县| 邯郸县| 清新县| 商城县| 长葛市| 岳阳县| 南皮县| 怀安县| 台湾省| 喜德县| 邢台市| 浦北县| 平陆县| 九龙县| 新民市| 宽城| 龙门县| 保德县| 苍南县| 广丰县| 通江县| 奉新县| 东城区| 泗水县| 彭州市| 福海县| 资阳市| 若尔盖县| 洪洞县| 乌拉特中旗| 龙州县| 离岛区| 南开区|