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翻译软件实现代码(使用google api完成)
Nov 26 Python
Python中的面向对象编程详解(下)
Apr 13 Python
python装饰器初探(推荐)
Jul 21 Python
Python使用到第三方库PyMuPDF图片与pdf相互转换
May 03 Python
python 解决flask uwsgi 获取不到全局变量的问题
Dec 22 Python
Python栈的实现方法示例【列表、单链表】
Feb 22 Python
TensorFLow 数学运算的示例代码
Apr 21 Python
如何使用python的ctypes调用医保中心的dll动态库下载医保中心的账单
May 24 Python
Python API 操作Hadoop hdfs详解
Jun 06 Python
Keras自动下载的数据集/模型存放位置介绍
Jun 19 Python
基于Python实现2种反转链表方法代码实例
Jul 06 Python
Python基于pillow库实现生成图片水印
Sep 14 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 二维数组时间排序实现代码
2016/11/19 PHP
JavaScript中的函数模式详解
2015/02/11 Javascript
几种经典排序算法的JS实现方法
2016/03/25 Javascript
javacript获取当前屏幕大小
2016/06/04 Javascript
全面了解JS中的匿名函数
2016/06/29 Javascript
1秒50万字!js实现关键词匹配
2016/08/01 Javascript
Vue.js实现多条件筛选、搜索、排序及分页的表格功能
2020/11/24 Javascript
推荐VSCode 上特别好用的 Vue 插件之vetur
2017/09/14 Javascript
详解使用webpack打包编写一个vue-toast插件
2017/11/08 Javascript
Bootstrap 模态框多次显示后台提交多次BUG的解决方法
2017/12/26 Javascript
vue获取当前点击的元素并传值的实例
2018/03/09 Javascript
详解在vue-cli项目下简单使用mockjs模拟数据
2018/10/19 Javascript
AJAX在JQuery中的应用详解
2019/01/30 jQuery
vue--vuex详解
2019/04/15 Javascript
Angular短信模板校验代码
2020/09/23 Javascript
vue实现验证用户名是否可用
2021/01/20 Vue.js
关于better-scroll插件的无法滑动bug(2021通过插件解决)
2021/03/01 Javascript
[58:11]守擂赛第二周擂主赛 DeMonsTer vs Leopard
2020/04/28 DOTA
python实现的用于搜索文件并进行内容替换的类实例
2015/06/28 Python
python和pygame实现简单俄罗斯方块游戏
2021/02/19 Python
Python基于多线程操作数据库相关问题分析
2018/07/11 Python
pycharm配置pyqt5-tools开发环境的方法步骤
2019/02/11 Python
Django admin model 汉化显示文字的实现方法
2019/08/12 Python
增大python字体的方法步骤
2020/07/05 Python
python接入支付宝的实例操作
2020/07/20 Python
python上下文管理器异常问题解决方法
2021/02/07 Python
CSS3实现div从下往上滑入滑出效果示例
2020/04/28 HTML / CSS
美国瑜伽服装和装备购物网站:Mukha Yoga
2019/02/22 全球购物
电子商务专业在校生实习自我鉴定
2013/09/29 职场文书
财会自我鉴定范文
2013/12/27 职场文书
个性婚礼策划方案
2014/05/17 职场文书
检察院对照“四风”认真查找问题落实整改措施
2014/09/26 职场文书
2014年教学管理工作总结
2014/12/02 职场文书
2016年师德师风学习心得体会
2016/01/12 职场文书
《鸟的天堂》教学反思
2016/02/19 职场文书
Redis 配置文件重要属性的具体使用
2021/05/20 Redis