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


Posted in Python onDecember 21, 2017

由于工作需要,登录网站需要用到验证码。最初是研究过验证码识别的,但是总是不能获取到我需要的那个验证码。直到这周五,才想起这事来,昨天顺利的解决了。

下面正题:

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 time,os,sys
def cleanImage(imagePath):
  image = Image.open(imagePath)  #打开图片
  image = image.point(lambda x: 0 if x<143 else 255) #处理图片上的每个像素点,使图片上每个点“非黑即白”
  borderImage = ImageOps.expand(image,border=20,fill='white')
  borderImage.save(imagePath)

def getAuthCode(driver, url="http://localhost/"):
  captchaUrl = url + "common/random"
  driver.get(captchaUrl) 
  time.sleep(0.5)
  driver.save_screenshot("captcha.jpg")  #截屏,并保存图片
  #urlretrieve(captchaUrl, "captcha.jpg")
  time.sleep(0.5)
  cleanImage("captcha.jpg")
  p = subprocess.Popen(["tesseract", "captcha.jpg", "captcha"], stdout=\
             subprocess.PIPE,stderr=subprocess.PIPE)
  p.wait()
  f = open("captcha.txt", "r")
  
  #Clean any whitespace characters
  captchaResponse = f.read().replace(" ", "").replace("\n", "")
  print("Captcha solution attempt: " + captchaResponse)
  if len(captchaResponse) == 4:
    return captchaResponse
  else:
    return False

def withoutCookieLogin(url="http://org.cfu666.com/"):
  driver = webdriver.Chrome()
  driver.maximize_window()
  driver.get(url)
  while True:   
    authCode = getAuthCode(driver, url)
    if authCode:
      driver.back()
      driver.find_element_by_xpath("//input[@id='orgCode' and @name='orgCode']").clear()
      driver.find_element_by_xpath("//input[@id='orgCode' and @name='orgCode']").send_keys("orgCode")
      driver.find_element_by_xpath("//input[@id='account' and @name='username']").clear()
      driver.find_element_by_xpath("//input[@id='account' and @name='username']").send_keys("username")
      driver.find_element_by_xpath("//input[@type='password' and @name='password']").clear()
      driver.find_element_by_xpath("//input[@type='password' and @name='password']").send_keys("password")       
      driver.find_element_by_xpath("//input[@type='text' and @name='authCode']").send_keys(authCode)
      driver.find_element_by_xpath("//button[@type='submit']").click()
      try:
        time.sleep(3)
        driver.find_element_by_xpath("//*[@id='side-menu']/li[2]/ul/li/a").click()
        return driver
      except:
        print("authCode Error:", authCode)
        driver.refresh()
  return driver
driver = withoutCookieLogin("http://localhost/")
driver.get("http://localhost/enterprise/add/")

怎么获取我们需要的验证码

在这获取验证码的道路上,我掉了太多的坑,看过太多的文章,很多都是教你验证码的识别方法,但是没有说明,怎么获取你当前需要的验证码图片。

我的处理方法是:

1.先用selenium打开你需要的登录的页面地址url1

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

2.通过审核元素获取验证码的地址url2(其实最简单的是右键打开新页面)

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

3:在url1页面,输入地址url2进入url2页面,然后截屏保存验证码页面

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

4:处理验证码得到验证码字符串。然后点击浏览器后退按钮,返回url1登录页面

5:输入登录需要的信息和验证码

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

6:点击登录

7:验证登录后的页面,判断是否成功,若不成功则需要重新1-7的操作。

为了保护公司的信息,这个页面是我本地搭的服务,我在伯乐在线注册页面进行测试过这个验证码获得方法,可以通过。(这个验证码的处理方法,仅限验证码背景是像素点,若验证码有横线需额外处理。)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
学习python (1)
Oct 31 Python
Python的ORM框架中SQLAlchemy库的查询操作的教程
Apr 25 Python
快速了解python leveldb
Jan 18 Python
NLTK 3.2.4 环境搭建教程
Sep 19 Python
python 获得任意路径下的文件及其根目录的方法
Feb 16 Python
Django数据库类库MySQLdb使用详解
Apr 28 Python
python获取点击的坐标画图形的方法
Jul 09 Python
Django项目中实现使用qq第三方登录功能
Aug 13 Python
关于python导入模块import与常见的模块详解
Aug 28 Python
基于python的itchat库实现微信聊天机器人(推荐)
Oct 29 Python
python argparse模块通过后台传递参数实例
Apr 20 Python
Python实现常见的几种加密算法(MD5,SHA-1,HMAC,DES/AES,RSA和ECC)
May 09 Python
python实现随机森林random forest的原理及方法
Dec 21 #Python
python编写分类决策树的代码
Dec 21 #Python
Python基于PyGraphics包实现图片截取功能的方法
Dec 21 #Python
用Python写王者荣耀刷金币脚本
Dec 21 #Python
python使用Apriori算法进行关联性解析
Dec 21 #Python
python实现kMeans算法
Dec 21 #Python
利用Tkinter(python3.6)实现一个简单计算器
Dec 21 #Python
You might like
解决php中Cannot send session cache limiter 的问题的方法
2007/04/27 PHP
在PHP中使用模板的方法
2008/05/24 PHP
php数组冒泡排序算法实例
2016/05/06 PHP
php实现数字补零的方法总结
2018/09/12 PHP
javascript动态加载三
2012/08/22 Javascript
javascript中基本类型和引用类型的区别分析
2015/05/12 Javascript
Jquery和angularjs获取check框选中的值的方法汇总
2016/01/17 Javascript
Web开发必知Javascript技巧大全
2016/02/23 Javascript
jQuery中的Deferred和promise 的区别
2016/04/03 Javascript
express文件上传中间件Multer详解
2016/10/24 Javascript
浅析javascript中的Event事件
2016/12/09 Javascript
在vue.js中抽出公共代码的方法示例
2017/06/08 Javascript
详解webpack的配置文件entry与output
2017/08/21 Javascript
ztree实现左边动态生成树右边为内容详情功能
2017/11/03 Javascript
如何用input标签和jquery实现多图片的上传和回显功能
2018/05/16 jQuery
vue2.0获取鼠标位置的方法
2018/09/13 Javascript
javascript数据类型中的一些小知识点(推荐)
2019/04/18 Javascript
javascript获取元素的计算样式
2019/05/24 Javascript
Vue.js组件实现选项卡以及切换特效
2019/07/24 Javascript
vue使用高德地图点击下钻上浮效果的实现思路
2019/10/12 Javascript
Vue父组件监听子组件生命周期
2020/09/03 Javascript
Openlayers+EasyUI Tree动态实现图层控制
2020/09/28 Javascript
关于IDEA中的.VUE文件报错 Export declarations are not supported by current JavaScript version
2020/10/17 Javascript
[01:19:54]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#1Alliance VS EHOME
2016/03/03 DOTA
python中去空格函数的用法
2014/08/21 Python
浅析Python中else语句块的使用技巧
2016/06/16 Python
老生常谈Python基础之字符编码
2017/06/14 Python
Python3 导入上级目录中的模块实例
2019/02/16 Python
python使用Qt界面以及逻辑实现方法
2019/07/10 Python
Flask框架实现的前端RSA加密与后端Python解密功能详解
2019/08/13 Python
Python常用扩展插件使用教程解析
2020/11/02 Python
Html5画布_动力节点Java学院整理
2017/07/13 HTML / CSS
医学毕业生自我鉴定
2013/10/30 职场文书
羽毛球社团活动总结
2014/06/27 职场文书
2016年学校安全教育月活动总结
2016/04/06 职场文书
css3 filter属性的使用简介
2021/03/31 HTML / CSS