Python +Selenium解决图片验证码登录或注册问题(推荐)


Posted in Python onFebruary 09, 2020

1. 解决思路

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

2. 代码实现

2.1 裁剪出验证码图片

裁剪图片需要使用 Pillow 库,进入pip包路径后输入安装命令pip install Pillow:
之前安装的时候忘记了截图,只能够截一张安装后的图片了 ?(:з?∠)_

安装完成后,代码实现方式如下:

#coding=utf-8
from selenium import webdriver
import time
from PIL import Image
from selenium.webdriver.support.wait import WebDriverWait
driver = webdriver.Chrome()
# 进入该网站
driver.get("http://www2.nmec.org.cn/wangbao/nme/sp/root/account/signup.html")
# 能否在5s内找到验证码元素,能才继续
if WebDriverWait(driver,5).until(lambda the_driver:the_driver.find_element_by_id("CaptchaImg"), "查找不到该元素"):
 # 对于一次截屏无法到截到验证码的情况,需要滚动一段距离,然后验证码的y坐标也应该减去这段距离
 scroll = 500
 js = "document.documentElement.scrollTop='%s'" %scroll
 driver.execute_script(js)
 # 截下该网站的图片
 driver.get_screenshot_as_file("E:/Python_selenium_advance/Picture/full.png")
 # 获得这个图片元素
 img_ele = driver.find_element_by_id("CaptchaImg")
 # 得到该元素左上角的 x,y 坐标和右下角的 x,y 坐标
 left = img_ele.location.get('x')
 upper = img_ele.location.get('y') - 500
 right = left + img_ele.size.get('width')
 lower = upper + img_ele.size.get('height')
 # 打开之前的截图
 img = Image.open("E:/Python_selenium_advance/Picture/full.png")
 # 对截图进行裁剪,裁剪的范围为之前验证的左上角至右下角范围
 new_img = img.crop((left, upper, right, lower))
 # 裁剪完成之后保存到指定路径
 new_img.save("E:/Python_selenium_advance/Picture/croped.png")
 
 time.sleep(2)
 driver.quit()
else:
 print("找不到验证码元素")

2.2 使用 图鉴 商用接口来识别验证码

接口介绍网址:http://www.ttshitu.com/docs/python.html#pageTitle

调用该接口直接使用网页上的接口文档就行,代码如下:

import json
import requests
import base64
from io import BytesIO
from PIL import Image
from sys import version_info

def base64_api(uname, pwd, softid, img):
 img = img.convert('RGB')
 buffered = BytesIO()
 img.save(buffered, format="JPEG")
 if version_info.major >= 3:
  b64 = str(base64.b64encode(buffered.getvalue()), encoding='utf-8')
 else:
  b64 = str(base64.b64encode(buffered.getvalue()))
 data = {"username": uname, "password": pwd, "softid": softid, "image": b64}
 result = json.loads(requests.post("http://api.ttshitu.com/base64", json=data).text)
 if result['success']:
  return result["data"]["result"]
 else:
  return result["message"]
 return ""

将其保存为一个单独的 analysis_captcha.py ,然后再导入该方法,直接使用即可:

from analysis_captcha import base64_api

def analysis_captcha(filename):
 '''
 使用 图鉴 商用接口来识别指定位置的验证码图片
 :param filename: 验证码图片位置
 :return : 验证码文本
 '''
 img_path = filename
 img = Image.open(img_path)
 result = base64_api(uname='kaibin', pwd='******', softid='4545454', img=img)
 return result

验证码识别可能会出错,到时候再点击验证码图片换一张,然后重来即可。

总结

以上所述是小编给大家介绍的Python +Selenium实现图片验证码登录或注册问题,希望对大家有所帮助!

Python 相关文章推荐
Python3.5编程实现修改IIS WEB.CONFIG的方法示例
Aug 18 Python
TensorFlow 实战之实现卷积神经网络的实例讲解
Feb 26 Python
Python用csv写入文件_消除空余行的方法
Jul 06 Python
Django 路由控制的实现代码
Nov 08 Python
Python之循环结构
Jan 15 Python
python基于递归解决背包问题详解
Jul 03 Python
Flask之pipenv虚拟环境的实现
Nov 26 Python
Matplotlib使用Cursor实现UI定位的示例代码
Mar 12 Python
sklearn和keras的数据切分与交叉验证的实例详解
Jun 19 Python
Python爬虫逆向分析某云音乐加密参数的实例分析
Dec 04 Python
python中_del_还原数据的方法
Dec 09 Python
python3.9实现pyinstaller打包python文件成exe
Dec 13 Python
python+selenium定时爬取丁香园的新型冠状病毒数据并制作出类似的地图(部署到云服务器)
Feb 09 #Python
python 爬取疫情数据的源码
Feb 09 #Python
python代码如何实现余弦相似性计算
Feb 09 #Python
python字符串替换re.sub()实例解析
Feb 09 #Python
Python随机数函数代码实例解析
Feb 09 #Python
Python如何访问字符串中的值
Feb 09 #Python
python3 字符串知识点学习笔记
Feb 08 #Python
You might like
PHP聊天室技术
2006/10/09 PHP
php下关于中英数字混排的字符串分割问题
2010/04/06 PHP
zf框架的db类select查询器join链表使用示例(zend框架)
2014/03/14 PHP
微信公众平台开发实现2048游戏的方法
2015/04/15 PHP
CodeIgniter 完美解决URL含有中文字符串
2016/05/13 PHP
PHP 年月日的三级联动实例代码
2017/05/24 PHP
浅谈PHP array_search 和 in_array 函数效率问题
2019/10/15 PHP
jQuery JSON的解析方式分享
2011/04/05 Javascript
Jquery实现简单的动画效果代码
2012/03/18 Javascript
根据经纬度计算地球上两点之间的距离js实现代码
2013/03/05 Javascript
JQuery处理json与ajax返回JSON实例代码
2014/01/03 Javascript
JS给Textarea文本框添加行号的方法
2015/08/20 Javascript
JS实现漂亮的淡蓝色滑动门效果代码
2015/09/23 Javascript
Javascript中获取浏览器类型和操作系统版本等客户端信息常用代码
2016/06/28 Javascript
html5+CSS 实现禁止IOS长按复制粘贴功能
2016/12/28 Javascript
Bootstrap面板学习使用
2017/02/09 Javascript
Vue 自定义标签的src属性不能使用相对路径的解决
2019/09/17 Javascript
Vant 中的Toast设置全局的延迟时间操作
2020/11/04 Javascript
对Python的Django框架中的项目进行单元测试的方法
2016/04/11 Python
Python中实现单例模式的n种方式和原理
2018/11/14 Python
Python虚拟环境的原理及使用详解
2019/07/02 Python
Python参数类型以及常见的坑详解
2019/07/08 Python
Django项目之Elasticsearch搜索引擎的实例
2019/08/21 Python
Python高级特性——详解多维数组切片(Slice)
2019/11/26 Python
Pandas数据分析的一些常用小技巧
2021/02/07 Python
简述数据库的设计过程
2015/06/22 面试题
城市轨道专业个人求职信范文
2013/09/23 职场文书
高级人员简历的自我评价分享
2013/11/03 职场文书
财务会计毕业生个人求职信
2014/02/03 职场文书
函授毕业个人自我评价
2014/02/20 职场文书
合伙购房协议样本
2014/10/06 职场文书
从严治党主题教育活动总结
2015/05/07 职场文书
萤火虫之墓观后感
2015/06/05 职场文书
Python中三种花式打印的示例详解
2022/03/19 Python
MySQL数据库如何使用Shell进行连接
2022/04/12 MySQL
Tomcat starup.bat 脚本实现开机自启动
2022/04/20 Servers