動態HTML處理和機器影象識別-----案例:嘗試對驗證碼進行機器識別處理
阿新 • • 發佈:2018-11-12
嘗試對知乎網驗證碼進行處理:
許多流行的內容管理系統即使加了驗證碼模組,其眾所周知的註冊頁面也經常會遭到網路 機器人的垃圾註冊。
那麼,這些網路機器人究,竟是怎麼做的呢?既然我們已經,可以成功地識別出儲存在電腦上 的驗證碼了,那麼如何才能實現一個全能的網路機器人呢?
大多數網站生成的驗證碼圖片都具有以下屬性。
- 它們是伺服器端的程式動態生成的圖片。驗證碼圖片的 src 屬性可能和普通圖片不太一 樣,比如
<img src="WebForm.aspx?id=8AP85CQKE9TJ">
,但是可以和其他圖片一樣進行 下載和處理。 - 圖片的答案儲存在伺服器端的資料庫裡。
- 很多驗證碼都有時間限制,如果你太長時間沒解決就會失效。
- 常用的處理方法就是,首先把驗證碼圖片下載到硬盤裡,清理乾淨,然後用 Tesseract 處理 圖片,最後返回符合網站要求的識別結果。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import requests
import time
import pytesseract from PIL import Image from bs4 import BeautifulSoup def captcha(data): with open('captcha.jpg','wb') as fp: fp.write(data) time.sleep(1) image = Image.open("captcha.jpg") text = pytesseract.image_to_string(image) print "機器識別後的驗證碼為:" + text command = raw_input("請輸入Y表示同意使用,按其他鍵自行重新輸入:") if (command == "Y" or command == "y"): return text else: return raw_input('輸入驗證碼:') def zhihuLogin(username,password): # 構建一個儲存Cookie值的session物件 sessiona = requests.Session() headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0'} # 先獲取頁面資訊,找到需要POST的資料(並且已記錄當前頁面的Cookie) html = sessiona.get('https://www.zhihu.com/#signin', headers=headers).content # 找到 name 屬性值為 _xsrf 的input標籤,取出value裡的值 _xsrf = BeautifulSoup(html ,'lxml').find('input', attrs={'name':'_xsrf'}).get('value') # 取出驗證碼,r後面的值是Unix時間戳,time.time() captcha_url = 'https://www.zhihu.com/captcha.gif?r=%d&type=login' % (time.time() * 1000) response = sessiona.get(captcha_url, headers = headers) data = { "_xsrf":_xsrf, "email":username, "password":password, "remember_me":True, "captcha": captcha(response.content) } response = sessiona.post('https://www.zhihu.com/login/email', data = data, headers=headers) print response.text response = sessiona.get('https://www.zhihu.com/people/maozhaojun/activities', headers=headers) print response.text if __name__ == "__main__": #username = raw_input("username") #password = raw_input("password") zhihuLogin(' [email protected]','ALAxxxxIME')
值得注意的是,有兩種異常情況會導致這個程式執行失敗。第一種情況是,如果 Tesseract 從驗證碼圖片中識別的結果不是四個字元(因為訓練樣本中驗證碼的所有有效答案都必須 是四個字元),結果不會被提交,程式失敗。第二種情況是雖然識別的結果是四個字元, 被提交到了表單,但是伺服器對結果不認可,程式仍然失敗。
在實際執行過程中,第一種 情況發生的可能性大約為 50%,發生時程式不會向表單提交,程式直接結束並提示驗證碼 識別錯誤。第二種異常情況發生的概率約為 20%,四個字元都對的概率約是 30%(每個字 母的識別正確率大約是 80%,如果是五個字元都識別,正確的總概率是 32.8%)。