python處理驗證碼
⑴ 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爬蟲識別驗證碼
在用爬蟲爬取網站數據時,有些站點的一些關鍵數據的獲取需要使用賬號登錄,這里可以使用requests發送登錄請求,並用Session對象來自動處理相關Cookie。
另外在登錄時,有些網站有時會要求輸入驗證碼,比較簡單的驗證碼可以直接用pytesser來識別,復雜的驗證碼可以依據相應的特徵自己採集數據訓練分類器。
以CSDN網站的登錄為例,這里用Python的requests庫與pytesser庫寫了一個登錄函數。如果需要輸入驗證碼,函數會首先下載驗證碼到本地,然後用pytesser識別驗證碼後登錄,對於CSDN登錄驗證碼,pytesser的識別率很高。
⑶ 如何利用Python做簡單的驗證碼識別
最簡單的是這個:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/python3.4
# -*- coding: utf-8 -*-
# 1、pip3 install pyocr
# 2、pip3 install pillow or easy_install Pillow
# 3、安裝tesseract-ocr:,安裝在C:\Program Files\下
# 4、要求python默認安裝在C盤
# 代碼:
# !/usr/bin/python3.4
# -*- coding: utf-8 -*-
import pytesseract
from PIL import Image
image = Image.open('../jpg/code.png')
code = pytesseract.image_to_string(image)
print(code)
⑷ 如何用Python+人工識別處理知乎的倒立漢字驗證碼
這給Python爬蟲的模擬登錄帶來了一定的難度,目前網路上的相關資料針對的都是普通的「英文+數字」驗證碼,針對「倒立漢字」驗證碼的文章較少。而且大家普遍採用的是requests庫。經過幾天的研究,我採用urllib.request實現了模擬登陸知乎,現將代碼分享如下:
[python] view plain
# 登錄知乎,通過保存驗證圖片方式
import urllib.request
import urllib.parse
import time
import http.cookiejar
webUrl = "l"#不能寫因為不支持重定向
webheader = {
# 'Accept': 'text/html, application/xhtml+xml, */*',
# 'Accept-Language': 'zh-CN',
# 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko',
'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Mobile Safari/537.36',
# 'User-Agent': 'Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5',
# 'DNT': '1',
# 'Connection': 'Keep-Alive'
}
postData = {
'email': '在這里寫你的賬號',
'captcha_type': 'cn',
'password': '在這里寫你的密碼',
'_xsrf': '',
'captcha': ''
}
localStorePath = "寫你想保存的驗證碼圖片的地址"
if __name__ == '__main__':
#聲明一個CookieJar對象實例來保存cookie
cookie = http.cookiejar.CookieJar()
#創建opener
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)#建立opener對象,並添加頭信息
urllib.request.install_opener(opener)
captcha_url = '?r=%d&type=login&lang=cn' % (time.time() * 1000)
# captcha_url = '/captcha.gif?r=%d&type=login' % (time.time() * 1000)#這樣獲得的是「字母+數字驗證碼」
#這個獲取驗證碼圖片的方法是不行的!
# urllib.request.urlretrieve(captcha_url, localStorePath + 'myCaptcha.gif')
#用urlopen函數保存驗證圖片
req = urllib.request.Request(url=captcha_url,headers=webheader)
content = urllib.request.urlopen(req)
# content = opener.open(req)
captcha_name = 'D:/Python學習/crawler_learning/知乎登錄專題研究/知乎驗證碼圖片/myNewCaptcha.gif'
content = content.read()
with open(captcha_name, 'wb') as f:
f.write(content)
postData['captcha'] = input('請輸入驗證碼')
# postData['_xsrf'] = get_xsrf()
postData['_xsrf'] = ''
print(postData['_xsrf'])
#用urlopen函數傳送數據給伺服器實現登錄
postData_encoded = urllib.parse.urlencode(postData).encode('utf-8')
req = urllib.request.Request(url=webUrl,data=postData_encoded,headers=webheader)
webPage = urllib.request.urlopen(req)
# webPage = opener.open(req)
data = webPage.read().decode('utf-8')
print(data)
with open("D:/知乎伺服器反饋的內容.txt",mode='w',encoding='utf-8') as dataFile:
dataFile.write(data)
幾點思考:
1、首先需要明確如何獲得驗證碼圖片的地址,利用Fiddler抓包獲得的典型的驗證碼圖片的地址如下:
這個「r」代表的是什麼含義呢?經過查看知乎上的js代碼可以確定,這個r指的是毫秒級的時間戳。
2、以驗證碼圖片地址cn為例,不同時間訪問同一個驗證碼圖片地址,得到的驗證碼圖片是不同的,那麼知乎伺服器是如何知道你獲取的是那張驗證碼呢?
我認為是通過sessionID,換句話說,知乎把某個驗證碼圖片給了你,同時知乎記錄下了你的sessionID和這個驗證碼的「正確答案」,這樣將來你輸入驗證碼給知乎後,知乎就能判斷你輸入的驗證碼是否正確了。
由於sessionID保存在cookie之中,所以Python模擬登陸的代碼必須使用cookie。
3、獲取驗證碼圖片的時候,我用的是content =urllib.request.urlopen (req)函數,經過我的驗證,用
urllib.request.urlretrieve函數是不行的,因為urlopen函數可以傳遞headers參數,而這一個參數必須有。
4、獲得了倒立漢字圖片以後,如何確定要傳遞給知乎的captcha是什麼呢?經過Fiddler抓包,
傳遞的參數類似於這樣:
{"img_size":[200,44],"input_points":[[43.44,22.44],[115.72,22.44]]}
經過分析和試驗確定:200指的是圖片長度,44指的是圖片高度,後面的input_points指的是打在倒立漢字上的點的坐標。由於每次出現7個漢字,這7個漢字的坐標是固定的,我全部進行捕獲:
{"img_size":[200,44],"input_points":[[12.95,14.969999999999998],[36.1,16.009999999999998],[57.16,24.44],[84.52,19.17],[108.72,28.64],[132.95,24.44],[151.89,23.380000000000002]]}
然後,問題就簡單了:將圖片保存在本地之後,打開圖片,確定哪幾個漢字倒立,比如說第2個和第6個,那就在上面選取出2和6的坐標輸入即可,即
{"img_size":[200,44],"input_points":[[36.1,16.009999999999998],[132.95,24.44]]}。
5、小竅門:以驗證碼圖片地址
⑸ 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抓取網頁時是如何處理驗證碼的?下面給大家介紹幾種方法:
1、輸入式驗證碼
這種驗證碼主要是通過用戶輸入圖片中的字母、數字、漢字等進行驗證。如下圖:
解決思路:這種是最簡單的一種,只要識別出裡面的內容,然後填入到輸入框中即可。這種識別技術叫OCR,這里我們推薦使用Python的第三方庫,tesserocr。對於沒有什麼背影影響的驗證碼如圖2,直接通過這個庫來識別就可以。但是對於有嘈雜的背景的驗證碼這種,直接識別識別率會很低,遇到這種我們就得需要先處理一下圖片,先對圖片進行灰度化,然後再進行二值化,再去識別,這樣識別率會大大提高。
相關推薦:《Python入門教程》
2、滑動式驗證碼
這種是將備選碎片直線滑動到正確的位置,如下圖:
解決思路:對於這種驗證碼就比較復雜一點,但也是有相應的辦法。我們直接想到的就是模擬人去拖動驗證碼的行為,點擊按鈕,然後看到了缺口的位置,最後把拼圖拖到缺口位置處完成驗證。
第一步:點擊按鈕。然後我們發現,在你沒有點擊按鈕的時候那個缺口和拼圖是沒有出現的,點擊後才出現,這為我們找到缺口的位置提供了靈感。
第二步:拖到缺口位置。
我們知道拼圖應該拖到缺口處,但是這個距離如果用數值來表示?
通過我們第一步觀察到的現象,我們可以找到缺口的位置。這里我們可以比較兩張圖的像素,設置一個基準值,如果某個位置的差值超過了基準值,那我們就找到了這兩張圖片不一樣的位置,當然我們是從那塊拼圖的右側開始並且從左到右,找到第一個不一樣的位置時就結束,這是的位置應該是缺口的left,所以我們使用selenium拖到這個位置即可。
這里還有個疑問就是如何能自動的保存這兩張圖?
這里我們可以先找到這個標簽,然後獲取它的location和size,然後 top,bottom,left,right = location['y'] ,location['y']+size['height']+ location['x'] + size['width'] ,然後截圖,最後摳圖填入這四個位置就行。
具體的使用可以查看selenium文檔,點擊按鈕前摳張圖,點擊後再摳張圖。最後拖動的時候要需要模擬人的行為,先加速然後減速。因為這種驗證碼有行為特徵檢測,人是不可能做到一直勻速的,否則它就判定為是機器在拖動,這樣就無法通過驗證了。
3、點擊式的圖文驗證和圖標選擇
圖文驗證:通過文字提醒用戶點擊圖中相同字的位置進行驗證。
圖標選擇: 給出一組圖片,按要求點擊其中一張或者多張。借用萬物識別的難度阻擋機器。
這兩種原理相似,只不過是一個是給出文字,點擊圖片中的文字,一個是給出圖片,點出內容相同的圖片。
這兩種沒有特別好的方法,只能藉助第三方識別介面來識別出相同的內容,推薦一個超級鷹,把驗證碼發過去,會返回相應的點擊坐標。
然後再使用selenium模擬點擊即可。具體怎麼獲取圖片和上面方法一樣。
4、宮格驗證碼
這種就很棘手,每一次出現的都不一樣,但是也會出現一樣的。而且拖動順序都不一樣。
但是我們發現不一樣的驗證碼個數是有限的,這里採用模版匹配的方法。我覺得就好像暴力枚舉,把所有出現的驗證碼保存下來,然後挑出不一樣的驗證碼,按照拖動順序命名,我們從左到右上下到下,設為1,2,3,4。上圖的滑動順序為4,3,2,1,所以我們命名4_3_2_1.png,這里得手動搞。當驗證碼出現的時候,用我們保存的圖片一一枚舉,與出現這種比較像素,方法見上面。如果匹配上了,拖動順序就為4,3,2,1。然後使用selenium模擬即可。
⑻ python爬驗證碼
1.找地址
首先,我們要找到這個網站生成驗證碼的地址,這個地址我們可以通過查看他的源代碼來實現。
1.找地址
首先,我們要找到這個網站生成驗證碼的地址,這個地址我們可以通過查看他的源代碼來實現。
就以某大學教務網為例,這個教務網的模板很多學校都在採用:
我就截取表單的驗證碼部分即可。
<tdalign="center"rowspan="3">
<imgid="imgCode"src="../sys/ValidateCode.aspx"
onclick="changeValidateCode(this)"alt="單擊可更換圖片!"
style="CURSOR:pointer;">
<br>看不清,則單擊圖片!
</td>123456123456
這里就可以知道,地址就是../sys/ValidateCode.aspx
組合一下地址就是http://jwmis.lmu.cn/sys/ValidateCode.aspx
也就是我們等一下要用到的地址了。
我們可以查看一下那個網頁。
2.處理圖片
去查看了一下那個地址
果不其然,都是亂碼,因為驗證碼分為兩種。
1)直接處理成JPG/GIF/PNG或者其他格式,然後直接讀取到一個圖片地址。
2)接收用戶觸發,然後生成,再直接處理成圖像,不讀取到一個圖片地址。
我們這里是第二種,我們要自己來讀取他,到本地,再手動輸入驗證碼。
#-*-coding:utf-8-*-
importurllib2
#驗證碼的處理#
#驗證碼生成頁面的地址#
im_url='http://jwmis.lmu.cn/sys/ValidateCode.aspx'
#讀取驗證碼圖片#
im_data=urllib2.urlopen(im_url).read()
#打開一個Code.PNG文件在D盤,沒有的話自動生成#
f=open('d:\Code.png','wb')
#寫入圖片內容#
f.write(im_data)
#關閉文件#
f.close()
這里包括兩個部分:
1)打開那個生成驗證碼圖片的頁面,讀取
2)將讀取到的內容,保存成圖片,下載到本地
我們這里的地址是可以隨便寫的,保存在你想保存的地方。
到這里我們就完成了驗證碼的一小部分。
by–LoDog
希望能幫到你!
⑼ 如何利用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()
⑽ Python有什麼好的庫可以識別驗證碼
要安裝pytesseract庫,必須先安裝其依賴的PIL及tesseract-ocr,其中PIL為圖像處理庫,而後面的tesseract-ocr則為google的ocr識別引擎。
pytesseract安裝
直接使用pip install pytesseract安裝即可,或者使用easy_install pytesseract
Python驗證碼識別代碼:
import pytesseract
from PIL import Image
image = Image.open('vcode.png')
vcode = pytesseract.image_to_string(image)
print (vcode)