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 相关文章推荐
使用Python标准库中的wave模块绘制乐谱的简单教程
Mar 30 Python
Python每天必学之bytes字节
Jan 28 Python
python并发编程之多进程、多线程、异步和协程详解
Oct 28 Python
树莓派使用USB摄像头和motion实现监控
Jun 22 Python
python异常触发及自定义异常类解析
Aug 06 Python
python 定时器每天就执行一次的实现代码
Aug 14 Python
Python TCP通信客户端服务端代码实例
Nov 21 Python
python pygame实现挡板弹球游戏
Nov 25 Python
详解Python 重学requests发起请求的基本方式
Feb 07 Python
Python获取android设备cpu和内存占用情况
Nov 15 Python
python opencv检测直线 cv2.HoughLinesP的实现
Jun 18 Python
Python可视化神器pyecharts绘制水球图
Jul 07 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
无刷新动态加载数据 滚动条加载适合评论等页面
2013/10/16 PHP
使用phpQuery采集网页的方法
2013/11/13 PHP
php实现httpRequest的方法
2015/03/13 PHP
yii去掉必填项中星号的方法
2015/12/28 PHP
详解thinkphp中的volist标签
2018/01/15 PHP
通过jquery的$.getJSON做一个跨域ajax请求试验
2011/05/03 Javascript
JS控制阿拉伯数字转为中文大写示例代码
2013/09/04 Javascript
通过AJAX的JS、JQuery两种方式解析XML示例介绍
2013/09/23 Javascript
jquery中EasyUI使用技巧小结
2015/02/10 Javascript
js中substr,substring,indexOf,lastIndexOf,split,replace的用法详解
2015/11/09 Javascript
超精准的javascript验证身份证号的具体实现方法
2015/11/18 Javascript
BootStrap的Datepicker控件使用心得分享
2016/05/25 Javascript
IE8兼容Jquery.validate.js的问题
2016/12/01 Javascript
Vue.js实现一个SPA登录页面的过程【推荐】
2017/04/29 Javascript
基于vue+ bootstrap实现图片上传图片展示功能
2017/05/17 Javascript
基于jQuery实现的Ajax 验证用户名唯一性实例代码
2017/06/28 jQuery
微信小程序实现圆形进度条动画
2020/11/18 Javascript
JavaScript Reflect Metadata实现详解
2019/12/12 Javascript
vue页面更新patch的实现示例
2020/03/25 Javascript
用云开发Cloudbase实现小程序多图片内容安全监测的代码详解
2020/06/07 Javascript
详细分析Node.js 模块系统
2020/06/28 Javascript
SpringBoot+Vue开发之Login校验规则、实现登录和重置事件
2020/10/19 Javascript
React服务端渲染原理解析与实践
2021/03/04 Javascript
[03:17]2016完美“圣”典风云人物:冷冷专访
2016/12/08 DOTA
Python实现竖排打印传单手机号码易撕条
2015/03/16 Python
python实现文本文件合并
2015/12/29 Python
分享给Python新手们的几道简单练习题
2017/09/21 Python
python类的方法属性与方法属性的动态绑定代码详解
2017/12/27 Python
Scrapy框架实现的登录网站操作示例
2020/02/06 Python
python设置代理和添加镜像源的方法
2020/02/14 Python
Html5自定义字体解决方法
2019/10/09 HTML / CSS
美国最大的团购网站:Groupon
2016/07/23 全球购物
会计主管岗位职责范文
2013/11/08 职场文书
经贸日语专业个人求职信
2013/12/13 职场文书
python获取淘宝服务器时间的代码示例
2021/04/22 Python
mysql 如何获取两个集合的交集/差集/并集
2021/06/08 MySQL