【转】Python OCR识别图片验证码
转载自:博客
对于某些网站登录的时候,往往需要输入验证码才能实现登录。如果要爬虫这类网站,往往总会比这个验证码导致无法爬取数据。以下介绍一种比较折中的方法,也是比较可行的方法:
实现思想:
1、通过截图获取验证码图片,为什么要截图,有的人会说,可以通过验证码图片的链接爬取下来,再用OCR识别就可以了,理论上这个方法是可行的,但是当你用这方法的时候,会发觉下载的图片和你实际页面的图片里面的内容是不一样的。
2、截图图片后,通过OCR识别,返回验证码内容,完成登录。
代码:
#保存图片,通过显示器xy坐标,这里值得注意的是,如果每个显示器的分辨率是不一样的,(332,415,385,440)这个坐标会随时改动。
from PIL import ImageGrab
addr='E:\\OCR\\bb.png'
im = ImageGrab.grab((332,415,385,440))
im.save(addr,'png')
OCR识别,尽管上OCR识别有一定的准确率,但这个是可以通过ocr开发提高识别准确率的。
import pytesser3
print (pytesser3.image_file_to_string('bb.png'))
运行:
下载图片:
OCR识别:
定义一个简单登录方法:
from PIL import ImageGrab
import pytesser3
from selenium import webdriver def loginSys(loginName,password):
driver=webdriver.Ie()
driver.get(url)
driver.implicitly_wait(60)
LoginTitle=driver.title while 1:
result=driver.title
if LoginTitle==result:
#截图
addr='E:\\OCR\\bb.png'
im = ImageGrab.grab((332,415,385,440))
im.save(addr,'png')
#OCR
Code=pytesser3.image_file_to_string('bb.png')
print (pytesser3.image_file_to_string('bb.png'))
#自动登录,find_element_by_id自行修改
driver.switch_to.frame('loginFormFrame')
driver.find_element_by_id('id_loginName').send_keys(loginName)
driver.find_element_by_id('id_password').send_keys(password)
driver.find_element_by_id('id_certCode').send_keys(Code)
driver.implicitly_wait(10)
driver.find_element_by_xpath('//img[@onclick="doLogin();"]').click()
driver.implicitly_wait(10)
driver.switch_to.default_content()
else:
break
#cookies传递,用于request爬取数据
cook=driver.get_cookies()
cookies[cook[0]['name']]=cook[0]['value']
解释:这里用了selenium做一个自动化登录的,这里会有疑问,为何不用requests,或者scrapy直接做后台登录。
原因如下:首先我们找到登录
这是一张图片,而且图片触发是一个js,再看js
js代码很长,大部分都是做检测功能。
如图所示,可以看到,这个登录是用get方法实现的,但是str是做了加密处理。
我用过python的Base64解密,但解密出来的结果不一样。
所以只能用到上述的方法。
【转】Python OCR识别图片验证码的更多相关文章
- python+selenium识别图片验证码
import timeimport pytesseractfrom PIL import Image, ImageEnhancefrom selenium import webdriver url = ...
- python 识别图片验证码报IOError
说一下困扰了我一周的问题:识别图片验证码 本来我按照安装步骤(http://www.cnblogs.com/yeayee/p/4955506.html?utm_source=tuicool&u ...
- Python 实现简单图片验证码登录
朋友说公司要在测试环境做接口测试,登录时需要传入正确的图片的验证码,本着懒省事的原则,推荐他把测试环境的图片验证码写死,我们公司也是这么做的^_^.劝说无果/(ㄒoㄒ)/~~,只能通过 OCR 技术来 ...
- Python - WebDriver 识别登录验证码
Python - WebDriver 识别登录验证码 没什么可说的直接上代码! #-*-coding:utf-8-*- # Time:2017/9/29 7:16 # Author:YangYangJ ...
- 【java+selenium3】Tesseract-OCR识别图片验证码 (十六)
[java+selenium+Tesseract-OCR(图片识别)+AutoIt(windows窗口识别)]完成自动化图片验证码识别! 一.AutoIt(windows窗口识别)参考:https:/ ...
- python爬虫20 | 小帅b教你如何使用python识别图片验证码
当你在爬取某些网站的时候 对于你的一些频繁请求 对方会阻碍你 常见的方式就是使用验证码 验证码的主要功能 就是区分你是人还是鬼(机器人) 人 想法设法的搞一些手段来对付技术 而 技术又能对付人们的想法 ...
- 【python】带图片验证码的登录自动化实战
近期在跟进新项目的时候,整体的业务线非常之长,会一直重复登录退出不同账号的这个流程,所以想从登录开始实现部分的自动化.因为是B/S的架构,所以采用的是selenium的框架来实现.大致实现步骤如下: ...
- 使用burp插件captcha-killer识别图片验证码
0x01 开发背景 说起对存在验证码的登录表单进行爆破,大部分人都会想到PKav HTTP Fuzzer,这款工具在前些年确实给我们带来了不少便利.反观burp一直没有一个高度自定义通杀大部分图片验证 ...
- [Java] 识别图片验证码
现在大多数网站都采用了验证码来防止暴力破解或恶意提交.但验证码真的就很安全吗?真的就不能被机器识别?? 我先讲讲我是怎么实现站外提交留言到一个网站的程序. 这个网站的留言版大致如下: 我一看这种简单的 ...
随机推荐
- Spring Boot系列教程五:使用properties配置文件实现多环境配置
一.前言 实际项目开发过程中会用到多个环境,比如dev,test,product环境,不同的环境可能使用不同参数,为便于部署提高效率,本篇主要通过properties配置文件来实现多环境的配置. 二. ...
- windows 10上利用Microsoft RTF文件(CVE-2017-0199)进行攻击
Microsoft Word下的恶意RTF文件容易被收到攻击,在本文中,我们使用python脚本对Microsoft Word 2013进行oday攻击演示,该脚本会生成恶意的.rtf文件,并提供目标 ...
- spark core (二)
一.Spark-Shell交互式工具 1.Spark-Shell交互式工具 Spark-Shell提供了一种学习API的简单方式, 以及一个能够交互式分析数据的强大工具. 在Scala语言环境下或Py ...
- Linux基础--------监控系统、进程管理、软件包管理-------free、dd、kill、 rpm、yum、源码安装python
作业一:1) 开启Linux系统前添加一块大小为15G的SCSI硬盘 2) 开启系统,右击桌面,打开终端 3) 为新加的硬盘分区,一个主分区大小为5G,剩余空间给扩展分区,在扩展分区上划分1个逻辑分区 ...
- jq从数组中删除指定元素(根据自定义条件) 超好用的 $.grep() 方法
转: jQuery.grep() 什么是jQuery.grep()? jQuery.grep()是一个查找满足过滤函数的数组元素的函数.原始数组不受影响,返回值为数组. 用法介绍: 写法: jQuer ...
- Machine Learning in Action-chapter2-k近邻算法
一.numpy()函数 1.shape[]读取矩阵的长度 例: import numpy as np x = np.array([[1,2],[2,3],[3,4]]) print x.shape / ...
- Listener 介绍
当 web 应用在 web 容器中运行时,web 应用内部会不断地发生各种事件:如 web 应用启动.web 应用停止,用户 session 开始.用户 session 结束.用户请求到达等. 实际上 ...
- 使用 ant 构建的一个例子
在项目根目录下新建一个 build.xml 文件,内容如下: <?xml version="1.0"?> <project name="javatest ...
- Maven仓库--Nexus的配置使用
一.Nexus的作用 指定私服的中央地址.将自己的Maven项目指定到私服地址.从私服下载中央库的项目索引.从私服仓库下载依赖组件.将第三方项目jar上传到私服供其他项目组使用. 二.Nexus仓库 ...
- bzoj 2453: 维护队列
2453: 维护队列 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1079 Solved: 503[Submit][Status][Discuss ...