Python完全识别验证码自动登录实例详解

1、直接贴代码

#!C:/Python27
#coding=utf-8

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from pytesser import *
from PIL import Image,ImageEnhance,ImageFilter
from selenium.common.exceptions import NoSuchElementException,TimeoutException
import os,time

def before():

  driver.get(src)

  time.sleep(1)

  driver.maximize_window() # 浏览器全屏显示

  print ('\n浏览器全屏显示 ...')

def Convertimg():

  imglocation = ("//*[@id='loginForm']/div[4]/div[2]/img[1]")

  #下载验证码图片保存到本地
  driver.save_screenshot('E:\\pythonScript\\Codeimages\\code.png')

  #打开本地图片
  im = Image.open('E:\\pythonScript\\Codeimages\\code.png')

  left = driver.find_element_by_xpath(imglocation).location['x']
  top = driver.find_element_by_xpath(imglocation).location['y']
  right = driver.find_element_by_xpath(imglocation).location['x'] + driver.find_element_by_xpath(imglocation).size['width']
  bottom = driver.find_element_by_xpath(imglocation).location['y'] + driver.find_element_by_xpath(imglocation).size['height']

  im = im.crop((left, top, right, bottom))

  im.save('E:\\pythonScript\\Codeimages\\screenshot.png')

  print u"\n保存验证码图片完成"

  #移除截屏的图片

  os.remove('E:\\pythonScript\\Codeimages\\code.png')

  print u"\n删除截屏图片完成"

  #处理验证码图片
  src = ('E:\\pythonScript\\Codeimages\\screenshot.png')

  #调用裁剪图片方法
  Cutedge(src)

  #移除截屏的图片
  os.remove('E:\\pythonScript\\Codeimages\\screenshot.png')
  #灰化图片处理
  im = Image.open('E:\\pythonScript\\Codeimages\\CutedgeImage.png')

  imgry = im.convert('L')
  #二值化处理

  threshold = 100
  table = []
  for i in range(256):
    if i < threshold:
      table.append(0)
    else:
      table.append(1)
  out = imgry.point(table, '1')

  out.save('E:\\pythonScript\\Codeimages\\rgb.png')

  #vcode = pytesseract.image_to_string(out)

  #print (vcode)

  txtcode = image_to_string(out)

  print u"\n识别出验证码文字为:",image_to_string(out)

  print len(txtcode.strip())

  print

  if len(txtcode.strip()) == 4:

      print u"长度相等"

  else:
      print u"长度不相等,退出"

      driver.quit()

  #输入用户名和密码
  driver.find_element_by_id("username").send_keys("123456")

  driver.find_element_by_id("password").send_keys("123456")

  time.sleep(2)

  #对文本框输入验证码值
  driver.find_element_by_id("verifyCode").send_keys(txtcode.strip())

  time.sleep(3)
  #点击登录
  driver.find_element_by_xpath("//*[@id='loginForm']/div[5]/div/img").click()
  #driver.find_element_by_class_name('loginbtn').click()
  time.sleep(7)

#针对有黑色边框的验证码图片的裁剪边缘
def Cutedge(src):

  #设置要裁剪的区域
  im = Image.open(src)

  w, h = im.size

  print u"\n验证码原图宽、高尺寸为:",w,h

  box = (2,2,110,30)

  im.crop(box).save('E:\\pythonScript\\Codeimages\\CutedgeImage.png')

  print u"\n保存裁剪的图片 CutedgeImage.png"

#
src = ("https://www.test.com")

driver = webdriver.Chrome() #Firefox()#

def method_2(src):

  before()

  #调用图片裁剪方法
  Convertimg()

def clickInput():

  driver.find_element_by_id("inputButton").click()

  print "\nInput Click Finish"

def clickOutput():

  print u"\n开始执行点击事件"

  #开始执行点击事件      inputButton
  driver.find_element_by_id("outputButton").click()

  time.sleep(2)

  print (u'\n开始执行任务,执行间隔时间为10分钟 ...')

  for i in range(1,4):

    ISOTIMEFORMAT="%Y-%m-%d %X"

    strTime = time.strftime( ISOTIMEFORMAT, time.localtime())

    driver.refresh()

    print u"\n正在执行第 ",i,"次...",strTime

    time.sleep(5)

    driver.find_element_by_id("outputButton").click()

    time.sleep(30)

    print
    #刷新浏览器
    print u"\n刷新当前页面 ..."

    driver.refresh()

    print (u'\n等待间隔时间为9分钟 ...')

    time.sleep(505)

    print u"\n已执行完第 ",i,u"次,",u"已等待",i*10,u"分钟"

  print (u'\n已执行完成...At The End OF,'+strTime)

  driver.quit()

def isPass():
  try:
    #driver.find_element_by_id("username").is_displayed() == True

    driver.find_element_by_id('status').text == (u"验证码不正确!")

    print (u"\n****校验提示信息_验证码输入不正确****")

    driver.quit()

    print (u"\n关闭浏览器,执行外层循环...")

  except Exception:
    print (u"\n****校验提示信息_验证码输入正确****")

    clickOutput() #------  click Output

method_2(src) #进入工作页面

isPass()

#clickInput() #------  click Input

#clickOutput() #------  click Output

for i in range(1,6):

  driver = webdriver.Chrome()

  src = ("https://www.test.com")

  method_2(src)

  isPass()

  #clickOutput()

2、控制台日志

浏览器全屏显示 ...

获取到元素的文本值为: 

保存验证码图片完成

删除截屏图片完成

验证码原图宽、高尺寸为: 113 34

保存裁剪的图片 CutedgeImage.png

识别出验证码文字为: gnbn

开始执行任务,执行间隔时间为10分钟 ...

正在执行第 1 次... 2017-05-25 18:10:24

刷新当前页面 ...

等待间隔时间为9分钟 ...

以上这篇Python完全识别验证码自动登录实例详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Python+Selenium+PIL+Tesseract自动识别验证码进行一键登录

    本文介绍了Python+Selenium+PIL+Tesseract自动识别验证码进行一键登录,分享给大家,具体如下: Python 2.7 IDE Pycharm 5.0.3 Firefox浏览器:47.0.1 Selenium PIL Pytesser Tesseract 扯淡 ​ 我相信每个脚本都有自己的故事,我这个脚本来源于自己GRD教务系统,每次进行登录时,即使我输入全部正确,第一次登录一定是登不上去的!我不知道设计人员什么想法?难道是为了反爬机制?你以为一次登不上,我tm就不爬了?我

  • python+selenium识别验证码并登录的示例代码

    由于工作需要,登录网站需要用到验证码.最初是研究过验证码识别的,但是总是不能获取到我需要的那个验证码.直到这周五,才想起这事来,昨天顺利的解决了. 下面正题: python版本:3.4.3 所需要的代码库:PIL,selenium,tesseract 先上代码: #coding:utf-8 import subprocess from PIL import Image from PIL import ImageOps from selenium import webdriver import t

  • python爬虫之自动登录与验证码识别

    在用爬虫爬取网站数据时,有些站点的一些关键数据的获取需要使用账号登录,这里可以使用requests发送登录请求,并用Session对象来自动处理相关Cookie. 另外在登录时,有些网站有时会要求输入验证码,比较简单的验证码可以直接用pytesser来识别,复杂的验证码可以依据相应的特征自己采集数据训练分类器. 以CSDN网站的登录为例,这里用Python的requests库与pytesser库写了一个登录函数.如果需要输入验证码,函数会首先下载验证码到本地,然后用pytesser识别验证码后登

  • Python完全识别验证码自动登录实例详解

    1.直接贴代码 #!C:/Python27 #coding=utf-8 from selenium import webdriver from selenium.webdriver.common.keys import Keys from pytesser import * from PIL import Image,ImageEnhance,ImageFilter from selenium.common.exceptions import NoSuchElementException,Tim

  • python PyVCF文件处理VCF文件格式实例详解

    目录 引言 PyVCF库的安装 PyVCF库的导入 PyVCF库详细介绍 使用实例: _Record对象------位点信息的储存形式 Reader对象------处理vcf文件,构建结构化信息 综合使用: 引言 vcf文件的全称是variant call file,即突变识别文件,它是基因组工作流程中产生的一种文件,保存的是基因组上的突变信息.通过对vcf文件进行分析,可以得到个体的变异信息.嗯,总之,这是很重要的文件,所以怎么处理它也显得十分重要.它的文件信息如下: 文件的开头是一堆以“##

  • Python使用struct处理二进制的实例详解

    Python使用struct处理二进制的实例详解 有的时候需要用python处理二进制数据,比如,存取文件,socket操作时.这时候,可以使用python的struct模块来完成.可以用 struct来处理c语言中的结构体. struct模块中最重要的三个函数是pack(), unpack(), calcsize() pack(fmt, v1, v2, ...)     按照给定的格式(fmt),把数据封装成字符串(实际上是类似于c结构体的字节流) unpack(fmt, string)   

  • 对Python多线程读写文件加锁的实例详解

    Python的多线程在io方面比单线程还是有优势,但是在多线程开发时,少不了对文件的读写操作.在管理多个线程对同一文件的读写操作时,就少不了文件锁了. 使用fcntl 在linux下,python的标准库有现成的文件锁,来自于fcntl模块.这个模块提供了unix系统fcntl()和ioctl()的接口. 对于文件锁的操作,主要需要使用 fcntl.flock(fd, operation)这个函数. 其中,参数 fd 表示文件描述符:参数 operation 指定要进行的锁操作,该参数的取值有如

  • python open函数中newline参数实例详解

    目录 问题的由来 具体实例 总结 问题的由来 我在读pythoncsv模块文档 看到了这样一句话 如果 csvfile 是文件对象,则打开它时应使用 newline=‘’.其备注:如果没有指定 newline=‘’,则嵌入引号中的换行符将无法正确解析,并且在写入时,使用 \r\n 换行的平台会有多余的 \r 写入.由于 csv 模块会执行自己的(通用)换行符处理,因此指定 newline=‘’ 应该总是安全的. 我就在思考open函数中的newline参数的作用,因为自己之前在使用open函数时

  • python之sqlalchemy创建表的实例详解

    python之sqlalchemy创建表的实例详解 通过sqlalchemy创建表需要三要素:引擎,基类,元素 from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column,Integer,String 引擎:也就是实体数据库连接 engine = create_engine('mysql+pymysql://go

  • python获取指定时间差的时间实例详解

    python获取指定时间差的时间实例详解 在分析数据的时间经常需要截取一定范围时间的数据,比如三天之内,两小时前等等时间要求的数据,因此将该部分经常需要用到的功能模块化,方便以后以后用到的时候复用.在此,也分享给大家. import time import sys reload(sys) def get_day_of_day(UTC=False, days=0, hours=0, miutes=0, seconds=0): ''''''' if days>=0,date is larger th

  • Hibernate识别数据库特有字段实例详解

    Hibernate识别数据库特有字段实例详解 前言: Hibernate已经为绝大多数常用的数据库数据类型提供了内置支持,但对于某些数据库的专属字段支持就不够好了. 这些特殊数据类型往往提供了比常规数据类型更好的数据表达能力,更符合我们的业务场景.比如PostgreSQL的Interval类型,可以非常方便的保存一个时间段的数据. 本文以添加Interval类型支持为例,说明为Hibernate添加特有数据类型支持的方法. Hibernate提供了丰富的数据类型支持,但对于部分数据库专有的数据类

  • python 中split 和 strip的实例详解

     python 中split 和 strip的实例详解 一直以来都分不清楚strip和split的功能,实际上strip是删除的意思:而split则是分割的意思. python中strip() 函数和 split() 函数的理解,有需要的朋友可以参考下. splite 和strip 都是Python 对字符串的处理. splite 意为分割,划分. a='123456' a.split('3') 输出为 ['12', '456'] 可以看到,使用何种字符切割,该字符也被略去.例如这里的字符"3&

  • MySql超长自动截断实例详解

    MySql超长自动截断实例详解 小伙伴问到一个问题,为啥在项目中调用插入或者更新语句时超长的字无法自动截断,而在navicat中直接执行是可以自动截断的? 如下 CREATE TABLE `p_app_station` ( `WX_APP_ID` varchar(20) NOT NULL, `APP_SECRET` varchar(33) DEFAULT NULL, `IS_BINDING` int(1) DEFAULT '0', `ACCOUNT_ID` int(13) DEFAULT NUL

随机推荐