❶ 如何利用python做簡單的驗證碼識別

最近在折騰驗證碼識別。最終的腳本的識別率在92%左右,9000張驗證碼大概能識別出八千三四百張左右。好吧,其實是驗證碼太簡單。下面就是要識別的驗證碼。

接下來對圖片進行分割。遍歷圖片中所有像素點,計算每一列像素為0的點的個數(jd)。對於相鄰兩列,若其中一列jd=0,而另一列jd!=0,則可以認為這一列是驗證碼中字元邊界,由此對驗證碼進行分割。這樣分割能達到比較好的效果,分割後得到的字元圖片幾乎能與模板完全相同。

(Width,Height) = img2.size
pix2 = img2.load()
x0 = []
y0 = []for x in range(1,Width):
jd = 0
# print x
for y in range(1,Height): # print y
if pix2[x,y] == 0:
jd+=1
y0.append(jd) if jd > 0:
x0.append(x)#分別對各個字元邊界進行判斷,這里只舉出一個 for a in range(1,Width): if (y0[a] != 0)&(y0[a+1] != 0):
sta1 = a+1

分割完成後,對於識別,目前有幾種方法。可以遍歷圖片的每一個像素點,獲取像素值,得到一個字元串,將該字元串與模板的字元串進行比較,計算漢明距離或者編輯距離(即兩個字元串的差異度),可用Python-Levenshtein庫來實現。

我採用的是比較特徵向量來進行識別的。首先設定了4個豎直特徵向量,分別計算第0、2、4、6列每一列像素值為0的點的個數,與模板進行比較,若小於閾值則認為該字元與模板相同。為了提高識別率,如果通過豎直特徵向量未能識別成功,引入水平特徵向量繼續識別,原理與豎直特徵向量相同。

另外,還可以通過局部特徵進行識別。這對於加入了旋轉干擾的驗證碼有很好效果。由於我寫的腳本識別率已經達到了要求,所以並沒有用到這個。

最後的結果是這樣的:

最終在模板庫只有25條的情況下,識別率在92%左右(總共測試了一萬六千張驗證碼)。好吧,只能說驗證碼太簡單。。

以上。

❷ python如何識別驗證碼

我們首先識別最簡單的一種驗證碼,即圖形驗證碼。這種驗證碼最早出現,現在也很常見,一般由4位字母或者數字組成。例如,中國知網的注冊頁面有類似的驗證碼,頁面如下所示:

表單中最後一項就是圖形驗證碼,我們必須完全正確輸入圖中的字元才可以完成注冊。

更多有關驗證碼的知識,可以參考這些文章:

Python3爬蟲進階:識別圖形驗證碼

Python3爬蟲進階:識別極驗滑動驗證碼

Python3爬蟲進階:識別點觸點選驗證碼

Python3爬蟲進階:識別微博宮格驗證碼

·本節目標以知網的驗證碼為例,講解利用OCR技術識別圖形驗證碼的方法。

·准備工作識別圖形驗證碼需要庫tesserocr,以mac安裝為例:在mac下,我們首先使用Homebrew安裝ImageMagick和tesseract庫: brew install imagemagickbrew install tesseract 接下來再安裝tesserocr即可:pip3 install tesserocr pillow這樣我們就完成了 tesserocr的安裝。

·獲取驗證碼為了便於實驗,我們先將驗證碼的圖片保存到本地。打開開發者工具,找到驗證碼元素。驗證碼元素是一張圖片,它的ser屬 性是CheckCode.aspk。所以我們直接打開如下鏈接就可以看到一個驗證碼,右鍵保存即可,將其命名為code.jpg:

這樣我們就得到一張驗證碼圖片,以供測試識別使用。

相關推薦:《Python教程》

識別測試

接下來新建一個項目,將驗證碼圖片放到項目根目錄下,用tesserocr庫識別該驗證碼,代碼如下所示:

這里我們新建了一個Image對戲那個,調用了tesserocr的image_to_text( )方法。傳入該Image對象即可完成識別,實現過程非常簡單,結果如下:

我們可以看到,識別的結果和實際結果有偏差,這是因為驗證碼內的多餘線條干擾了圖片的識別。

另外,tesserocr還有一個更加簡單的方法,這個方法可以直接將圖片文件轉為字元串,代碼如下:

不過這種方法的識別效果不如上一種的好。

驗證碼處理

對於上面的圖片,我們可以看到其實並沒有完全識別正確,所以我們需要對圖像作進一步的處理,如灰度轉換、二值化等操作。

我們可以利用Image對象的convert( )方法參數傳入L,即可將圖片轉化為灰度圖像,代碼如下:

傳入1即可將圖片進行二值化處理,如下所示:

我們還可以指定二值化的閾值。上面的方法採用的是默認閾值127。不過我們不能直接轉化原圖,要將原圖先轉化為灰度圖像,然後再指定二值化閾值,代碼如下:

在這里,變數threshold代表二值化閾值,閾值設置為160,之後我們來看看我們的結果:

我們可以看到現在的二維碼就比較方便我們進行識別了;那麼對於一些有干擾的圖片,我們做一些灰度和二值化處理,這會提高圖片識別的正確率。

❸ 使用python來寫腳本,如何來處理驗證碼的問題,每次登錄時驗證碼都不同,求高人幫忙,謝謝

如果是想讓代碼識別的話,要看驗證碼的復雜程度了,如果比較簡回單,使用圖像處理說不定可答以解決(我不會,不過網上應該有資料,就算沒有python的,其他語言的也有),但是如果是復雜的,建議你把驗證碼下載下來,如果有圖形界面,就在界面中顯示,如果沒有,就下到一個目錄里,自己取找,然後人工識別吧。

❹ python 如果抓取驗證碼圖片 類似12306的登錄驗證碼圖片

這個以來前做過多次。最大的麻煩是源驗證碼的識別演算法的識別率太低。比如12306那種網站你登陸錯3次就限制你20分鍾。所以除非你有33%以上的識別率否則不要嘗試了。

通常做法是另存驗證碼圖片,通常收集幾十個,然後訓練自己的識別演算法。我曾經用PIL庫自己做過識別演算法,最高只有10%的識別率。效率還可以,一秒可以識別10次左右。主要是圖片很小,所以處理起來也快。

驗證碼識別還有多少公開的演算法,只能用來參考。不過真正識別都需要自己根據實際情況去訓練改進演算法。

❺ 用python破解帶驗證碼密碼

這個驗證碼的確簡單,不過用tesseract ocr效果不太好。還不如自己用PIL開發一個類似的演算法更准確。

用戶名與密碼要用字典,完全暴力破解是一個天文數字。不可行。不考慮封IP的前提下。你將常用的用戶名都列出來。再找一個常用的密碼字典做排列組合。

不過網站建設成這個樣子,看來技術含量不高。也許它有其它的漏洞。不需要你去暴力破解。

❻ python處理滑動驗證碼,除了調用chrome

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.action_chains import ActionChains
import PIL.Image as image
import time,re, random
import requests
try:
from StringIO import StringIO
except ImportError:
from io import StringIO

#爬蟲模擬的瀏覽器頭部信息
agent = 'Mozilla/5.0 (Windows NT 5.1; rv:33.0) Gecko/20100101 Firefox/33.0'
headers = {
'User-Agent': agent
}

# 根據位置對圖片進行合並還原
# filename:圖片
# location_list:圖片位置
#內部兩個圖片處理函數的介紹
#crop函數帶的參數為(起始點的橫坐標,起始點的縱坐標,寬度,高度)
#paste函數的參數為(需要修改的圖片,粘貼的起始點的橫坐標,粘貼的起始點的縱坐標)
def get_merge_image(filename,location_list):
#打開圖片文件
im = image.open(filename)
#創建新的圖片,大小為260*116
new_im = image.new('RGB', (260,116))
im_list_upper=[]
im_list_down=[]
# 拷貝圖片
for location in location_list:
#上面的圖片
if location['y']==-58:
im_list_upper.append(im.crop((abs(location['x']),58,abs(location['x'])+10,166)))
#下面的圖片
if location['y']==0:
im_list_down.append(im.crop((abs(location['x']),0,abs(location['x'])+10,58)))
new_im = image.new('RGB', (260,116))
x_offset = 0
#黏貼圖片
for im in im_list_upper:
new_im.paste(im, (x_offset,0))
x_offset += im.size[0]
x_offset = 0
for im in im_list_down:
new_im.paste(im, (x_offset,58))
x_offset += im.size[0]
return new_im

#下載並還原圖片
# driver:webdriver
# div:圖片的div
def get_image(driver,div):
#找到圖片所在的div
background_images=driver.find_elements_by_xpath(div)
location_list=[]
imageurl=''
#圖片是被CSS按照位移的方式打亂的,我們需要找出這些位移,為後續還原做好准備
for background_image in background_images:
location={}
#在html裡面解析出小圖片的url地址,還有長高的數值
location['x']=int(re.findall("background-image: url\(\"(.*)\"\); background-position: (.*)px (.*)px;",background_image.get_attribute('style'))[0][1])
location['y']=int(re.findall("background-image: url\(\"(.*)\"\); background-position: (.*)px (.*)px;",background_image.get_attribute('style'))[0][2])
imageurl=re.findall("background-image: url\(\"(.*)\"\); background-position: (.*)px (.*)px;",background_image.get_attribute('style'))[0][0]
location_list.append(location)
#替換圖片的後綴,獲得圖片的URL
imageurl=imageurl.replace("webp","jpg")
#獲得圖片的名字
imageName = imageurl.split('/')[-1]
#獲得圖片
session = requests.session()
r = session.get(imageurl, headers = headers, verify = False)
#下載圖片
with open(imageName, 'wb') as f:
f.write(r.content)
f.close()
#重新合並還原圖片
image=get_merge_image(imageName, location_list)
return image

#對比RGB值
def is_similar(image1,image2,x,y):
pass
#獲取指定位置的RGB值
pixel1=image1.getpixel((x,y))
pixel2=image2.getpixel((x,y))
for i in range(0,3):
# 如果相差超過50則就認為找到了缺口的位置
if abs(pixel1[i]-pixel2[i])>=50:
return False
return True

#計算缺口的位置
def get_diff_location(image1,image2):
i=0
# 兩張原始圖的大小都是相同的260*116
# 那就通過兩個for循環依次對比每個像素點的RGB值
# 如果相差超過50則就認為找到了缺口的位置
for i in range(0,260):
for j in range(0,116):
if is_similar(image1,image2,i,j)==False:
return i

#根據缺口的位置模擬x軸移動的軌跡
def get_track(length):
pass
list=[]
#間隔通過隨機范圍函數來獲得,每次移動一步或者兩步
x=random.randint(1,3)
#生成軌跡並保存到list內
while length-x>=5:
list.append(x)
length=length-x
x=random.randint(1,3)
#最後五步都是一步步移動
for i in range(length):
list.append(1)
return list

#滑動驗證碼破解程序
def main():
#打開火狐瀏覽器
driver = webdriver.Firefox()
#用火狐瀏覽器打開網頁
driver.get("htest.com/exp_embed")
#等待頁面的上元素刷新出來
WebDriverWait(driver, 30).until(lambda the_driver: the_driver.find_element_by_xpath("//div[@class='gt_slider_knob gt_show']").is_displayed())
WebDriverWait(driver, 30).until(lambda the_driver: the_driver.find_element_by_xpath("//div[@class='gt_cut_bg gt_show']").is_displayed())
WebDriverWait(driver, 30).until(lambda the_driver: the_driver.find_element_by_xpath("//div[@class='gt_cut_fullbg gt_show']").is_displayed())
#下載圖片
image1=get_image(driver, "//div[@class='gt_cut_bg gt_show']/div")
image2=get_image(driver, "//div[@class='gt_cut_fullbg gt_show']/div")
#計算缺口位置
loc=get_diff_location(image1, image2)
#生成x的移動軌跡點
track_list=get_track(loc)
#找到滑動的圓球
element=driver.find_element_by_xpath("//div[@class='gt_slider_knob gt_show']")
location=element.location
#獲得滑動圓球的高度
y=location['y']
#滑鼠點擊元素並按住不放
print ("第一步,點擊元素")
ActionChains(driver).click_and_hold(on_element=element).perform()
time.sleep(0.15)
print ("第二步,拖動元素")
track_string = ""
for track in track_list:
#不能移動太快,否則會被認為是程序執行
track_string = track_string + "{%d,%d}," % (track, y - 445)
#xoffset=track+22:這里的移動位置的值是相對於滑動圓球左上角的相對值,而軌跡變數里的是圓球的中心點,所以要加上圓球長度的一半。
#yoffset=y-445:這里也是一樣的。不過要注意的是不同的瀏覽器渲染出來的結果是不一樣的,要保證最終的計算後的值是22,也就是圓球高度的一半
ActionChains(driver).move_to_element_with_offset(to_element=element, xoffset=track+22, yoffset=y-445).perform()
#間隔時間也通過隨機函數來獲得,間隔不能太快,否則會被認為是程序執行
time.sleep(random.randint(10,50)/100)
print (track_string)
#xoffset=21,本質就是向後退一格。這里退了5格是因為圓球的位置和滑動條的左邊緣有5格的距離
ActionChains(driver).move_to_element_with_offset(to_element=element, xoffset=21, yoffset=y-445).perform()
time.sleep(0.1)
ActionChains(driver).move_to_element_with_offset(to_element=element, xoffset=21, yoffset=y-445).perform()
time.sleep(0.1)
ActionChains(driver).move_to_element_with_offset(to_element=element, xoffset=21, yoffset=y-445).perform()
time.sleep(0.1)
ActionChains(driver).move_to_element_with_offset(to_element=element, xoffset=21, yoffset=y-445).perform()
time.sleep(0.1)
ActionChains(driver).move_to_element_with_offset(to_element=element, xoffset=21, yoffset=y-445).perform()
print ("第三步,釋放滑鼠")
#釋放滑鼠
ActionChains(driver).release(on_element=element).perform()
time.sleep(3)
#點擊驗證
# submit = driver.find_element_by_xpath("//div[@class='gt_ajax_tip success']")
# print(submit.location)
# time.sleep(5)
#關閉瀏覽器,為了演示方便,暫時注釋掉.
#driver.quit()

#主函數入口
if __name__ == '__main__':
pass
main()

❼ python爬蟲遇到驗證碼怎麼辦

遇到驗證碼就需要破解驗證碼,繞過驗證碼

❽ python如何在簡訊中提取 驗證碼

如果格式統一的話,那就檢測數據就行了,用個正則表達式,把簡訊裡面的數據內容都提取出來

❾ Python如何抓去這個驗證碼圖片然後解析輸入有沒有人告訴下

首先參考網址

網頁鏈接

其次做這種OCR文字識別的需要自己訓練模型才准確

❿ 如何利用Python 做驗證碼識別

用python加「驗證碼」為關鍵詞在里搜一下,可以找到很多關於驗證碼識別的文章。我大體看了一下,主要方法有幾類:一類是通過對圖片進行處理,然後利用字型檔特徵匹配的方法,一類是圖片處理後建立字元對應字典,還有一類是直接利用ocr模塊進行識別。不管是用什麼方法,都需要首先對圖片進行處理,於是試著對下面的驗證碼進行分析。
一、圖片處理
這個驗證碼中主要的影響因素是中間的曲線,首先考慮去掉圖片中的曲線。考慮了兩種演算法:
第一種是首先取到曲線頭的位置,即x=0時,黑點的位置。然後向後移動x的取值,觀察每個x下黑點的位置,判斷前後兩個相鄰黑點之間的距離,如果距離在一定范圍內,可以基本判斷該點是曲線上的點,最後將曲線上的點全部繪成白色。試了一下這種方法,結果得到的圖片效果很一般,曲線不能完全去除,而且容量將字元的線條去除。
第二種考慮用單位面積內點的密度來進行計算。於是首先計算單位面積內點的個數,將單位面積內點個數少於某一指定數的面積去除,剩餘的部分基本上就是驗證碼字元的部分。本例中,為了便於操作,取了5*5做為單位范圍,並調整單位面積內點的標准密度為11。處理後的效果:
二、字元驗證
這里我使用的方法是利用pytesser進行ocr識別,但由於這類驗證碼字元的不規則性,使得驗證結果的准確性並不是很高。具體哪位大牛,有什麼好的辦法,希望能給指點一下。
三、准備工作與代碼實例
1、PIL、pytesser、tesseract
(1)安裝PIL:下載地址:http:// www. pythonware. com/procts/pil/(2)pytesser:下載地址:http :/ /code. google. com/p/pytesser/,下載解壓後直接放在代碼相同的文件夾下,即可使用。
(3)Tesseract OCR engine下載:http: / / code.google. com/p/tesseract-ocr/,下載後解壓,找到tessdata文件夾,用其替換掉pytesser解壓後的tessdata文件夾即可。
2、具體代碼
復制代碼
#encoding=utf-8
###利用點的密度計算
import Image,ImageEnhance,ImageFilter,ImageDrawimport sys
from pytesser import *
#計算范圍內點的個數
def numpoint(im):
w,h = im.size
data = list( im.getdata() )
mumpoint=0
for x in range(w):
for y in range(h):
if data[ y*w + x ] !=255:#255是白色
mumpoint+=1
return mumpoint
#計算5*5范圍內點的密度
def pointmi(im):
w,h = im.size
p=[]
for y in range(0,h,5):
for x in range(0,w,5):
box = (x,y, x+5,y+5)
im1=im.crop(box)
a=numpoint(im1)
if a<11:##如果5*5范圍內小於11個點,那麼將該部分全部換為白色。
for i in range(x,x+5):
for j in range(y,y+5):
im.putpixel((i,j), 255)
im.save(r'img.jpg')
def ocrend():##識別
image_name = "img.jpg"
im = Image.open(image_name)
im = im.filter(ImageFilter.MedianFilter())enhancer = ImageEnhance.Contrast(im)
im = enhancer.enhance(2)
im = im.convert('1')
im.save("1.tif")
print image_file_to_string('1.tif')
if __name__=='__main__':
image_name = "1.png"
im = Image.open(image_name)
im = im.filter(ImageFilter.DETAIL)
im = im.filter(ImageFilter.MedianFilter())enhancer = ImageEnhance.Contrast(im)
im = enhancer.enhance(2)
im = im.convert('1')
##a=remove_point(im)
pointmi(im)
ocrend()