python  简单图像识别--验证码

记录下,准备工作安装过程很是麻烦。

首先库:pytesseract,image,tesseract,PIL

windows安装PIL,直接exe进行安装更方便(https://files.cnblogs.com/files/Oran9e/PILwin64.zip)(https://files.cnblogs.com/files/Oran9e/PILwin32.zip)

安装 image:pip install image

安装 pytesseract:pip install pytesseract

安装 tesseract:pip install tesseract  (安装 tesseracr,这里是个坑,需要安装到C盘里C:\Program Files (x86)\Tesseract-OCR,也就是默认路径 ,不然运行 python 代码的时候调用不了 tesseract.exe )

修改 tesseract.py 代码:\python\Lib\site-packages\pytesseract\tesseract.py

tesseract_cmd 改成 tesseract.exe的路径,进行调用。

  1. tesseract_cmd = 'C:/Program Files (x86)/Tesseract-OCR/tesseract.exe'

准备完上面的工作,基本上就可以进行简单的验证码识别了。

代码:

  1. #coding=utf-8
  2. from PIL import Image
  3. import pytesseract
  4. image = Image.open('2.jpg')
  5. orange = pytesseract.image_to_string(image)
  6. print orange

下篇文章将会写个自动识别验证码,实现自动登陆的小脚本。

python  简单图像识别--验证码Ⅱ

在实现自动登陆的时候,我们首先需要做到识别验证码,上篇文章讲到如何识别验证码(http://www.cnblogs.com/Oran9e/p/8799194.html)。

一般情况下,我们见到的验证码是服务器动态生成的,这个时候我们要做的就是把验证码下载到本地,然后就可以像上篇文章一样进行识别,为自动登陆打下坚实的基础。

下面就记下困扰我两天的问题,把坑说明一下。

本来是想把 cnvd 的验证码进行下载识别(http://www.cnvd.org.cn/jcaptcha/jpeg/imageCaptcha?id=1523686908)

但是 cnvd 的网站是有反爬虫机制的,打印下 get 到的内容,是<script>***</script>  js 代码,因此我认为是不能直接下载的,当然也存在右键另存为了哈。

对比下两个链接打印出来的内容(http://lab1.xseclab.com/vcode7_f7947d56f22133dbc85dda4f28530268/vcode.php)

上图可以看到,直接打印的内容是验证码图片的内容,因此这个时候我们可以进行下载,下载的时候是以二进制的方式展现,先保存到本地。

代码如下:

  1. #coding=utf-8
  2. from PIL import Image
  3. import pytesseract
  4. import requests
  5. url = 'http://lab1.xseclab.com/vcode7_f7947d56f22133dbc85dda4f28530268/vcode.php' #验证码URL
  6. headers = {'User-Agent':"Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0"} #headers
  7. url_get = requests.request("GET",url,headers=headers,verify=False) #发送请求
  8. img = url_get.content #返回的数据以二进制的方式展现
  9. with open('C:\Users\ww\Desktop\imageCaptcha.jpg',"wb") as f: #选择保存图片路径和格式
  10. f.write(img) #保存
  11. image1 = Image.open("C:\Users\ww\Desktop\imageCaptcha.jpg") #Image模块打开图片
  12. output = pytesseract.image_to_string(image1) #识别验证码
  13. print str(output) #打印验证码

当然,下载验证码也不止上面的一种方式,也可以通过截图保存验证码进行识别。有兴趣可以试试。

先记录到这里,争取晚上写出识别验证码自动登陆的脚本。

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 分别用户名和密码。

分析了上面的因素,下面就直接贴出代码。

  1. #coding=utf-8
  2. from PIL import Image
  3. import pytesseract
  4. import urllib2
  5. import urllib
  6. import PIL.ImageOps
  7. import requests
  8. import cookielib
  9. import re
  10. import sys
  11. '''图书馆登陆'''
  12. reload(sys)
  13. sys.setdefaultencoding("utf-8") #防止中文报错
  14. url = 'http://122.207.221.227:8080/pages/include/checklogin.jsp'
  15. capchaurl = 'http://122.207.221.227:8080/kaptcha/0.5458022691509324'
  16. cookie = cookielib.CookieJar() # 将cookies绑定到一个opener cookie由cookielib自动管理
  17. handler = urllib2.HTTPCookieProcessor(cookie)
  18. opener = urllib2.build_opener(handler)
  19. username='xxxxx'
  20. password='xxxxx' #用户名,密码
  21. callNo = 'callNo'
  22. picture = opener.open(capchaurl).read() # 用openr访问验证码地址,获取cookie
  23. local = open('C:\Users\ww\Desktop\goldlib.jpg',"wb") # 保存验证码到本地
  24. local.write(picture)
  25. local.close()
  26. secrecode = raw_input('yanzhengma: ') # 输入验证码
  27. postData = {
  28. 'username': username,
  29. 'password': password,
  30. 'loginType': callNo,
  31. 'kaptcha': secrecode,
  32. } # 抓包信息 构造表单
  33. headers = {
  34. 'Accept': '*/*',
  35. 'Accept-Encoding': 'gzip, deflate',
  36. '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',
  37. 'Connection': 'keep-alive',
  38. 'Content-Length': '64',
  39. 'Content-Type': 'application/x-www-form-urlencoded',
  40. 'Host': '122.207.221.227:8080',
  41. 'Referer': 'http://122.207.221.227:8080/opac/login',
  42. 'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:59.0) Gecko/20100101 Firefox/59.0',
  43. 'X-Requested-With': 'XMLHttpRequest',
  44. } # 根据抓包信息 构造headers
  45. data = urllib.urlencode(postData) # 生成post数据 ?key1=value1&key2=value2的形式
  46. request = urllib2.Request(url,data,headers) #构造request请求
  47. try:
  48. response = opener.open(request)
  49. result = response.read().decode('utf-8')
  50. print result
  51. except urllib2.HTTPError, e:
  52. print e.code

演示结果

任重而道远!

转载请注明链接(http://www.cnblogs.com/Oran9e/p/8847313.html)。

python 简单图像识别--验证码的更多相关文章

  1. python简单处理验证码,三分钟,不能再多了

    序言 大家好鸭, 又是我小熊猫啦 我们在做采集数据的时候,过快或者访问频繁,或者一访问就给弹出验证码,然后就蚌珠了~今天就给大家来一个简单处理验证码的方法 环境模块 Python和pycharm如果还 ...

  2. 基于SVM的python简单实现验证码识别

    验证码识别是一个适合入门机器学习的项目,之前用knn 做过一个很简单的,这次用svm来实现.svm直接用了开源的库libsvm.验证码选的比较简单,代码也写得略乱,大家看看就好. 1. 爬取验证码图片 ...

  3. Python简单的验证码生成

    用python生成简单的四位数验证码: 1 import random 2 3 if __name__ == "__main__": #这句话简单的理解就是,只有在本文件下以下的代 ...

  4. Flask学习之旅--用 Python + Flask 制作一个简单的验证码系统

    一.写在前面 现在无论大大小小的网站,基本上都会使用验证码,登录的时候要验证,下载的时候要验证,而使用的验证码也从那些简简单单的字符图形验证码“进化”成了需要进行图文识别的验证码.需要拖动滑块的滑动验 ...

  5. python简单验证码识别

    在学习python通过接口自动登录网站时,用户名密码.cookies.headers都好解决但是在碰到验证码这个时就有点棘手了:于是通过网上看贴,看官网完成了对简单验证码的识别,如果是复杂的请看大神的 ...

  6. Python 常用模块系列学习(1)--random模块常用function总结--简单应用--验证码生成

    random模块--random是一个生成器 首先: import random    #导入模块 print (help(random))    #打印random模块帮助信息 常用function ...

  7. Python识别网站验证码

    http://drops.wooyun.org/tips/6313 Python识别网站验证码 Manning · 2015/05/28 10:57 0x00 识别涉及技术 验证码识别涉及很多方面的内 ...

  8. 太嚣张了!他竟用Python绕过了“验证码”

    在web页面中,经常会遇到验证码,这对于我这么一个热爱web自动化测试人员,就变成了一件头疼的事.于是千方百计找各种资源得到破解简单的验证码方法. 识别验证码 大致分如下几个步骤: 1.获取验证码图片 ...

  9. python爬虫20 | 小帅b教你如何使用python识别图片验证码

    当你在爬取某些网站的时候 对于你的一些频繁请求 对方会阻碍你 常见的方式就是使用验证码 验证码的主要功能 就是区分你是人还是鬼(机器人) 人 想法设法的搞一些手段来对付技术 而 技术又能对付人们的想法 ...

随机推荐

  1. python基础---面向对象的概念

    1.面向对象 什么是面向过程?? 将一个复杂单位问题一步步小化,最终只需要完成一个人小的功能就可以了 比如:将大象放进冰箱要几步? 一共三步:打开冰箱,把大象塞进入,关门就可以了 优点:复杂度降低了, ...

  2. QWaiteCondition思考3

    QWaitConditioin::wait() 接收一个mutex作为参数,这个mutex应该被调用线程初始化为锁定状态.在线程进入休眠状态(waite)之前,mutex会被解锁.当线程被唤醒(Wak ...

  3. oc语言的Foundation框架(学习笔记2)

    紧接上文…… 4.集合对象 4.1数组 1.基本概念 Foundation中的数组(NSArray,NSMutableArray)是一组有序的对象集合,通过索引下标获取到数组中的各个元素,也分可变和不 ...

  4. css常用的可继承属性和不可继承属性

    不可继承属性1.display2.text-decoration 添加文本样式3.list-style4.盒子模型属性(如padding系列,border系列,margin等,width,height ...

  5. Java内省机制

    转自: https://blog.csdn.net/hahalzb/article/details/5972421 1.java内省机制其实通俗的理解为,对自身的进行一个扫描,这个扫描的对象就是我们普 ...

  6. Web测试常见问题点汇总

    UI测试 [目标] 确保用户可以访问产品所提供的浏览功能.符合企业或行业标准,包含用户易用性,友好性.可操作性等 [关注点] 菜单.对话框以及上边的文字.按钮.错误提示.帮助信息.图标.位置等. [常 ...

  7. 搭建opencv javaweb项目

    搭建opencv javaweb项目 用到的技术maven.git.ssm.opencv.javaweb 搭建opencv javaweb项目时,踩了很多坑:怀疑过spring,想过python,最后 ...

  8. django_视图层_编写url

    URL的配置 django中,url也称urlconf,默认的django项目设定两个url地址,分别是admin站点管理和首页地址.from diango.urls import path,incl ...

  9. JavaScript 之 预编译 作用域,作用域链

    第一次写博客,本来是学习jQuery遇到闭包问题,发现并没有理解闭包,发现闭包牵扯的知识点太多.复习了一遍(发现自己该记住的全忘了)写在博客里,自己也是小白,希望大神们指点迷津,必将感激不尽. 我们知 ...

  10. js···DOM2动态创建节点

    1.生成节点的方法  document.createElement(“div”) 2.插入节点的方法   父元素.appendChild(新节点) 在父节点中的子节点后面插入新的节点 3.在指定的位置 ...