转载自:博客

对于某些网站登录的时候,往往需要输入验证码才能实现登录。如果要爬虫这类网站,往往总会比这个验证码导致无法爬取数据。以下介绍一种比较折中的方法,也是比较可行的方法: 
实现思想: 
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识别图片验证码的更多相关文章

  1. python+selenium识别图片验证码

    import timeimport pytesseractfrom PIL import Image, ImageEnhancefrom selenium import webdriver url = ...

  2. python 识别图片验证码报IOError

    说一下困扰了我一周的问题:识别图片验证码 本来我按照安装步骤(http://www.cnblogs.com/yeayee/p/4955506.html?utm_source=tuicool&u ...

  3. Python 实现简单图片验证码登录

    朋友说公司要在测试环境做接口测试,登录时需要传入正确的图片的验证码,本着懒省事的原则,推荐他把测试环境的图片验证码写死,我们公司也是这么做的^_^.劝说无果/(ㄒoㄒ)/~~,只能通过 OCR 技术来 ...

  4. Python - WebDriver 识别登录验证码

    Python - WebDriver 识别登录验证码 没什么可说的直接上代码! #-*-coding:utf-8-*- # Time:2017/9/29 7:16 # Author:YangYangJ ...

  5. 【java+selenium3】Tesseract-OCR识别图片验证码 (十六)

    [java+selenium+Tesseract-OCR(图片识别)+AutoIt(windows窗口识别)]完成自动化图片验证码识别! 一.AutoIt(windows窗口识别)参考:https:/ ...

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

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

  7. 【python】带图片验证码的登录自动化实战

    近期在跟进新项目的时候,整体的业务线非常之长,会一直重复登录退出不同账号的这个流程,所以想从登录开始实现部分的自动化.因为是B/S的架构,所以采用的是selenium的框架来实现.大致实现步骤如下: ...

  8. 使用burp插件captcha-killer识别图片验证码

    0x01 开发背景 说起对存在验证码的登录表单进行爆破,大部分人都会想到PKav HTTP Fuzzer,这款工具在前些年确实给我们带来了不少便利.反观burp一直没有一个高度自定义通杀大部分图片验证 ...

  9. [Java] 识别图片验证码

    现在大多数网站都采用了验证码来防止暴力破解或恶意提交.但验证码真的就很安全吗?真的就不能被机器识别?? 我先讲讲我是怎么实现站外提交留言到一个网站的程序. 这个网站的留言版大致如下: 我一看这种简单的 ...

随机推荐

  1. NOI2013 矩阵游戏 【数论】

    题目描述 婷婷是个喜欢矩阵的小朋友,有一天她想用电脑生成一个巨大的n行m列的矩阵(你不用担心她如何存储).她生成的这个矩阵满足一个神奇的性质:若用F[i][j]来表示矩阵中第i行第j列的元素,则F[i ...

  2. Java考试题之三

    QUESTION 46Given:11. public class Test {12. public static void main(String [] args) {13. int x = 5;1 ...

  3. python基础----实现上下文管理协议__enter__和__exit__

    我们知道在操作文件对象的时候可以这么写 with open('a.txt') as f: '代码块' 上述叫做上下文管理协议,即with语句,为了让一个对象兼容with语句,必须在这个对象的类中声明_ ...

  4. Linux之Makefile20160707

    说一下LINUX下的Makefile,直接根据实际碰到的Makefile进行解读: 当make的目标为all时,-C $(KDIR) 指明跳转到内核源码目录下读取那里的Makefile:M=$(PWD ...

  5. codeforces 691F 暴力

    传送门:https://codeforces.com/contest/691/problem/F 题意:给你n个数和q次询问,每次询问问你有多少对ai,aj满足ai*aj>=q[i],注意 a* ...

  6. [DeeplearningAI笔记]序列模型3.3集束搜索

    5.3序列模型与注意力机制 觉得有用的话,欢迎一起讨论相互学习~Follow Me 3.3 集束搜索Beam Search 对于机器翻译来说,给定输入的句子,会返回一个随机的英语翻译结果,但是你想要一 ...

  7. 【Java】将字符串转化为整数

    前几天面试遇到这个问题:在Java中如何将字符串转化为整数,当时too young too naive,随便回答了一下.今天跑去看Java源码中paresInt函数的写法,Oh my god!其实不看 ...

  8. codeforces 876 C. Classroom Watch

    http://codeforces.com/contest/876/problem/C C. Classroom Watch time limit per test 1 second memory l ...

  9. Flex布局之box-flex

    box-flex的写法比flex的写法要复杂一些,兼容性的前缀要多带几个,真希望有一天flex布局能够纳入w3c标准啊! <!DOCTYPE html> <html> < ...

  10. SpringCloud入门系列(一)

    https://www.cnblogs.com/edisonchou/p/java_spring_cloud_foundation_sample_list.html