python 簡單圖像識別--驗證碼php
記錄下,準備工做安裝過程非常麻煩。html
首先庫:pytesseract,image,tesseract,PIL
python
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)。