日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

今天要給大家介紹的是驗證碼的爬取和識別,不過只涉及到最簡單的圖形驗證碼,也是現在比較常見的一種類型。

運行平臺:windows

Python版本:Python3.6

IDE: Sublime Text

其他:Chrome瀏覽器

簡述流程:

步驟1:簡單介紹驗證碼

步驟2:爬取少量驗證碼圖片

步驟3:介紹百度文字識別OCR

步驟4:識別爬取的驗證碼

步驟5:簡單圖像處理

目前,很多網站會采取各種各樣的措施來反爬蟲,驗證碼就是其中一種,比如當檢測到訪問頻率過高時會彈出驗證碼讓你輸入,確認訪問網站的不是機器人。但隨著爬蟲技術的發展,驗證碼的花樣也越來越多,從最開始簡單的幾個數字或字母構成的圖形驗證碼(也就是我們今天要涉及的)發展到需要點擊倒立文字字母的、與文字相符合的圖片的點觸型驗證碼,需要滑動到合適位置的極驗滑動驗證碼,以及計算題驗證碼等等,總之花樣百出,讓人頭禿。驗證碼其他的相關知識大家可以看下這個網站:captcha.org

再來簡單說下圖形驗證碼吧,就像這張:

Python爬蟲基礎:驗證碼的爬取和識別詳解

 

由字母和數字組成,再加上一些噪點,但為了防止被識別,簡單的圖形驗證碼現在也變得復雜,有的加了干擾線,有的加噪點,有的加上背景,字體扭曲、粘連、鏤空、混用等等,甚至有時候人眼都難以識別,只能默默點擊“看不清,再來一張”。

驗證碼難度的提高隨之帶來的就是識別的成本也需要提高,在接下來的識別過程中,我會先直接使用百度文字識別OCR,來測試識別準確度,再確認是否選擇轉灰度、二值化以及去干擾等圖像操作優化識別率。

接下來我們就來爬取少量驗證碼圖片存入文件。

首先打開Chrome瀏覽器,訪問剛剛介紹的網站,里面有一個captcha圖像樣本鏈接:https://captcha.com/captcha-examples.html?cst=corg,網頁里有60張不同類型的圖形驗證碼,足夠我們用來識別試驗了。

Python爬蟲基礎:驗證碼的爬取和識別詳解

 

直接來看代碼吧:

Python爬蟲基礎:驗證碼的爬取和識別詳解

 

import requests
import os
import time
from lxml import etree


def get_Page(url,headers):
 response = requests.get(url,headers=headers)
 if response.status_code == 200:
 # print(response.text)
 return response.text
 return None


def parse_Page(html,headers):
 html_lxml = etree.HTML(html)
 datas = html_lxml.xpath('.//div[@class="captcha_images_left"]|.//div[@class="captcha_images_right"]')
 item= {}
 # 創建保存驗證碼文件夾
 file = 'D:/******'
 if os.path.exists(file):
 os.chdir(file)
 else: 
 os.mkdir(file)
 os.chdir(file) 
 for data in datas:
 # 驗證碼名稱
 name = data.xpath('.//h3')
 # print(len(name))
 # 驗證碼鏈接
 src = data.xpath('.//div/img/@src') 
 # print(len(src))
 count = 0
 for i in range(len(name)):
 # 驗證碼圖片文件名
 filename = name[i].text + '.jpg'
 img_url = 'https://captcha.com/' + src[i]
 response = requests.get(img_url,headers=headers)
 if response.status_code == 200:
 image = response.content
 with open(filename,'wb') as f:
 f.write(image)
 count += 1
 print('保存第{}張驗證碼成功'.format(count))
 time.sleep(1)


def main():
 url = 'https://captcha.com/captcha-examples.html?cst=corg'
 headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36'}
 html = get_Page(url,headers)
 parse_Page(html,headers)


if __name__ == '__main__':
 main()

仍然使用Xpath爬取,在右鍵檢查圖片時可以發現,網頁分為兩欄,如下圖紅框所示,根據class分為左右兩欄,驗證碼分別位于兩欄中。

Python爬蟲基礎:驗證碼的爬取和識別詳解

 

datas = html_lxml.xpath('.//div[@class="captcha_images_left"]|.//div[@class="captcha_images_right"]')

這里我使用了Xpath中的路徑選擇,在路徑表達式中使用“|”表示選取若干路徑,例如這里表示的就是選取class為"captcha_images_left"或者"captcha_images_right"的區塊。再來看下運行結果:

Python爬蟲基礎:驗證碼的爬取和識別詳解

 

由于每爬取一張驗證碼圖片都強制等待了1秒,最后這個運行時間確實讓人絕望,看樣子還是需要多線程來加快速度的,關于多進程多線程我們下次再說,這里我們先來看下爬取到的驗證碼圖片。

Python爬蟲基礎:驗證碼的爬取和識別詳解

 

圖片到手了,接下來就是調用百度文字識別的OCR來識別這些圖片了,在識別之前,先簡單介紹一下百度OCR的使用方法,因為很多識別驗證碼的教程用的都是tesserocr庫,所以一開始我也嘗試過,安裝過程中就遇到了很多坑,后來還是沒有繼續使用,而是選擇了百度OCR來識別。百度OCR接口提供了自然場景下圖片文字檢測、定位、識別等功能。文字識別的結果可以用于翻譯、搜索、驗證碼等代替用戶輸入的場景。另外還有其他視覺、語音技術方面的識別功能,大家可以直接閱讀文檔了解:百度OCR-API文檔https://ai.baidu.com/docs#/OCR-API/top

Python爬蟲基礎:驗證碼的爬取和識別詳解

 

使用百度OCR的話,首先注冊用戶,然后下載安裝接口模塊,直接終端輸入pip install baidu-aip即可。然后創建文字識別應用,獲取相關Appid,API Key以及Secret Key,需要了解一下的是百度AI每日提供50000次免費調用通用文字識別接口的使用次數,足夠我們揮霍了。

Python爬蟲基礎:驗證碼的爬取和識別詳解

 

然后就可以直接調用代碼了。

from aip import AipOcr

# 你的 APPID AK SK 
APP_ID = '你的 APP_ID '
API_KEY = '你的API_KEY'
SECRET_KEY = '你的SECRET_KEY'

client = AipOcr(APP_ID, API_KEY, SECRET_KEY)

# 讀取圖片 
def get_file_content(filePath):
 with open(filePath, 'rb') as fp:
 return fp.read()

image = get_file_content('test.jpg')

# 調用通用文字識別, 圖片參數為本地圖片 
result = client.basicGeneral(image)


# 定義參數變量 
options = {
 # 定義圖像方向
 'detect_direction' : 'true',
 # 識別語言類型,默認為'CHN_ENG'中英文混合
 'language_type' : 'CHN_ENG',


}

# 調用通用文字識別接口 
result = client.basicGeneral(image,options)
print(result)
for word in result['words_result']:
 print(word['words'])

這里我們識別的是這張圖

Python爬蟲基礎:驗證碼的爬取和識別詳解

 

可以看一下識別結果

上面是識別后直接輸出的結果,下面是單獨提取出來的文字部分。可以看到,除了破折號沒有輸出外,文字部分都全部正確輸出了。這里我們使用的圖片是jpg格式,文字識別傳入的圖像支持jpg/png/bmp格式,但在技術文檔中有提到,使用jpg格式的圖片上傳會提高一定準確率,這也是我們爬取驗證碼時使用jpg格式保存的原因。

輸出結果中,各字段分別代表:

  • log_id : 唯一的log id,用于定位問題
  • direction : 圖像方向,傳入參數時定義為true表示檢測,0表示正向,1表示逆時針90度,2表示逆時針180度,3表示逆時針270度,-1表示未定義。
  • words_result_num : 識別的結果數,即word_result的元素個數
  • word_result : 定義和識別元素數組
  • words : 識別出的字符串
    還有一些非必選字段大家可以去文檔里熟悉一下。

接下來,我們要做的,就是將我們之前爬取到的驗證碼用剛介紹的OCR來識別,看看究竟能不能得到正確結果。

from aip import AipOcr
import os


i = 0
j = 0
APP_ID = '你的 APP_ID '
API_KEY = '你的API_KEY'
SECRET_KEY = '你的SECRET_KEY'

client = AipOcr(APP_ID, API_KEY, SECRET_KEY)

# 讀取圖片 
file_path = 'D:******驗證碼圖片'
filenames = os.listdir(file_path)
# print(filenames)
for filename in filenames:
 # 將路徑與文件名結合起來就是每個文件的完整路徑
 info = os.path.join(file_path,filename)
 with open(info, 'rb') as fp:
 # 獲取文件夾的路徑 
 image = fp.read()
 # 調用通用文字識別, 圖片參數為本地圖片
 result = client.basicGeneral(image)
 # 定義參數變量 
 options = {
 'detect_direction' : 'true',
 'language_type' : 'CHN_ENG',
 }
 # 調用通用文字識別接口 
 result = client.basicGeneral(image,options)
 # print(result)
 if result['words_result_num'] == 0:
 print(filename + ':' + '----')
 i += 1
 else:
 for word in result['words_result']: 
 print(filename + ' : ' +word['words'])
 j += 1

print('共識別驗證碼{}張'.format(i+j))
print('未識別出文本{}張'.format(i))
print('已識別出文本{}張'.format(j))

和識別圖片一樣,這里我們將文件夾驗證碼圖片里的圖片全部讀取出來,依次讓OCR識別,并依據“word_result_num”字段判斷是否成功識別出文本,識別出文本則打印結果,未識別出來的用“----”代替,并結合文件名對應識別結果 。最后統計識別結果數量,再來看下識別結果。

Python爬蟲基礎:驗證碼的爬取和識別詳解

 

看到結果,只能說Amazing!60張圖片居然識別出了65張,并且還有27張為未識別出文本的,這不是我想要的結果~先來簡單看下問題出在哪里,看到“Vertigo Captcha Image.jpg"這張圖名出現了兩次,懷疑是在識別過程中由于被干擾,所以識別成兩行文字輸出了,這樣就很好解釋為什么多出來5張驗證碼圖片了。可是!為什么會有這么多未識別出文本呢,而且英文數字組成的驗證碼識別成中文了,看樣子,不對驗證碼圖片進行去干擾處理,僅靠OCR來識別的想法果然還是行不通啊。那么接下來我們便使用圖像處理的方法來重新識別驗證碼吧。

還是介紹驗證碼時用的這張圖

Python爬蟲基礎:驗證碼的爬取和識別詳解

 


Python爬蟲基礎:驗證碼的爬取和識別詳解

 

這張圖也沒能被識別出來,讓人頭禿。接下來就對這張圖片進行一定處理,看能不能讓OCR正確識別

from PIL import Image

filepath = 'D:******驗證碼圖片AncientMosaic Captcha Image.jpg'
image = Image.open(filepath)
# 傳入'L'將圖片轉化為灰度圖像
image = image.convert('L')
# 傳入'1'將圖片進行二值化處理
image = image.convert('1')
image.show()

這樣子轉化后再來看下圖片變成什么樣了?

Python爬蟲基礎:驗證碼的爬取和識別詳解

 

確實有些不同了,趕緊拿去試試能不能識別,還是失敗了~~繼續修改

from PIL import Image

filepath = 'D:******驗證碼圖片AncientMosaic Captcha Image.bmp'
image = Image.open(filepath)
# 傳入'L'將圖片轉化為灰度圖像
image = image.convert('L')
# 傳入'l'將圖片進行二值化處理,默認二值化閾值為127
# 指定閾值進行轉化
count= 170
table = []
for i in range(256):
 if i < count:
 table.append(0)
 else:
 table.append(1 )
image = image.point(table,'1')
image.show()

這里我將圖片保存成了bmp模式,然后指定二值化的閾值,不指定的話默認為127,我們需要先轉化原圖為灰度圖像,不能直接在原圖上轉化。然后將構成驗證碼的所需像素添加到一個table中,然后再使用point方法構建新的驗證碼圖片。

Python爬蟲基礎:驗證碼的爬取和識別詳解

 


Python爬蟲基礎:驗證碼的爬取和識別詳解

 

現在已經識別到文字了,雖然我不知道為啥識別成了“珍”,分析之后發現是因為z我在設置參數設置了“language_type”為“CHN_ENG”,中英文混合模式,于是我修改成“ENG”英文類型,發現可以識別成字符了,但依然沒有識別成功,嘗試其他我所知道的方法后,我表示很無語,我決定繼續嘗試PIL庫的其他方法試試。

# 找到邊緣
image = image.filter(ImageFilter.FIND_EDGES)
# image.show()
# 邊緣增強
image = image.filter(ImageFilter.EDGE_ENHANCE)
image.show()
Python爬蟲基礎:驗證碼的爬取和識別詳解

 

還是不能正確識別,我決定換個驗證碼試試。。。。。。

Python爬蟲基礎:驗證碼的爬取和識別詳解

 

我找了這張帶有陰影的

from PIL import Image,ImageFilter

filepath = 'D:******驗證碼圖片CrossShadow2 Captcha Image.jpg'
image = Image.open(filepath)
# 傳入'L'將圖片轉化為灰度圖像
image = image.convert('L')

# 傳入'l'將圖片進行二值化處理,默認二值化閾值為127
# 指定閾值進行轉化
count= 230
table = []
for i in range(256):
 if i < count:
 table.append(1)
 else:
 table.append(0)
image = image.point(table,'1')
image.show()

簡單處理后,得到這樣的圖片:

Python爬蟲基礎:驗證碼的爬取和識別詳解

 

識別結果為:

Python爬蟲基礎:驗證碼的爬取和識別詳解

 

識別成功了,老淚縱橫!!!看樣子百度OCR還是可以識別出驗證碼的,不過識別率還是有點低,需要對圖像進行一定處理,才能增加識別的準確率。不過百度OCR對規范文本的識別還是很準確的。

那么與其他驗證碼相比,究竟是什么讓這個驗證碼更容易被OCR讀懂呢?

  • 字母沒有相互疊加在一起,在水平方向上也沒有彼此交叉。也就是說,可以在每一個字 母外面畫一個方框,而不會重疊在一起。
  • 圖片沒有背景色、線條或其他對 OCR 程序產生干擾的噪點。
  • 白色背景色與深色字母之間的對比度很高。

這樣的驗證碼相對識別起來較容易,另外,像識別圖片時的白底黑字就屬于很標準的規范文本了,所以識別的準確度較高。至于更復雜的圖形驗證碼,就需要更深的圖像處理技術或者訓練好的OCR來完成了,如果只是簡單識別一個驗證碼的話,不如人工查看圖片輸入,更多一點的話,也可以交給打碼平臺來識別。

分享到:
標簽:驗證碼 Python
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定