Python OCR識別圖片驗證碼(一)

HuangZhang_123發表於2017-03-27

歡迎加入學習交流QQ群:657341423


對於某些網站登入的時候,往往需要輸入驗證碼才能實現登入。如果要爬蟲這類網站,往往總會比這個驗證碼導致無法爬取資料。以下介紹一種比較折中的方法,也是比較可行的方法:
實現思想:
1、通過截圖獲取驗證碼圖片,為什麼要截圖,有的人會說,可以通過驗證碼圖片的連結爬取下來,再用OCR識別就可以了,理論上這個方法是可行的,但是當你用這方法的時候,會發覺下載的圖片和你實際頁面的圖片裡面的內容是不一樣的。
2、截圖圖片後,通過OCR識別,返回驗證碼內容,完成登入。

程式碼:

#儲存圖片,通過顯示器xy座標,這裡值得注意的是,如果每個顯示器的解析度是不一樣的,(332,415,385,440)這個座標會隨時改動。
from PIL import ImageGrab
addr='E:\\OCR\\bb.png'
im = ImageGrab.grab((332,415,385,440))
im.save(addr,'png')

OCR識別,儘管上OCR識別有一定的準確率,但這個是可以通過ocr開發提高識別準確率的。

import pytesser3
print (pytesser3.image_file_to_string('bb.png'))

執行:
下載圖片:
這裡寫圖片描述
OCR識別:
這裡寫圖片描述

定義一個簡單登入方法:

from PIL import ImageGrab
import pytesser3
from selenium import webdriver

def loginSys(loginName,password):
	driver=webdriver.Ie()  
	driver.get(url)
	driver.implicitly_wait(60)
	LoginTitle=driver.title

	while 1:
		result=driver.title
		if LoginTitle==result:
			#截圖
			addr='E:\\OCR\\bb.png'
			im = ImageGrab.grab((332,415,385,440))
			im.save(addr,'png')
			#OCR
			Code=pytesser3.image_file_to_string('bb.png')
			print (pytesser3.image_file_to_string('bb.png'))
			#自動登入,find_element_by_id自行修改
			driver.switch_to.frame('loginFormFrame')
			driver.find_element_by_id('id_loginName').send_keys(loginName)
			driver.find_element_by_id('id_password').send_keys(password)
			driver.find_element_by_id('id_certCode').send_keys(Code)
			driver.implicitly_wait(10)
			driver.find_element_by_xpath('//img[@onclick="doLogin();"]').click()
			driver.implicitly_wait(10)
			driver.switch_to.default_content()
		else:
			break
	#cookies傳遞,用於request爬取資料		
	cook=driver.get_cookies()
	cookies[cook[0]['name']]=cook[0]['value']

解釋:這裡用了selenium做一個自動化登入的,這裡會有疑問,為何不用requests,或者scrapy直接做後臺登入。
原因如下:首先我們找到登入
這裡寫圖片描述
這是一張圖片,而且圖片觸發是一個js,再看js
js程式碼很長,大部分都是做檢測功能。
這裡寫圖片描述
如圖所示,可以看到,這個登入是用get方法實現的,但是str是做了加密處理。
加密處理最簡單使用selenium 模擬人為登入,但效能上不算最優。除此之外,還可以在python中對str進行加密處理。本章節使用selenium 模擬人為登入。


Python OCR識別圖片驗證碼(二)


歡迎加入學習交流QQ群:657341423

相關文章