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中的index()方法使用教程
May 18 Python
基于Python实现的微信好友数据分析
Feb 26 Python
Windows下python3.6.4安装教程
Jul 31 Python
python实现年会抽奖程序
Jan 22 Python
djang常用查询SQL语句的使用代码
Feb 15 Python
python远程邮件控制电脑升级版
May 23 Python
Python参数类型以及常见的坑详解
Jul 08 Python
Python循环中else,break和continue的用法实例详解
Jul 11 Python
python mqtt 客户端的实现代码实例
Sep 25 Python
Python+opencv+pyaudio实现带声音屏幕录制
Dec 23 Python
Pycharm中import torch报错的快速解决方法
Mar 05 Python
Python如何把十进制数转换成ip地址
May 25 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的Yii框架的常用日志操作总结
2015/12/08 PHP
yii2带搜索功能的下拉框实例详解
2016/05/12 PHP
php过滤输入操作之htmlentities与htmlspecialchars用法分析
2017/02/17 PHP
yii2 commands模式以及配置crontab定时任务的方法
2017/08/19 PHP
Nigma vs Alliance BO5 第四场2.14
2021/03/10 DOTA
javascript 嵌套的函数(作用域链)
2010/03/15 Javascript
js获取判断上传文件后缀名的示例代码
2014/02/19 Javascript
JavaScript中的console.log()函数详细介绍
2014/12/29 Javascript
JS实现向表格中动态添加行的方法
2015/03/30 Javascript
Javascript中的数据类型之旅
2015/10/18 Javascript
Knockoutjs 学习系列(二)花式捆绑
2016/06/07 Javascript
Vue数据驱动模拟实现3
2017/01/11 Javascript
利用forever和pm2部署node.js项目过程
2017/05/10 Javascript
如何抽象一个Vue公共组件
2017/10/17 Javascript
mui框架 页面无法滚动的解决方法(推荐)
2018/01/25 Javascript
详解如何用babel转换es6的class语法
2018/04/03 Javascript
深入理解Vue Computed计算属性原理
2018/05/29 Javascript
NodeJS 实现多语言的示例代码
2018/09/11 NodeJs
微信小程序如何获取用户收货地址
2018/11/27 Javascript
vue中使用vue-cli接入融云实现即时通信
2019/04/19 Javascript
新手如何快速理解js异步编程
2019/06/24 Javascript
解决Vue调用springboot接口403跨域问题
2019/09/02 Javascript
如何利用JS将手机号中间四位变成*号
2020/09/29 Javascript
python实现基于两张图片生成圆角图标效果的方法
2015/03/26 Python
解决Python中由于logging模块误用导致的内存泄露
2015/04/23 Python
Python的Django框架中TEMPLATES项的设置教程
2015/05/29 Python
python2.7实现复制大量文件及文件夹资料
2019/08/31 Python
Python图像处理库PIL的ImageFont模块使用介绍
2020/02/26 Python
Python的轻量级ORM框架peewee使用教程
2021/02/05 Python
详解HTML5如何使用可选样式表为网站或应用添加黑暗模式
2020/04/07 HTML / CSS
邓小平理论心得体会
2014/09/09 职场文书
2015年初中生自我评价范文
2015/03/03 职场文书
酒店圣诞节活动总结
2015/05/06 职场文书
2016新春团拜会致辞
2015/08/01 职场文书
Python实现生成bmp图像的方法
2021/06/13 Python
浅谈Web Storage API的使用
2021/06/23 Javascript