先是獲取驗(yàn)證碼樣本。。。我存了大概500個(gè)。
創(chuàng)新互聯(lián)建站專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、陽(yáng)新網(wǎng)絡(luò)推廣、小程序開發(fā)、陽(yáng)新網(wǎng)絡(luò)營(yíng)銷、陽(yáng)新企業(yè)策劃、陽(yáng)新品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)建站為所有大學(xué)生創(chuàng)業(yè)者提供陽(yáng)新建站搭建服務(wù),24小時(shí)服務(wù)熱線:13518219792,官方網(wǎng)址:www.cdcxhl.com
用dia測(cè)了測(cè)每個(gè)字之間的間距,直接用PIL開始切。
from PIL import Image
for j in range(0,500):
f=Image.open("../test{}.jpg".format(j))
for i in range(0,4):
f.crop((20+20*i,0,40+20*i,40)).save("test{0}-{1}.jpg".format(j,i+1))
上面一段腳本的意思是把jpg切成四個(gè)小塊然后保存
之后就是二值化啦。
def TotallyShit(im):
x,y=im.size
mmltilist=list()
for i in range(x):
for j in range(y):
if im.getpixel((i,j))200:
mmltilist.append(1)
else:
mmltilist.append(0)
return mmltilist
咳咳,不要在意函數(shù)的名字。上面的一段代碼的意思是遍歷圖片的每個(gè)像素點(diǎn),顏色數(shù)值小于200的用1表示,其他的用0表示。
其中的im代表的是Image.open()類型。
切好的圖片長(zhǎng)這樣的。
只能說(shuō)這樣切的圖片還是很粗糙,很僵硬。
下面就是分類啦。
把0-9,“+”,”-“的圖片挑好并放在不同的文件夾里面,這里就是純體力活了。
再之后就是模型建立了。
這里我試了自己寫的還有sklearn svm和sklearn neural_network。發(fā)現(xiàn)最后一個(gè)的識(shí)別正確率高的多。不知道是不是我樣本問(wèn)題QAQ。
下面是模型建立的代碼
from sklearn.neural_network import MLPClassifier
import numpy as np
def clf():
clf=MLPClassifier()
mmltilist=list()
X=list()
for i in range(0,12):
for j in os.listdir("douplings/douplings-{}".format(i)):
mmltilist.append(TotallyShit(Image.open("douplings/douplings-{0}/{1}".format(i,j)).convert("L")))
X.append(i)
clf.fit(mmltilist,X)
return clf
大概的意思是從圖片源中讀取圖片和label然后放到模型中去跑吧。
之后便是圖像匹配啦。
def get_captcha(self):
with open("test.jpg","wb") as f:
f.write(self.session.get(self.live_captcha_url).content)
gim=Image.open("test.jpg").convert("L")
recognize_list=list()
for i in range(0,4):
part=TotallyShit(gim.crop((20+20*i,0,40+20*i,40)))
np_part_array=np.array(part).reshape(1,-1)
predict_num=int(self.clf.predict(np_part_array)[0])
if predict_num==11:
recognize_list.append("+")
elif predict_num==10:
recognize_list.append("-")
else:
recognize_list.append(str(predict_num))
return ''.join(recognize_list)
最后eval一下識(shí)別出來(lái)的字符串就得出結(jié)果了。。
順便提一句現(xiàn)在的bilibili登陸改成rsa加密了,麻蛋,以前的腳本全部作廢,心好痛。
登陸的代碼。
import time
import requests
import rsa
r=requests.session()
data=r.get("act=getkey_="+str(int(time.time()*1000))).json()
pub_key=rsa.PublicKey.load_pkcs1_openssl_pem(data['key'])
payload = {
'keep': 1,
'captcha': '',
'userid': "youruserid",
'pwd': b64encode(rsa.encrypt((data['hash'] +"yourpassword").encode(), pub_key)).decode(),
}
r.post("",data=payload)
1.找地址
首先,我們要找到這個(gè)網(wǎng)站生成驗(yàn)證碼的地址,這個(gè)地址我們可以通過(guò)查看他的源代碼來(lái)實(shí)現(xiàn)。
1.找地址
首先,我們要找到這個(gè)網(wǎng)站生成驗(yàn)證碼的地址,這個(gè)地址我們可以通過(guò)查看他的源代碼來(lái)實(shí)現(xiàn)。
就以某大學(xué)教務(wù)網(wǎng)為例,這個(gè)教務(wù)網(wǎng)的模板很多學(xué)校都在采用:
我就截取表單的驗(yàn)證碼部分即可。
td?align="center"?rowspan="3"?
img??id="imgCode"?src="../sys/ValidateCode.aspx"?
onclick="changeValidateCode(this)"?alt="單擊可更換圖片!"?
style="CURSOR:?pointer;"
br看不清,則單擊圖片!?????????????????????????????????
/td123456123456
這里就可以知道,地址就是../sys/ValidateCode.aspx
組合一下地址就是
也就是我們等一下要用到的地址了。
我們可以查看一下那個(gè)網(wǎng)頁(yè)。
2.處理圖片
去查看了一下那個(gè)地址
果不其然,都是亂碼,因?yàn)轵?yàn)證碼分為兩種。
1)直接處理成JPG/GIF/PNG或者其他格式,然后直接讀取到一個(gè)圖片地址。
2)接收用戶觸發(fā),然后生成,再直接處理成圖像,不讀取到一個(gè)圖片地址。
我們這里是第二種,我們要自己來(lái)讀取他,到本地,再手動(dòng)輸入驗(yàn)證碼。
#?-*-?coding:?utf-8?-*-
import?urllib2
#驗(yàn)證碼的處理#
#驗(yàn)證碼生成頁(yè)面的地址#
im_url?=?''
#讀取驗(yàn)證碼圖片#
im_data?=?urllib2.urlopen(im_url).read()
#打開一個(gè)Code.PNG文件在D盤,沒(méi)有的話自動(dòng)生成#
f=open('d:\\Code.png','wb')
#寫入圖片內(nèi)容#
f.write(im_data)
#關(guān)閉文件#
f.close()1234567891011121312345678910111213
這里包括兩個(gè)部分:
1)打開那個(gè)生成驗(yàn)證碼圖片的頁(yè)面,讀取
2)將讀取到的內(nèi)容,保存成圖片,下載到本地
我們這里的地址是可以隨便寫的,保存在你想保存的地方。
到這里我們就完成了驗(yàn)證碼的一小部分。
by–LoDog
希望能幫到你!
random.randint()
取的數(shù)的區(qū)間是前后封閉的。也就是可能會(huì)取到last_pos
如果不減1那么就會(huì)出錯(cuò)的。
all_chars[len(all_chars)]就出錯(cuò)了。
一、pytesseract介紹
1、pytesseract說(shuō)明
pytesseract最新版本0.1.6,網(wǎng)址:h
Python-tesseract is a wrapper for google's Tesseract-OCR
( ht-ocr/ ). It is also useful as a
stand-alone invocation script to tesseract, as it can read all image types
supported by the Python Imaging Library, including jpeg, png, gif, bmp, tiff,
and others, whereas tesseract-ocr by default only supports tiff and bmp.
Additionally, if used as a script, Python-tesseract will print the recognized
text in stead of writing it to a file. Support for confidence estimates and
bounding box data is planned for future releases.
翻譯一下大意:
a、Python-tesseract是一個(gè)基于google's Tesseract-OCR的獨(dú)立封裝包;
b、Python-tesseract功能是識(shí)別圖片文件中文字,并作為返回參數(shù)返回識(shí)別結(jié)果;
c、Python-tesseract默認(rèn)支持tiff、bmp格式圖片,只有在安裝PIL之后,才能支持jpeg、gif、png等其他圖片格式;
2、pytesseract安裝
INSTALLATION:
Prerequisites:
* Python-tesseract requires python 2.5 or later or python 3.
* You will need the Python Imaging Library (PIL). Under Debian/Ubuntu, this is
the package "python-imaging" or "python3-imaging" for python3.
* Install google tesseract-ocr from hsseract-ocr/ .
You must be able to invoke the tesseract command as "tesseract". If this
isn't the case, for example because tesseract isn't in your PATH, you will
have to change the "tesseract_cmd" variable at the top of 'tesseract.py'.
Under Debian/Ubuntu you can use the package "tesseract-ocr".
Installing via pip:?
See the [pytesseract package page](hi/pytesseract)?
```
$ sudo pip install pytesseract
翻譯一下:
a、Python-tesseract支持python2.5及更高版本;
b、Python-tesseract需要安裝PIL(Python Imaging Library) ,來(lái)支持更多的圖片格式;
c、Python-tesseract需要安裝tesseract-ocr安裝包,具體參看上一篇博文。
綜上,Pytesseract原理:
1、上一篇博文中提到,執(zhí)行命令行 tesseract.exe 1.png output -l eng ,可以識(shí)別1.png中文字,并把識(shí)別結(jié)果輸出到output.txt中;
2、Pytesseract對(duì)上述過(guò)程進(jìn)行了二次封裝,自動(dòng)調(diào)用tesseract.exe,并讀取output.txt文件的內(nèi)容,作為函數(shù)的返回值進(jìn)行返回。
二、pytesseract使用
USAGE:
```
try:
import Image
except ImportError:
from PIL import Image
import pytesseract
print(pytesseract.image_to_string(Image.open('test.png')))
print(pytesseract.image_to_string(Image.open('test-european.jpg'),))
可以看到:
1、核心代碼就是image_to_string函數(shù),該函數(shù)還支持-l eng 參數(shù),支持-psm 參數(shù)。
用法:
image_to_string(Image.open('test.png'),lang="eng" config="-psm 7")
2、pytesseract里調(diào)用了image,所以才需要PIL,其實(shí)tesseract.exe本身是支持jpeg、png等圖片格式的。
實(shí)例代碼,識(shí)別某公共網(wǎng)站的驗(yàn)證碼(大家千萬(wàn)別干壞事啊,思慮再三,最后還是隱掉網(wǎng)站域名,大家去找別的網(wǎng)站試試吧……):
View Code
三、pytesseract代碼優(yōu)化
上述程序在windows平臺(tái)運(yùn)行時(shí),會(huì)發(fā)現(xiàn)有黑色的控制臺(tái)窗口一閃而過(guò)的畫面,不太友好。
略微修改了pytesseract.py(C:\Python27\Lib\site-packages\pytesseract目錄下),把上述過(guò)程進(jìn)行了隱藏。
# modified by zhongtang hide console window
# new code
IS_WIN32 = 'win32' in str(sys.platform).lower()
if IS_WIN32:
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
startupinfo.wShowWindow = subprocess.SW_HIDE
proc = subprocess.Popen(command,
stderr=subprocess.PIPE,startupinfo=startupinfo)
'''
# old code
proc = subprocess.Popen(command,
stderr=subprocess.PIPE)
'''
# modified end
為了方便初學(xué)者,把pytesseract.py也貼出來(lái),高手自行忽略。
View Code