python 簡單圖像識別--驗證碼Ⅲ
阿新 • • 發佈:2018-04-15
use 頁面 lte headers 新的 AR -a 提交 進行
python 簡單圖像識別--驗證碼Ⅲ
實現自動登陸網站
登錄學校圖書館管理系統為例,做一個簡單的例子。python識別簡單的沒有幹擾的純數字驗證碼還是可以的,但是識別字母數字再加上幹擾因素,誤報率很高,因此這個我是采用”人工識別“,人工輸入。
首先得明白cookie的作用,cookie是某些網站為了辨別用戶身份、進行session跟蹤而儲存在用戶本地終端上的數據。因此我們需要用Cookielib模塊來保持網站的cookie。
登錄學校圖書館管理系統登陸(http://122.207.221.227:8080/opac/login),驗證碼(http://122.207.221.227:8080/kaptcha/goldlib)
可以發現這個驗證碼是動態更新的每次打開都不一樣,一般這種驗證碼和cookie是同步的。想識別驗證碼肯定是吃力不討好的事,因此我們的思路是首先訪問驗證碼頁面,保存驗證碼、獲取cookie用於登錄,然後再直接向登錄地址post數據。
先分析登錄頁面需要post的request和header信息
從中可以看出需要 post 的url並不是訪問的頁面,而是(http://122.207.221.227:8080/pages/include/checklogin.jsp)
其中需要提交的表單數據中 username 和 password 分別用戶名和密碼。
分析了上面的因素,下面就直接貼出代碼。
#coding=utf-8 from PIL import Image import pytesseract import urllib2 import urllib import PIL.ImageOps import requests import cookielib import re import sys ‘‘‘圖書館登陸‘‘‘ reload(sys) sys.setdefaultencoding("utf-8") #防止中文報錯 url = ‘http://122.207.221.227:8080/pages/include/checklogin.jsp‘ capchaurl = ‘http://122.207.221.227:8080/kaptcha/0.5458022691509324‘ cookie = cookielib.CookieJar() # 將cookies綁定到一個opener cookie由cookielib自動管理 handler = urllib2.HTTPCookieProcessor(cookie) opener = urllib2.build_opener(handler) username=‘xxxxx‘ password=‘xxxxx‘ #用戶名,密碼 callNo = ‘callNo‘ picture = opener.open(capchaurl).read() # 用openr訪問驗證碼地址,獲取cookie local = open(‘C:\Users\ww\Desktop\goldlib.jpg‘,"wb") # 保存驗證碼到本地 local.write(picture) local.close() secrecode = raw_input(‘yanzhengma: ‘) # 輸入驗證碼 postData = { ‘username‘: username, ‘password‘: password, ‘loginType‘: callNo, ‘kaptcha‘: secrecode, } # 抓包信息 構造表單 headers = { ‘Accept‘: ‘*/*‘, ‘Accept-Encoding‘: ‘gzip, deflate‘, ‘Accept-Language‘: ‘zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2‘, ‘Connection‘: ‘keep-alive‘, ‘Content-Length‘: ‘64‘, ‘Content-Type‘: ‘application/x-www-form-urlencoded‘, ‘Host‘: ‘122.207.221.227:8080‘, ‘Referer‘: ‘http://122.207.221.227:8080/opac/login‘, ‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:59.0) Gecko/20100101 Firefox/59.0‘, ‘X-Requested-With‘: ‘XMLHttpRequest‘, } # 根據抓包信息 構造headers data = urllib.urlencode(postData) # 生成post數據 ?key1=value1&key2=value2的形式 request = urllib2.Request(url,data,headers) #構造request請求 try: response = opener.open(request) result = response.read().decode(‘utf-8‘) print result except urllib2.HTTPError, e: print e.code
演示結果
python 簡單圖像識別--驗證碼Ⅲ