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

Python反爬機制-驗證碼功能的具體實現(xiàn)過程

 更新時間:2022年02月22日 10:35:47   作者:Bruce_Liuxiaowei  
Tesseract-OCR是一個免費、開源的OCR引擎,通過該引擎可以識別圖片中的驗證碼,這篇文章主要介紹了Python反爬機制-驗證碼的示例代碼,需要的朋友可以參考下

識別驗證碼

? OCR(Optical Character Recognition)即光學字符識別技術,專門用于對圖片文字進行識別,并獲取文本。字符驗證碼的特點就是驗證碼中包含數(shù)字、字母或者摻雜著斑點與混淆曲線的圖片驗證碼。識別此類驗證碼,首先需要找到驗證碼驗證碼圖片在網頁HTML代碼中的位置,然后將驗證碼下載,最后再通過OCR技術進行驗證碼的識別工作。

1. 字符驗證碼

1.1 OCR環(huán)境

? Tesseract-OCR是一個免費、開源的OCR引擎,通過該引擎可以識別圖片中的驗證碼,搭建OCR的具體步驟如下:

? (1)這里以macOS操作系統(tǒng)為例,使用brew install安裝tesseract,命令如下:

liuxiaowei@MacBookAir ~ % brew install --with-training-tools tesseract    # 同時安裝附加組件

安裝完畢后用如下命令測試,示例代碼如下:

liuxiaowei@MacBookAir ~ % tesseract -v
tesseract 5.0.1
 leptonica-1.82.0
  libgif 5.2.1 : libjpeg 9d : libpng 1.6.37 : libtiff 4.3.0 : zlib 1.2.11 : libwebp 1.2.1 : libopenjp2 2.4.0
 Found AVX2
 Found AVX
 Found FMA
 Found SSE4.1
 Found libarchive 3.5.2 zlib/1.2.11 liblzma/5.2.5 bz2lib/1.0.8 liblz4/1.9.3 libzstd/1.5.0
 Found libcurl/7.77.0 SecureTransport (LibreSSL/2.8.3) zlib/1.2.11 nghttp2/1.42.0

? (2)安裝tesseract模塊,安裝命令如下:

pip install tesseract

說 明

如果使用的的是Anaconda并在安裝tesseract模塊時出現(xiàn)錯誤,可以使用如下命令:

conda install -c simonflueckiger tesseract

1.2 下載驗證碼圖片

以下面地址對應的網頁為例,下載網頁中的驗證碼圖片,具體步驟如下:

測試頁面地址:http://sck.rjkflm.com:666/spider/word/

(1)使用瀏覽器打開測試網頁的地址,將顯示如下圖片所示的字符驗證碼:

? (2)打開瀏覽器開發(fā)者工具,然后在HTML代碼中獲取驗證碼圖片所在的位置,如下圖所示:

? (3) 對目標網頁發(fā)送網絡請求,并在返回的HTML代碼中獲取圖片的下載地址,然后下載驗證碼圖片。代碼如下:

#_*_coding:utf-8_*_
# 作者      :liuxiaowei
# 創(chuàng)建時間   :2/15/22 7:47 PM
# 文件      :獲取HTML代碼中地址下載驗證碼圖片.py
# IDE      :PyCharm

# 導入網絡請求模塊
import requests
# 導入urllib.request模塊
import urllib.request
# 導入隨機請求頭
from fake_useragent import UserAgent

# 導入ssl,否則ssl驗證錯誤
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
# 導入解析HTML的模塊
from bs4 import BeautifulSoup
# 創(chuàng)建隨機請求頭
header = {'User-Agent':UserAgent().random}
# 網頁請求地址
url = 'http://sck.rjkflm.com:666/spider/word/'
# 發(fā)送網絡請求
resp = requests.get(url, header)
resp.encoding = 'utf-8'

# 解析HTML
html = BeautifulSoup(resp.text, 'html.parser')
src = html.find('img').get('src')
# 組合驗證碼圖片請求地址
img_url = url+src
# 下載并設置圖片名稱
urllib.request.urlretrieve(img_url, 'code.png')

程序運行后項目文件夾中自動生成驗證碼圖片,結果如下圖:

1.3 識別驗證碼

? 驗證碼下載完成以后, 如果沒有安裝pillow模塊,需要通過“pip install pillow“命令安裝一下,如果tesserocr模塊沒安裝也要通過"pip install tesserocr"先安裝,然后導入tesserocr與Image模塊,再通過Image.open()方法打開驗證碼圖片,接著通過tesserocr.image_to_text()函數(shù)識別圖片中的驗證碼信息即可。示例代碼如下:

#_*_coding:utf-8_*_
# 作者      :liuxiaowei
# 創(chuàng)建時間   :2/16/22 7:21 AM
# 文件      :識別圖中驗證碼.py
# IDE      :PyCharm

# 導入tesserocr模塊
import  tesserocr
# 導入圖像處理模塊
from PIL import Image
# 打開驗證碼圖片
img = Image.open('code.png')
# 將圖片中的驗證碼轉換為文本
code = tesserocr.image_to_text(img)

print('驗證碼為: ', code)

程序運行結果如下:

驗證碼為:  uuuc
Process finished with exit code 0

? OCR的識別技術雖然很強大,但是并不是所有的驗證碼都可以這么輕松地識別出來,如下圖所示的驗證碼中就會摻雜很多干擾線條,那么在識別這樣的驗證碼信息時,就需要對驗證碼圖片進行相應的處理并識別。

如果直接通過OCR識別,識別結果將會受到干擾線的影響,下面通過OCR直接識別測試一下效果。示例代碼如下:

#_*_coding:utf-8_*_
# 作者      :liuxiaowei
# 創(chuàng)建時間   :2/16/22 8:23 AM
# 文件      :識別帶干擾線的驗證碼.py
# IDE      :PyCharm

import tesserocr        # 導入tesserocr模塊
from PIL import Image   # 導入圖像處理模塊
img =Image.open('code2.jpg')   # 打開驗證碼圖片
img = img.convert('L')         # 將彩色圖片轉換為灰度圖片
img.show()                     # 顯示灰度圖片
code = tesserocr.image_to_text(img)        # 將圖片中的驗證碼轉換為文本
print('驗證碼為:',code)

? 程序運行結果如下:

驗證碼為: YSGN.       # 多了一個.
Process finished with exit code 0

? 通過以上測試發(fā)現(xiàn),直接通過OCR技術識別后的驗證碼中多了一個‘.’,遇到此類情況手寫可以將彩色的驗證碼圖片轉為灰度圖片在測試一下。示例代碼如下:

#_*_coding:utf-8_*_
# 作者      :liuxiaowei
# 創(chuàng)建時間   :2/16/22 8:29 AM
# 文件      :將彩色驗證碼圖片轉為灰度圖片測試.py
# IDE      :PyCharm

import tesserocr        # 導入tesserocr模塊
from PIL import Image   # 導入圖像處理模塊
img =Image.open('code2.jpg')   # 打開驗證碼圖片
img = img.convert('L')         # 將彩色圖片轉換為灰度圖片
img.show()                     # 顯示灰度圖片
code = tesserocr.image_to_text(img)        # 將圖片中的驗證碼轉換為文本
print('驗證碼為:',code)

? 程序運行結果如下:

驗證碼為: YSGN.  # 依然多一個‘.‘
Process finished with exit code 0

接下來需要將轉為灰度的驗證碼圖片進行二值化處理,將驗證碼二值化處理后再次通過OCR進行識別。示例代碼如下:

#_*_coding:utf-8_*_
# 作者      :liuxiaowei
# 創(chuàng)建時間   :2/16/22 8:38 AM
# 文件      :將驗證碼圖片二值化處理.py
# IDE      :PyCharm

import tesserocr        # 導入tesserocr模塊
from PIL import Image   # 導入圖像處理模塊
img =Image.open('code2.jpg')   # 打開驗證碼圖片
img = img.convert('L')         # 將彩色圖片轉換為灰度圖片
t = 155                        # 設置閥值
table = []                     # 二值化數(shù)據的列表
for i in range(256):          # 循環(huán)遍歷
    if i <t:
        table.append(0)
    else:
        table.append(1)
img = img.point(table,'1')     # 將圖片進行二值化處理
img.show()                     # 顯示處理后圖片
code = tesserocr.image_to_text(img)   # 將圖片中的驗證碼轉換為文本
print('驗證碼為:',code)              # 打印驗證碼

? 程序運行后將自動顯示二值化處理后的驗證碼圖片

程序運行結果如下:

驗證碼為: YSGN
Process finished with exit code 0

說 明

在識別以上具有干擾線的驗證碼圖片時,我們可以做一些灰度和二值化處理,這樣可以提高圖片的驗證碼的識別度,如果二值化處理后還是無法識別到精確性,可以適當?shù)纳舷抡{節(jié)二值化操作的闕值。

2. 第三方驗證碼識別

? 針對OCR識別率和準確度不高的缺點,使用第三方驗證碼識別平臺是一個不錯的選擇,不僅可以解決驗證碼識別率低低問題,還可以提高驗證碼識別的準確度。第三方平臺識別驗證碼非常簡單,平臺提供了完善的API接口,根據平臺對應的開發(fā)文檔即可完成快速開發(fā)的需求,但每次驗證碼成功識別后平臺會收取少量費用。

? 驗證碼識別平臺一般分為兩種,分別是打碼平臺和AI開發(fā)者平臺。打碼平臺主要是由在線人員進行驗證碼的識別工作,然后在較短的時間內返回結果。AI開發(fā)者平臺主要是由人工智能來進行識別。例如,百度AI。

下面以打碼平臺為例,演示驗證碼識別的具體過程。

? (1)在瀏覽器中打開打碼平臺網頁(http://www.chaojiying.com/),并且單擊首頁的“用戶注冊”按鈕,如圖所示:

(2) 然后在用戶中心頁面中填寫注冊賬號的基本信息。如下圖:

說 明

賬號注冊完成以后可以聯(lián)系平臺的客服人員,申請免費測試的題分。

(3) 賬號注冊完成以后,在網頁的頂部導航欄中選擇“開發(fā)文檔”,然后在常用開發(fā)語言示例下載中選擇“Python“語言,如下圖所示:

(4) 在Python語音Demo下載頁面中,查看注意事項,然后單擊“點擊這里下載”超鏈接即可下載示例代碼,如圖所示:

(5)平臺提供的示例代碼中,已經將所有需要用到的功能代碼進行了封裝處理,封裝的代碼如下:

#_*_coding:utf-8_*_
# 作者      :liuxiaowei
# 創(chuàng)建時間   :2/16/22 10:01 AM
# 文件      :平臺提供識別封裝代碼.py
# IDE      :PyCharm

import requests            # 網絡請求模塊
from hashlib import md5    # 加密
class Chaojiying_Client(object):
    def __init__(self, username, password, soft_id):
        self.username = username               # 自己注冊的賬號
        password =  password.encode('utf8')    # 自己注冊的密碼
        self.password = md5(password).hexdigest()
        self.soft_id = soft_id                 # 軟件id
        self.base_params = {                   # 組合表單數(shù)據
            'user': self.username,
            'pass2': self.password,
            'softid': self.soft_id,
        }
        self.headers = {                        # 請求頭信息
            'Connection': 'Keep-Alive',
            "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36"
    def PostPic(self, im, codetype):
        """
        im: 圖片字節(jié)
        codetype: 題目類型 參考 http://www.chaojiying.com/price.html
        params = {
            'codetype': codetype,
        params.update(self.base_params)          # 更新表單參數(shù)
        files = {'userfile': ('code2.jpg', im)}    # 上傳驗證碼圖片
        # 發(fā)送網絡請求
        r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files, headers=self.headers)
        return r.json()   # 返回響應數(shù)據
    def ReportError(self, im_id):
        im_id:報錯題目的圖片ID
            'id': im_id,
        params.update(self.base_params)
        r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers)
        return r.json()
if __name__ == '__main__':
    #用戶中心>>軟件ID 生成一個替換 96001
    chaojiying = Chaojiying_Client('超級鷹用戶名', '超級鷹用戶名的密碼', '928939')
    im = open('a.jpg', 'rb').read()  #本地圖片文件路徑 來替換 a.jpg 有時WIN系統(tǒng)須要//
    #1902 驗證碼類型  官方網站>>價格體系 3.4+版 print 后要加()
    print(chaojiying.PostPic(im, 1902))

? (6)使用平臺示例代碼中所提供的驗證碼圖片,運行以上示例代碼,運行結果如下:

{'err_no': 0, 'err_str': 'OK', 'pic_id': '9168810337948200001', 'pic_str': '7261', 'md5': '345c80a5dba345c219cc8893f19b496c'}
Process finished with exit code 0

? 說 明

程序運行結果中pic_str對應的值為返回的驗證碼識別信息。

? 在發(fā)送識別驗證碼的網絡請求時,代碼中的“1902”表示驗證碼的類型,該平臺所支持的常用驗證碼類型如下表:

? 常用驗證碼類型

驗證碼類型驗證碼描述1902常見4-6位英文數(shù)字1101-10201-20位英文數(shù)字2001-20071-7位純漢字3004-30121-12位純英文4004-41111-11位純數(shù)字5000不定長漢字英文數(shù)字51088位英文數(shù)字(包含字符)5201拼音首字母,計算題,成語混合5211集裝箱號4位字母7位數(shù)字6001計算題6003復雜計算題

說 明

表中之列出了比較常用的驗證碼識別類型,詳細內容可查驗證碼平臺官網

3. 滑動拼圖驗證碼

? 滑動拼圖驗證碼是在滑動驗證碼的基礎上增加了滑動距離的校驗,用戶需要將圖形滑塊滑動至主圖空缺滑塊的位置,才能通過校驗。下面通過案例測試,實現(xiàn)滑動拼圖驗證碼的自動校驗。測試網頁地址:http://sck.rjkflm.com:666/spider/jgsaw/

? (1) 使用瀏覽器打開測試頁的地址,將顯示如圖所示的滑動拼圖驗證碼。

(2) 打開瀏覽器開發(fā)者工具,單擊按鈕滑塊,然后在HTML代碼中依次獲取“按鈕滑塊”“圖形滑塊”以及“空缺滑塊”所對應的HTML代碼標簽所在的位置。

驗證碼類型驗證碼描述
1902常見4-6位英文數(shù)字
1101-10201-20位英文數(shù)字
2001-20071-7位純漢字
3004-30121-12位純英文
4004-41111-11位純數(shù)字
5000不定長漢字英文數(shù)字
51088位英文數(shù)字(包含字符)
5201拼音首字母,計算題,成語混合
5211集裝箱號4位字母7位數(shù)字
6001計算題
6003復雜計算題

(3)驗證成功后的按鈕滑塊”“圖形滑塊”以及“空缺滑塊”位置變化如下所示

# 圖形滑塊
<div class="verify" style="display: block; top: 30.2081px; background-position: -173.893px -30.2081px; left: 10px;"></div>
# 按鈕滑塊
<span class="swiper" style="left: 0px;"></span>

? (4) 通過按鈕滑塊的left值可以確認需要滑動的距離,接下來只需要使用selenium框架模擬滑動的工作即可。實現(xiàn)代碼如下:

#_*_coding:utf-8_*_
# 作者      :liuxiaowei
# 創(chuàng)建時間   :2/16/22 5:19 PM
# 文件      :使用selenium框架模擬滑動圖塊.py
# IDE      :PyCharm

from selenium import webdriver  # 導入webdriver
import re                       # 導入正則模塊

driver = webdriver.Chrome()     # 谷歌瀏覽器
driver.get('http://sck.rjkflm.com:666/spider/jigsaw/')   # 啟動網頁
swiper = driver.find_element_by_xpath(
    '/html/body/div/div[2]/div[2]/span[1]')   # 獲取按鈕滑塊
action = webdriver.ActionChains(driver)       # 創(chuàng)建動作
action.click_and_hold(swiper).perform()       # 單擊并保證不松開
# 滑動0距離,不松手,不執(zhí)行該動作無法獲取圖形滑塊left值
action.move_by_offset(0,0).perform()
# 獲取圖形滑塊樣式
verify_style = driver.find_element_by_xpath(
    '/html/body/div/div[2]/div[1]/div[1]').get_attribute('style')
# 獲取空缺滑塊樣式
verified_style = driver.find_element_by_xpath(
    '/html/body/div/div[2]/div[1]/div[2]').get_attribute('style')
# 獲取空缺滑塊left值
verified_left =float(re.findall('left: (.*?)px;',verified_style)[0])
# 獲取圖形滑塊left值
verify_left =float(re.findall('left: (.*?)px;',verify_style)[0])
action.move_by_offset(verified_left-verify_left,0) # 滑動指定距離
action.release().perform()                         # 松開鼠標

程序運行如下圖顯示:

總 結

到此這篇關于Python反爬機制-驗證碼的文章就介紹到這了,更多相關Python驗證碼反爬內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • python實現(xiàn)數(shù)字炸彈游戲

    python實現(xiàn)數(shù)字炸彈游戲

    這篇文章主要為大家詳細介紹了python實現(xiàn)數(shù)字炸彈游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • Python實現(xiàn)帶GUI界面的手寫數(shù)字識別

    Python實現(xiàn)帶GUI界面的手寫數(shù)字識別

    這篇文章主要介紹了如何通過Python實現(xiàn)帶GUI界面的手寫數(shù)字識別,文中的示例代碼講解詳細,對我們學習Python有一定的幫助,感興趣的可以了解一下
    2022-01-01
  • python 判斷文件或文件夾是否存在

    python 判斷文件或文件夾是否存在

    這篇文章主要介紹了python 判斷文件或文件夾是否存在,Python 操作文件時,我們一般要先判斷指定的文件或目錄是否存在,不然容易產生異常,下面我們就來學習如何利用python檢查文件是否存在吧
    2022-03-03
  • Python命令行參數(shù)解析包argparse的使用詳解

    Python命令行參數(shù)解析包argparse的使用詳解

    argparse?是?python?自帶的命令行參數(shù)解析包,可以用來方便的服務命令行參數(shù)。本文將通過示例和大家詳細講講argparse的使用,需要的可以參考一下
    2022-09-09
  • Python腳本實現(xiàn)獲取IP地址

    Python腳本實現(xiàn)獲取IP地址

    這篇文章主要為大家詳細介紹了如何基于Python編寫一個腳本,可以實現(xiàn)獲取主機名、外網IP(通過多個公共API嘗試) IPV4和IPV6以及所有網絡接口的內網IP,感興趣的可以了解下
    2025-03-03
  • Django 導出 Excel 代碼的實例詳解

    Django 導出 Excel 代碼的實例詳解

    本篇文章主要介紹了Django 導出 Excel 代碼的實例詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • Python cv2 圖像自適應灰度直方圖均衡化處理方法

    Python cv2 圖像自適應灰度直方圖均衡化處理方法

    今天小編就為大家分享一篇Python cv2 圖像自適應灰度直方圖均衡化處理方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • Python文件操作和異常處理的方法和技巧

    Python文件操作和異常處理的方法和技巧

    本文介紹了Python文件操作和異常處理的方法和技巧,包括讀寫文本文件、讀寫二進制文件、文件指針、異常類型和處理、try-except語句、異常處理程序等內容,幫助讀者更好地掌握Python在文件操作和異常處理方面的應用
    2023-05-05
  • python matplotlib工具欄源碼探析三之添加、刪除自定義工具項的案例詳解

    python matplotlib工具欄源碼探析三之添加、刪除自定義工具項的案例詳解

    這篇文章主要介紹了python matplotlib工具欄源碼探析三之添加、刪除自定義工具項的案例詳解,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • python實現(xiàn)Dijkstra算法的最短路徑問題

    python實現(xiàn)Dijkstra算法的最短路徑問題

    這篇文章主要介紹了python實現(xiàn)Dijkstra算法的最短路徑問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-06-06

最新評論

体育| 新化县| 宜川县| 瑞金市| 阳曲县| 信阳市| 新干县| 时尚| 中江县| 木兰县| 同德县| 霸州市| 太仆寺旗| 古交市| 凌海市| 湖南省| 长海县| 蒙自县| 合作市| 霸州市| 息烽县| 九龙县| 徐州市| 通江县| 雷波县| 雅安市| 名山县| 留坝县| 南岸区| 万山特区| 全州县| 南溪县| 昌乐县| 乌什县| 金平| 正镶白旗| 马公市| 安庆市| 隆林| 崇仁县| 小金县|