我現在使用 phantomJS 截圖,然后裁剪得到驗證碼,再通過Python光學識別獲取驗證碼。
這個過程中遇到 phantomJS 截圖大小不一致的問題,我本地的和服務器的圖片,驗證碼的位置不一致。沒辦法,只好把服務器上的圖片 scp 下來,然后更改像素位置。
為什么不直接下載圖片下來呢?
每次點擊圖片,圖片都會變化。應該是要將 cookie 和驗證碼一起提交上去。要驗證這個觀點,我決定使用 Charles 抓包看這些請求的順序,並更改 cookie 看下有什么變化。驗證碼的思路是不是這樣的:
給定一個 Cookie: JSESSIONID=031BC3B941D43115B95924C504662637; 然后每次請求驗證碼,將這個 cookie 與驗證碼對應起來,如果多次請求,那么驗證碼以最近的為准,即新驗證碼會覆蓋舊驗證碼。
有一個網站驗證碼地址是這樣的,剛打開登錄頁,驗證碼地址是
/traffic_web/kaptcha.jpg
重發請求 `/traffic_web/kaptcha.jpg`,驗證碼圖片一直會變。應該是后端隨機選擇一張圖片,然后與 cookie 綁定,再返回給客戶端。這樣的圖片我們要怎么下載呢?應該是以當前的 cookie 訪問 `/traffic_web/kaptcha.jpg` 並下載圖片,再登錄,整個過程中 cookie 應該是同一個。
因為一開始圖方便就是用了 PhantomJS,大開大合。那現在這種情況要怎么處理呢?使用 session_request,cookie 從 phantomjs 中讀取。我做的就是把截圖變為下載圖片,減少不穩定性。
試了一下,成功登陸。下面是我的代碼:
import requests import shutil # 你們拿別的 url 去試一下,我這個是工作中用到的,不方便公開 url="http://url_to_kaptcha.jpg"
def download_img(url, img_name, cookie_value, referer):
"""
:param url: 圖片 url
:param img_name: 保存的圖片名字 包括文件后綴 :eg: a.jpg
:param cookie_value:
:param referer: 頭部,一般是登錄頁
:return:
"""
headers = {'Accept-Encoding': 'gzip, deflate, sdch',
'Accept-Language': 'zh-CN,zh;q=0.8,en;q=0.6',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36',
'Accept': 'image/webp,image/*,*/*;q=0.8',
'Referer': referer,
'Cookie': cookie_value}
session_request = requests.session()
response = session_request.get(url, headers=headers, stream=True)
if response.status_code == 200:
with open(img_name, 'wb') as out_file:
shutil.copyfileobj(response.raw, out_file)
del response
else:
del response
raise Exception('unknown error, can\'t find image')
還可以擴展的是
- 使用 GitHub 上別人做好的識別驗證碼的庫,對圖片做修建。 https://github.com/00nanhai/captchacker2
- 那些對圖片預處理的算法有沒有封裝好可以直接調用的?
- 這下面看着名詞都很嚇人啊!
de_noise去噪
color_filter顏色過濾
edge_detection邊緣檢測
floodfill油漆桶
dynamic_programing動態規划
Erosion腐蝕
Dilation膨脹
Pixels_projection像素投影(垂直和斜切)
svm支持向量機
干擾線檢測(深度優先搜索和最短路徑算法)
- 這下面看着名詞都很嚇人啊!
- 什么情況用什么預處理算法?
- 那些對圖片預處理的算法有沒有封裝好可以直接調用的?
- 抓取大量驗證碼圖片,使用機器學習提高識別率
- 什么情況下要上機器學習?
搜索了一下,沒找到很系統的預處理+機器學習破解驗證碼的資料。現在機器學習不是很火嗎?怎么找不相關的系統的資料?
我現在因為可以讓對方不封 IP,所以也沒動力去提高驗證碼識別率,使用Python的OCR,不做任何配置,只在 Python 代碼中檢驗識別后的驗證碼去除空格的位數是否合適,一般最多識別10次就能成功登陸。
實踐:
根據這篇文章:http://www.jianshu.com/p/41127bf90ca9
在 `4鄰域像素算法` 遇到問題,不知道 `對於像素值>245的鄰域像素,判別為屬於背景色,` 這個結論是怎么來的。我根據我的驗證碼處理情況,調小了這個數值,使不能識別,變成了 1/10 的識別率,對於我來說就夠用了。我感覺這個 `245` 是灰度值,然后查了40分鍾,怎樣用 PS 來查看一個區域的灰度,沒有實現。PS,excel 這樣的東西,我認為就需要視頻教學+重復練習,臨時來搜索,很花時間。
欠缺:如果要提高成功率,還是要找系統的資料來看。
參考: