python 簡單圖像識別--驗證碼

python  簡單圖像識別--驗證碼php

記錄下,準備工做安裝過程非常麻煩。html

首先庫:pytesseract,image,tesseract,PILpython

windows安裝PIL,直接exe進行安裝更方便(https://files.cnblogs.com/files/Oran9e/PILwin64.zip)(https://files.cnblogs.com/files/Oran9e/PILwin32.zip)windows

安裝 image:pip install image服務器

安裝 pytesseract:pip install pytesseractcookie

安裝 tesseract:pip install tesseract  (安裝 tesseracr,這裏是個坑,須要安裝到C盤裏C:\Program Files (x86)\Tesseract-OCR,也就是默認路徑 ,否則運行 python 代碼的時候調用不了 tesseract.exe )session

修改 tesseract.py 代碼:\python\Lib\site-packages\pytesseract\tesseract.pyapp

tesseract_cmd 改爲 tesseract.exe的路徑,進行調用。jsp

tesseract_cmd = 'C:/Program Files (x86)/Tesseract-OCR/tesseract.exe'

 

準備完上面的工做,基本上就能夠進行簡單的驗證碼識別了。post

代碼:

#coding=utf-8
from PIL import Image
import pytesseract
image = Image.open('2.jpg')
orange = pytesseract.image_to_string(image)
print orange

 

下篇文章將會寫個自動識別驗證碼,實現自動登錄的小腳本。

 

 

 

 

python  簡單圖像識別--驗證碼Ⅱ

在實現自動登錄的時候,咱們首先須要作到識別驗證碼,上篇文章講到如何識別驗證碼(http://www.cnblogs.com/Oran9e/p/8799194.html)。

通常狀況下,咱們見到的驗證碼是服務器動態生成的,這個時候咱們要作的就是把驗證碼下載到本地,而後就能夠像上篇文章同樣進行識別,爲自動登錄打下堅實的基礎。

下面就記下困擾我兩天的問題,把坑說明一下。

原本是想把 cnvd 的驗證碼進行下載識別(http://www.cnvd.org.cn/jcaptcha/jpeg/imageCaptcha?id=1523686908)

可是 cnvd 的網站是有反爬蟲機制的,打印下 get 到的內容,是<script>***</script>  js 代碼,所以我認爲是不能直接下載的,固然也存在右鍵另存爲了哈。

對比下兩個連接打印出來的內容(http://lab1.xseclab.com/vcode7_f7947d56f22133dbc85dda4f28530268/vcode.php)

 

上圖能夠看到,直接打印的內容是驗證碼圖片的內容,所以這個時候咱們能夠進行下載,下載的時候是以二進制的方式展示,先保存到本地。

代碼以下:

#coding=utf-8
from PIL import Image
import pytesseract
import requests
url = 'http://lab1.xseclab.com/vcode7_f7947d56f22133dbc85dda4f28530268/vcode.php'   #驗證碼URL
headers = {'User-Agent':"Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0"}   #headers
url_get = requests.request("GET",url,headers=headers,verify=False)            #發送請求
img = url_get.content              #返回的數據以二進制的方式展示
with open('C:\Users\ww\Desktop\imageCaptcha.jpg',"wb") as f:        #選擇保存圖片路徑和格式
	f.write(img)        #保存
image1 = Image.open("C:\Users\ww\Desktop\imageCaptcha.jpg")     #Image模塊打開圖片
output = pytesseract.image_to_string(image1)     #識別驗證碼
print str(output)     #打印驗證碼

 

固然,下載驗證碼也不止上面的一種方式,也能夠經過截圖保存驗證碼進行識別。有興趣能夠試試。

先記錄到這裏,爭取晚上寫出識別驗證碼自動登錄的腳本。

 

 

 

 

python  簡單圖像識別--驗證碼Ⅲ

實現自動登錄網站

登陸學校圖書館管理系統爲例,作一個簡單的例子。python識別簡單的沒有干擾的純數字驗證碼仍是能夠的,可是識別字母數字再加上干擾因素,誤報率很高,所以這個我是採用」人工識別「,人工輸入。

首先得明白cookie的做用,cookie是某些網站爲了辨別用戶身份、進行session跟蹤而儲存在用戶本地終端上的數據。所以咱們須要用Cookielib模塊來保持網站的cookie。

登陸學校圖書館管理系統登錄(http://122.207.221.227:8080/opac/login),驗證碼(http://122.207.221.227:8080/kaptcha/goldlib)

能夠發現這個驗證碼是動態更新的每次打開都不同,通常這種驗證碼和cookie是同步的。想識別驗證碼確定是吃力不討好的事,所以咱們的思路是首先訪問驗證碼頁面,保存驗證碼、獲取cookie用於登陸,而後再直接向登陸地址post數據。

先分析登陸頁面須要post的request和header信息

 

從中能夠看出須要 post 的url並非訪問的頁面,而是(http://122.207.221.227:8080/pages/include/checklogin.jsp)

其中須要提交的表單數據中 username 和 password 分別用戶名和密碼。

 

分析了上面的因素,下面就直接貼出代碼。

#coding=utf-8
from PIL import Image
import pytesseract
import urllib2
import urllib
import PIL.ImageOps
import requests
import cookielib
import re
import sys
'''圖書館登錄'''
reload(sys)
sys.setdefaultencoding("utf-8")  #防止中文報錯
url = 'http://122.207.221.227:8080/pages/include/checklogin.jsp'
capchaurl = 'http://122.207.221.227:8080/kaptcha/0.5458022691509324'
cookie = cookielib.CookieJar()   # 將cookies綁定到一個opener  cookie由cookielib自動管理
handler = urllib2.HTTPCookieProcessor(cookie)
opener = urllib2.build_opener(handler)
username='xxxxx'
password='xxxxx'  #用戶名,密碼
callNo = 'callNo'
picture = opener.open(capchaurl).read()   # 用openr訪問驗證碼地址,獲取cookie
local = open('C:\Users\ww\Desktop\goldlib.jpg',"wb")   # 保存驗證碼到本地
local.write(picture)
local.close()
secrecode = raw_input('yanzhengma: ')   # 輸入驗證碼
postData = {
    'username': username,
	'password': password,
	'loginType': callNo,
	'kaptcha': secrecode,
}   # 抓包信息 構造表單
headers = {
    'Accept': '*/*',
	'Accept-Encoding': 'gzip, deflate',
	'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
	'Connection': 'keep-alive',
	'Content-Length': '64',
	'Content-Type': 'application/x-www-form-urlencoded',
	'Host': '122.207.221.227:8080',
	'Referer': 'http://122.207.221.227:8080/opac/login',
	'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:59.0) Gecko/20100101 Firefox/59.0',
	'X-Requested-With': 'XMLHttpRequest',
}   # 根據抓包信息 構造headers
data = urllib.urlencode(postData)  # 生成post數據 ?key1=value1&key2=value2的形式
request = urllib2.Request(url,data,headers)  #構造request請求
try:
	response = opener.open(request)
	result = response.read().decode('utf-8')
	print result
except urllib2.HTTPError, e:
	print e.code

 演示結果

 

 

 

任重而道遠!

轉載請註明連接(http://www.cnblogs.com/Oran9e/p/8847313.html)。

相關文章
相關標籤/搜索