<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
OCR(Optical Character Recognition)即光學字元識別技術,專門用於對圖片文字進行識別,並獲取文字。字元驗證碼的特點就是驗證碼中包含數位、字母或者摻雜著斑點與混淆曲線的圖片驗證碼。識別此類驗證碼,首先需要找到驗證碼驗證碼圖片在網頁HTML程式碼中的位置,然後將驗證碼下載,最後再通過OCR技術進行驗證碼的識別工作。
Tesseract-OCR是一個免費、開源的OCR引擎,通過該引擎可以識別圖片中的驗證碼,搭建OCR的具體步驟如下:
(1)這裡以macOS作業系統為例,使用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模組時出現錯誤,可以使用如下命令:
conda install -c simonflueckiger tesseract
以下面地址對應的網頁為例,下載網頁中的驗證碼圖片,具體步驟如下:
測試頁面地址:http://sck.rjkflm.com:666/spider/word/
(1)使用瀏覽器開啟測試網頁的地址,將顯示如下圖片所示的字元驗證碼:
(2)開啟瀏覽器開發者工具,然後在HTML程式碼中獲取驗證碼圖片所在的位置,如下圖所示:
(3) 對目標網頁傳送網路請求,並在返回的HTML程式碼中獲取圖片的下載地址,然後下載驗證碼圖片。程式碼如下:
#_*_coding:utf-8_*_ # 作者 :liuxiaowei # 建立時間 :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 # 建立隨機請求頭 header = {'User-Agent':UserAgent().random} # 網頁請求地址 url = 'http://sck.rjkflm.com:666/spider/word/' # 傳送網路請求 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')
程式執行後專案資料夾中自動生成驗證碼圖片,結果如下圖:
驗證碼下載完成以後, 如果沒有安裝pillow模組,需要通過“pip install pillow“命令安裝一下,如果tesserocr模組沒安裝也要通過"pip install tesserocr"先安裝,然後匯入tesserocr與Image模組,再通過Image.open()方法開啟驗證碼圖片,接著通過tesserocr.image_to_text()函數識別圖片中的驗證碼資訊即可。範例程式碼如下:
#_*_coding:utf-8_*_ # 作者 :liuxiaowei # 建立時間 :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 # 建立時間 :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
通過以上測試發現,直接通過OCR技術識別後的驗證碼中多了一個‘.’,遇到此類情況手寫可以將彩色的驗證碼圖片轉為灰度圖片在測試一下。範例程式碼如下:
#_*_coding:utf-8_*_ # 作者 :liuxiaowei # 建立時間 :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 # 建立時間 :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 = [] # 二值化資料的列表 for i in range(256): # 迴圈遍歷 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
說 明
在識別以上具有干擾線的驗證碼圖片時,我們可以做一些灰度和二值化處理,這樣可以提高圖片的驗證碼的識別度,如果二值化處理後還是無法識別到精確性,可以適當的上下調節二值化操作的闕值。
針對OCR識別率和準確度不高的缺點,使用第三方驗證碼識別平臺是一個不錯的選擇,不僅可以解決驗證碼識別率低低問題,還可以提高驗證碼識別的準確度。第三方平臺識別驗證碼非常簡單,平臺提供了完善的API介面,根據平臺對應的開發檔案即可完成快速開發的需求,但每次驗證碼成功識別後平臺會收取少量費用。
驗證碼識別平臺一般分為兩種,分別是打碼平臺和AI開發者平臺。打碼平臺主要是由線上人員進行驗證碼的識別工作,然後在較短的時間內返回結果。AI開發者平臺主要是由人工智慧來進行識別。例如,百度AI。
下面以打碼平臺為例,演示驗證碼識別的具體過程。
(1)在瀏覽器中開啟打碼平臺網頁(http://www.chaojiying.com/),並且單擊首頁的“使用者註冊”按鈕,如圖所示:
(2) 然後在使用者中心頁面中填寫註冊賬號的基本資訊。如下圖:
說 明
賬號註冊完成以後可以聯絡平臺的客服人員,申請免費測試的題分。
(3) 賬號註冊完成以後,在網頁的頂部導航欄中選擇“開發檔案”,然後在常用開發語言範例下載中選擇“Python“語言,如下圖所示:
(4) 在Python語音Demo下載頁面中,檢視注意事項,然後單擊“點選這裡下載”超連結即可下載範例程式碼,如圖所示:
(5)平臺提供的範例程式碼中,已經將所有需要用到的功能程式碼進行了封裝處理,封裝的程式碼如下:
#_*_coding:utf-8_*_ # 作者 :liuxiaowei # 建立時間 :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 = { # 組合表單資料 '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: 圖片位元組 codetype: 題目型別 參考 http://www.chaojiying.com/price.html params = { 'codetype': codetype, params.update(self.base_params) # 更新表單引數 files = {'userfile': ('code2.jpg', im)} # 上傳驗證碼圖片 # 傳送網路請求 r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files, headers=self.headers) return r.json() # 返回響應資料 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系統須要// #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對應的值為返回的驗證碼識別資訊。
在傳送識別驗證碼的網路請求時,程式碼中的“1902”表示驗證碼的型別,該平臺所支援的常用驗證碼型別如下表:
常用驗證碼型別
驗證碼型別驗證碼描述1902常見4-6位英文數位1101-10201-20位英文數位2001-20071-7位純漢字3004-30121-12位元純英文4004-41111-11位純數位5000不定長漢字英文數位51088位元英文數位(包含字元)5201拼音首字母,計算題,成語混合5211集裝箱號4位元字母7位數位6001計算題6003複雜計算題
說 明
表中之列出了比較常用的驗證碼識別型別,詳細內容可查驗證碼平臺官網
滑動拼圖驗證碼是在滑動驗證碼的基礎上增加了滑動距離的校驗,使用者需要將圖形滾軸滑動至主圖空缺滾軸的位置,才能通過校驗。下面通過案例測試,實現滑動拼圖驗證碼的自動校驗。測試網頁地址:http://sck.rjkflm.com:666/spider/jgsaw/
(1) 使用瀏覽器開啟測試頁的地址,將顯示如圖所示的滑動拼圖驗證碼。
(2) 開啟瀏覽器開發者工具,單擊按鈕滾軸,然後在HTML程式碼中依次獲取“按鈕滾軸”“圖形滾軸”以及“空缺滾軸”所對應的HTML程式碼標籤所在的位置。
驗證碼型別 | 驗證碼描述 |
---|---|
1902 | 常見4-6位英文數位 |
1101-1020 | 1-20位英文數位 |
2001-2007 | 1-7位純漢字 |
3004-3012 | 1-12位元純英文 |
4004-4111 | 1-11位純數位 |
5000 | 不定長漢字英文數位 |
5108 | 8位元英文數位(包含字元) |
5201 | 拼音首字母,計算題,成語混合 |
5211 | 集裝箱號4位元字母7位數位 |
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框架模擬滑動的工作即可。實現程式碼如下:
#_*_coding:utf-8_*_ # 作者 :liuxiaowei # 建立時間 :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) # 建立動作 action.click_and_hold(swiper).perform() # 單擊並保證不鬆開 # 滑動0距離,不鬆手,不執行該動作無法獲取圖形滾軸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驗證碼反爬內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45