爬蟲驗證碼


我現在使用 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')

  

還可以擴展的是

  1. 使用 GitHub 上別人做好的識別驗證碼的庫,對圖片做修建。  https://github.com/00nanhai/captchacker2
    1. 那些對圖片預處理的算法有沒有封裝好可以直接調用的?
      1. 這下面看着名詞都很嚇人啊!

        de_noise去噪
        color_filter顏色過濾
        edge_detection邊緣檢測
        floodfill油漆桶
        dynamic_programing動態規划
        Erosion腐蝕
        Dilation膨脹
        Pixels_projection像素投影(垂直和斜切)
        svm支持向量機
        干擾線檢測(深度優先搜索和最短路徑算法)

    2. 什么情況用什么預處理算法?
  2. 抓取大量驗證碼圖片,使用機器學習提高識別率
    1.   什么情況下要上機器學習?

搜索了一下,沒找到很系統的預處理+機器學習破解驗證碼的資料。現在機器學習不是很火嗎?怎么找不相關的系統的資料?

 

我現在因為可以讓對方不封 IP,所以也沒動力去提高驗證碼識別率,使用Python的OCR,不做任何配置,只在 Python 代碼中檢驗識別后的驗證碼去除空格的位數是否合適,一般最多識別10次就能成功登陸。

 實踐:

根據這篇文章:http://www.jianshu.com/p/41127bf90ca9

在 `4鄰域像素算法` 遇到問題,不知道 `對於像素值>245的鄰域像素,判別為屬於背景色,` 這個結論是怎么來的。我根據我的驗證碼處理情況,調小了這個數值,使不能識別,變成了 1/10 的識別率,對於我來說就夠用了。我感覺這個 `245` 是灰度值,然后查了40分鍾,怎樣用 PS 來查看一個區域的灰度,沒有實現。PS,excel 這樣的東西,我認為就需要視頻教學+重復練習,臨時來搜索,很花時間。

欠缺:如果要提高成功率,還是要找系統的資料來看。

參考:

驗證碼識別的概念與處理流程

簡單帶干擾線驗證碼處理方法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM