Python 2.7

IDE Pycharm 5.0.3

PIL : Pillow-3.3.0-cp27-cp27m-win_amd64.whl PIL第三方库的下载

win下安装whl文件

Pytesser:依赖于PIL ,Tesseract 了解pytesser及基本使用

Tesseract:3.0.2 tesseract下载及安装

Firefox浏览器:47.0.1

我有个理想,就是把TMD教务系统弄崩溃,我港真的!

扯淡

我相信每个脚本都有自己的故事,我这个脚本来源于自己GRD教务系统,每次进行登录时,即使我输入全部正确,第一次登录一定是登不上去的!我不知道设计人员什么想法?难道是为了反爬机制?你以为一次登不上,我tm就不爬了?我要是不高兴了,信不信秒秒钟访问你1000+让大家都上不去咯~咳咳,有点跑题了。

这里写图片描述

目的

自动识别验证码模拟登陆,注意是自动,一键登录,不是那种扫出验证码,然后手动输入登录!

首先来代码实现吧!

# -*- coding: utf-8 -*-

#Author:哈士奇说喵

from selenium import webdriver

import os

import pytesser

import sys,time

from PIL import Image,ImageEnhance

#shift+tab多行缩进(左)

reload(sys)

PostUrl = "http://yjsymis.hrbeu.edu.cn/gsmis/indexAction.do"

driver=webdriver.Firefox()

driver.get(PostUrl)

i=0

while 1:#sb登录系统,即使输对所有消息还是登不进去的,需要登录两次及以上

i=i+1

try:

elem_user = driver.find_element_by_name('id')

elem_psw = driver.find_element_by_name('password')

elem_code = driver.find_element_by_name('checkcode')

except:

break

#-------------------对验证码进行区域截图,好吧,这方法有点low------------------

driver.get_screenshot_as_file('C:\Users\MrLevo\image1.jpg')#比较好理解

im =Image.open('C:\Users\MrLevo\image1.jpg')

box = (516,417,564,437) #设置要裁剪的区域

region = im.crop(box) #此时,region是一个新的图像对象。

#region.show()#显示的话就会被占用,所以要注释掉

region.save("e:/image_code.jpg")

#-------------------------------------------------------------------

#--------------ImageGrab.grab()直接可以区域截图,但是有bug,截图不全-------

'''

bbox = (780, 0, 1020, 800)

img = ImageGrab.grab()

img.save("E:\image_code.jpg")

img.show()

'''

#-------------------------手动输入验证码:适用范围更广,但不够方便------------------------------

'''

response = opener.open(CaptchaUrl)

picture = response.read()

with open('e:/image.jpg', 'wb') as local:

local.write(picture)

# 保存验证码到本地

#------------对于不能用pytesser+ocr进行识别,手动打开图片手动输入--------

# 打开保存的验证码图片 输入

#SecretCode = raw_input('please enter the code: ')

#----------------------------------------------------------------------

'''

#--------------------图片增强+自动识别简单验证码-----------------------------

#time.sleep(3)防止由于网速,可能图片还没保存好,就开始识别

def image_file_to_string(file):

cwd = os.getcwd()

try :

os.chdir("C:\Users\MrLevo\Anaconda2\Lib")

return pytesser.image_file_to_string(file)

finally:

os.chdir(cwd)

im=Image.open("E:\\image_code.jpg")

imgry = im.convert('L')#图像加强,二值化

sharpness =ImageEnhance.Contrast(imgry)#对比度增强

sharp_img = sharpness.enhance(2.0)

sharp_img.save("E:\\image_code.jpg")

#http://www.cnblogs.com/txw1958/archive/2012/02/21/2361330.html

#imgry.show()#这是分布测试时候用的,整个程序使用需要注释掉

#imgry.save("E:\\image_code.jpg")

code= pytesser.image_file_to_string("E:\\image_code.jpg")#code即为识别出的图片数字str类型

print code

#打印code观察是否识别正确

#----------------------------------------------------------------------

if i <= 2: # 根据自己登录特性,我这里是验证码失败一次,重填所有,失败两次,重填验证码

elem_user.send_keys('S315080092')

elem_psw.send_keys('xxxxxxxxxx')

elem_code.send_keys(code)

click_login = driver.find_element_by_xpath("//img[@src='main_images/images/loginbutton.gif']")

click_login.click()

#time.sleep(5)#搜索结果页面停留片刻

#driver.save_screenshot('C:\Users\MrLevo\image.jpg')

#driver.close()

#driver.quit()

第一次放动图,心理还有点小激动~

实现登陆

遇到问题及解决方法

1:验证码取得问题,因为每次刷新之后验证码动态刷新,所以如果不采用cookie的话(我还不太会用cookie),根本捉不到元素,这个我在下篇文章中采用cookie来登录的,但不是调用浏览器,这个跑远了,下次说。

1:解决方案:用了driver.get_screenshot_as_file方法,机智的进行全截图,然后采用PIL中的crop进行再截图操作,可能有人会说,为什么不采用ImageGrab.grab()函数来做,好吧,因为这个函数在win10上尽然!截不了全图!!自己试了才知道,btw,我的分辨率1920x1080,难道和分辨率有关?反正这个我截了好久都没有成功,到最后才想到,截全部看看,结果,tmd只有一半,我说怎么都找不到要截图的部分!

2:验证码验证错误率高问题

2:解决方案,采用PIL强大的图像处理功能,我先将图片二值化,本来是蓝色字体的,,然后再进行对比度强化来锐化图片,然后再调用Tesseract.exe进行处理,提高的识别精度不是一点两点:看图比较,左1是用cookie抓的原图,右边是全景截图,再定位截图,再进行二值化和锐化处理的图,本来我想着用matlab做图像识别的,但是想想还要调用,感觉有点麻烦。。。

对比图

3:调用Tesseract.exe问题

3:解决方案因为程序执行图像识别需要调用Tesseract.exe,所以必须把路径切到有这个exe的路径下,刚开始,以为和包依赖,结果根本没有识别出任何图!折腾一个多小时才写好验证码识别的问题----单独测试的确很重要,记一笔!

这里写图片描述

4:登录失败问题--mdzz学校教务系统二次验证

4:解决方案,写了一个while循环,把主程序很大部分都扔进去了,目的也很明确,如果第一次登录失败,再重复进行登录,注意采用try试探元素是否仍然存在,except来抛出break结束循环,因为登录成功后,比如说driver.find_element_by_name('id')是不存在的!所以当这个元素在登陆后的界面找不到时,那就说明登录成功,ok,跳出循环,进行下一步操作。

5:明明图片已截取,为什么没有识别

5:解决方案,这个我真的没想到,我一直以为可能因为save时候还没下载好,导致库中没有这张图,那就不能识别,但是我用time.sleep函数让它停下来缓缓,还是不行,我就很无语了,想了半天,可能是因为图片被占用!因为我有一个img.show()函数,为了检测有没有截取到标准的图,然后show之后这个图像就被占用了!就像你在编辑word时候,是无法删除word文档一样!果然在注释掉show之后,一切可行,真是差错查了小半天啊!!

这里写图片描述

6:元素一切就位,为什么不执行操作

6:解决方案,这个有点脑残了,不过的确是我遇到的,还是记上一笔,然后骂自己一遍sb,没有click()你让它怎么处理!!!就像用cookie登录时候还有个ENTRY呢!

7:两次验证失败后,用户名重复累加

7:解决方案,直接加了个变量,计数循环次数,观察到只要超过两次没有登录上,就会累加登录名和用户密码,直接写了个if进行判断,完事!

8:im.crop(box)裁剪区域选择困难症

8:解决方案,多试几次,反正我是试出来的。。。。当然,你点击图片进行审查元素时候,可以看到图片大小,那么,你就可以知道横纵坐标差值多少,但是大范围区域还得自己试,如有更好的办法,请告知,以下为我截图实验次数,次数30+

这里写图片描述

9:导入不了Image,ImageEnhance

9:解决方案,因为PIL用的是第三方库,所以,采用的导入方式是这样的,多看看官方文档就可以,官方描述如下

Usefrom PIL import Imageinstead ofimport Image.

10:找不到应该键入的元素

10:这个问题,请单击要输入的空白处右键,审查元素,就可以看到,然后根据driver.find_element_by_各种方法来定位元素,如果输入进行了隐藏,在当前页面找不到怎么办,就像如下图,需要先点击我的图书馆,才能看到输入的账户和密码,那么先找我的图书馆的元素,进行click操作,之后再找元素,一句话,把自己想成浏览器,阿不,把python想成浏览器。。。。。

登陆图书馆

上图的代码我也放上,大同小异,比有验证码的简单,但是多了一个click操作。

# -*- coding: utf-8 -*-

#Author:哈士奇说喵

from selenium import webdriver

import time

import sys

#shift+tab多行缩进(左)

reload(sys)

PostUrl = "http://lib.hrbeu.edu.cn/#"

driver=webdriver.Firefox()

driver.get(PostUrl)

elem_user = driver.find_element_by_name('number')

elem_psw = driver.find_element_by_name('passwd')

#选择我的图书馆,点击后才能看到输入账号密码

click_first = driver.find_element_by_xpath("//ul[@id='imgmenu']/li[4]")

click_first.click()

elem_user.send_keys('S315080092')

elem_psw.send_keys('xxxxxxxx')

#点击登录

click_second = driver.find_element_by_name('submit')

click_second.click()

time.sleep(5)

#登陆后选择

click_third = driver.find_element_by_xpath("//*[@id='mainbox']/div/div/ul/li/a")

click_third.click()

time.sleep(5)#搜索结果页面停留片刻

#driver.save_screenshot('C:\Users\MrLevo\image.jpg')

driver.close()

driver.quit()

最后

(虽然我知道以后肯定会再补充):断断续续差不多两天时间来实现这个操作,虽然对大家来说应该不算难,但是对自己还是有蛮大提升的,对selenium有了基本的概念和操作,对PIL也进行了使用,还有ocr的调用,虽然调用firefox来执行操作表面上看起来很酷炫,但是执行效率和占用内存是很大的内伤,但作为可视化的模拟浏览器登录,这点做的还是十分绚丽的。

话说今天登了图书馆才知道,我tm过期书好几本了,好几天了,,,,看来得写个一键续期和查询过期图书的小工具了,so,又有动力了!

so peace out,guys,and good night!

这里写图片描述

致谢

python selenium 验证码识别_Python+Selenium+PIL+Tesseract真正自动识别验证码进行一键登录...相关推荐

  1. Python+Selenium+PIL+Tesseract真正自动识别验证码进行一键登录

    https://blog.csdn.net/MrLevo520/article/details/51901579?utm_source=blogxgwz6 转载于:https://www.cnblog ...

  2. python用selenium 验证码图片_Python +Selenium解决图片验证码登录或注册问题(推荐)

    1. 解决思路 首先要获得这张验证码的图片,但是该图片一般都是用的js写的,不能够通过url进行下载. 解决方案:截图然后根据该图片的定位和长高,使用工具进行裁剪 裁剪完毕之后,使用工具解析该图片. ...

  3. python滑动验证码处理_python+selenium滑动式验证码解决办法

    from selenium importwebdriverfrom selenium.webdriver.support.ui import WebDriverWait #等待元素加载的 from s ...

  4. python实现验证码识别_python实现图文验证码识别

    一,验证码类别 以下为网站常见的验证码: 1.图片验证码:常见的为英文.数字.汉字,计算题等类型的验证码. 2.行为式验证码: 常见的有滑动拼图,文字点选,图标点选,推理拼图等类型的验证码. 3.手机 ...

  5. python图像验证码识别_python 简单图像识别--验证码

    python  简单图像识别--验证码 记录下,准备工作安装过程很是麻烦. 首先库:pytesseract,image,tesseract,PIL windows安装PIL,直接exe进行安装更方便( ...

  6. python图形验证码识别_Python验证码识别:利用pytesser识别简单图形验证码

    一.探讨 识别图形验证码可以说是做爬虫的必修课,涉及到计算机图形学,机器学习,机器视觉,人工智能等等高深领域-- 简单地说,计算机图形学的主要研究内容就是研究如何在计算机中表示图形.以及利用计算机进行 ...

  7. python提取身份证信息_Python selenium 身份证信息在线解析爬取

    当做笔记: 身份证地区查询,网络上的查询网站也比较多.现在查询数据库中的身份证,识别其中的信息.主要通过该网站:http://www.gpsspg.com/sfz/ 脚本: #-*- coding: ...

  8. python语音验证码识别_python验证码自动识别

    在python爬虫爬取某些网站的验证码的时候可能会遇到验证码识别的问题,现在的验证码大多分为四类: 1.计算验证码 2.滑块验证码 3.识图验证码 4.语音验证码 这篇博客主要写的就是识图验证码,识别 ...

  9. python select模块安装_python+selenium select下拉选择框定位处理方法

    一.前言 总结一下python+selenium select下拉选择框定位处理的两种方式,以备后续使用时查询: 二.直接定位(XPath) 使用Firebug找到需要定位到的元素,直接右键复制XPa ...

  10. python资源百度云_Python Selenium 百度云分享链接资源 批量保存

    [Python] 纯文本查看 复制代码# -*- coding: UTF-8 -*- from docx import Document #安装 pip install python-docx imp ...

最新文章

  1. 吴恩达:数据集的规模和学习机制都很重要!
  2. html的区域大小,JavaScript位置与大小(1)之正确理解和运用与尺寸大小相关的DOM属性...
  3. 还是树形dp 也可以用最短路来写--NOJ679 贪婪的商店
  4. 自学篇之----html的所有input标签 以及post和get提交之间的区别
  5. android 辐射动画_Android 四种动画效果的调用实现代码
  6. [Objective-C]ARC中NSString *与CFStringRef的相互转换
  7. qi接收启动协议_基于QI协议的无线充电通信系统
  8. 构建系统发育树(进化树)的相关知识,以及各种进化树适用的情况。
  9. 浅谈领导力理解和体会
  10. 解决Monterey12系统CleanMyMac X闪退问题
  11. CentOS下删除和安装JDK
  12. 基本概念学习(9013)---通用寄存器、机器字长、数据通路
  13. 个人项目总结(论坛系统)
  14. 使用自定义的Layer和Cell实现手写汉字生成(Tensorflow2)
  15. 100个人检测一个,最少需要多少试管
  16. 数一英一408,超高分数线392分!上海交大计算机学硕
  17. 2021年岳阳市一中高考成绩查询,湖南岳阳的4所最强高中,2020年高考成绩抢眼,岳阳市一中领先...
  18. 关于OpenCV的智能视频监控实现代码
  19. Atom必不可少插件推荐【转】
  20. 使用微软云人工智能,合成带感情的语音

热门文章

  1. 互联网与物联网有什么区别?
  2. 图片降噪Topaz DeNoise AI 安装小技巧
  3. emcy协议_商铺三方租赁协议合同范本
  4. BZOJ 1213 HNOI2004 高精度开根 二分+高(Py)精(thon)度
  5. 获取企业微信code
  6. 数据链路层的主要功能
  7. 八类网线和七类网线的区别_超7类网线与六类的有什么区别吗?
  8. 共享计算机怎么连,电脑如何连接共享文件
  9. 深度学习面试每日一题
  10. (20200328已解决)[dockerfile] debconf: delaying package configuration, since apt-utils is not installed