基于python的验证码识别
在利用python对一些网站进行批量操作的时候,验证码是个绕不过去的东西,虽然现在网上有很多图像识别的api,但是可能不适用于你的项目,我为了批量爬取班上同学的学分绩点写了个简单的图像识别大家可以参考一下我的图像识别的思路。
1. 验证码图片的获取
想要分析验证码,首先就需要获取验证码进行分析,在谷歌浏览器上打开验证码所在页面,打开开发者工具,选择NetWork,然后刷新一下验证码,就可以得到验证码的url地址,具体可以参考伯乐在线上的python计算学分绩点。
有了验证码url以后,我们就可以利用python将验证码图片保存在本地,便于分析,代码如下。
import urllib
import urllib.request
import http.cookiejar
#自己分析出的验证码url
yzmurl = 'http://run.hbut.edu.cn/Account/GetValidateCode?time=1488614613244'
#从数据包中分析出,处理post请求的url
posturl = 'http://run.hbut.edu.cn/Account/LogOn'hosturl = 'http://run.hbut.edu.cn/Account/LogOn?ReturnUrl=%2f' #主页url
#加载cookie
cj = http.cookiejar.LWPCookieJar()
cookie_support = urllib.request.HTTPCookieProcessor(cj)
opener = urllib.request.build_opener(cookie_support, urllib.request.HTTPHandler)
urllib.request.install_opener(opener)
#打开登录主页面(他的目的是从页面下载cookie,这样我们在再送post数据时就有cookie了,否则发送不成功)
h = urllib.request.urlopen(hosturl)
#获取验证码图片
picture = opener.open(yzmurl).read()
#保存图片在本地
local = open('d://image.jpg', 'wb')
local.write(picture)
local.close()
2.将彩色图片变为黑白
图片识别因为彩色图片比较复杂,一般把图片变为黑白。先把图片用 ‘cconvert(“L”)’ 转化为256级灰度图像,再根据图片的阈值转化成黑白图像,阈值的合适与否直接影响到黑白图像的轮廓是否清晰从而影响图像识别的准确度。彩色图片转化为黑白详情请参考不剃头的一休哥,阈值的作用及求法请参考阮一峰大牛的相似图片搜索。我的代码如下。
from PIL import Image
#打开图片
im=Image.open("d:\\image.jpg")
#将图片转化为灰度
imgry = im.convert("L")
#计算阈值
threshold=thresholds(imgry)
#转化为黑白图片
table = []
for i in range(256):
if i < threshold:
table.append(0)
else:
table.append(1)
out = imgry.point(table,'1')
#阈值计算函数,算法请看上面的链接
def thresholds(im):
x,y=im.size
n=x*y
#print(n)
max=0
for i in range(256):
n1=0