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中使用partial改变方法默认参数实例
Apr 28 Python
python使用WMI检测windows系统信息、硬盘信息、网卡信息的方法
May 15 Python
Python 搭建Web站点之Web服务器网关接口
Nov 06 Python
Python OpenCV获取视频的方法
Feb 28 Python
Python3.6基于正则实现的计算器示例【无优化简单注释版】
Jun 14 Python
python代码过长的换行方法
Jul 19 Python
python脚本开机自启的实现方法
Jun 28 Python
python使用opencv对图像mask处理的方法
Jul 05 Python
浅析python表达式4+0.5值的数据类型
Feb 26 Python
详解tensorflow之过拟合问题实战
Nov 01 Python
Python3中FuzzyWuzzy库实例用法
Nov 18 Python
python3实现常见的排序算法(示例代码)
Jul 04 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读取xml实例代码
2010/01/28 PHP
ThinkPHP路由详解
2015/07/27 PHP
PHP5.3连接Oracle客户端及PDO_OCI模块的安装方法
2016/05/13 PHP
PHP简单实现正则匹配省市区的方法
2018/04/13 PHP
PHP实现的ID混淆算法类与用法示例
2018/08/10 PHP
Ext JS Grid在IE6 下宽度的问题解决方法
2009/02/15 Javascript
extjs 学习笔记(一) 一些基础知识
2009/10/13 Javascript
js变量以及其作用域详解
2020/07/18 Javascript
JS常用表单验证方法总结
2014/05/22 Javascript
JavaScript实现穷举排列(permutation)算法谜题解答
2014/12/29 Javascript
JavaScript基本语法讲解
2015/06/03 Javascript
轻松实现Bootstrap图片轮播
2020/04/20 Javascript
Webwork 实现文件上传下载代码详解
2016/02/02 Javascript
jQuery选择器之子元素选择器详解
2017/09/18 jQuery
vue使用keep-alive实现数据缓存不刷新
2017/10/21 Javascript
webpack vue 项目打包生成的文件,资源文件报404问题的修复方法(总结篇)
2018/01/09 Javascript
完美解决iview 的select下拉框选项错位的问题
2018/03/02 Javascript
详解angularjs跨页面传参遇到的一些问题
2018/11/01 Javascript
微信小程序MUI导航栏透明渐变功能示例(通过改变rgba的a值实现)
2019/01/24 Javascript
layer.open 子页面弹出层向父页面传输数据的例子
2019/09/26 Javascript
Python实现删除文件中含“指定内容”的行示例
2017/06/09 Python
Python实现Logger打印功能的方法详解
2017/09/01 Python
Python http接口自动化测试框架实现方法示例
2018/12/06 Python
计算pytorch标准化(Normalize)所需要数据集的均值和方差实例
2020/01/15 Python
CSS3实现滚动条动画效果代码分享
2016/08/03 HTML / CSS
迪卡侬英国官网:Decathlon英国
2017/04/08 全球购物
JSF面试题:如何管量web层中的Bean,用什么标签。如何通过jsp页面与Bean绑定在一起进行处理?
2012/10/05 面试题
C/C++ 笔试、面试题目大汇总
2015/11/21 面试题
创先争优制度
2014/01/21 职场文书
英语自我评价范文
2014/01/24 职场文书
竞选学习委员演讲稿
2014/04/28 职场文书
大学新生军训方案
2014/05/03 职场文书
岗位竞聘报告范文
2014/11/06 职场文书
2014个人年度工作总结
2014/12/15 职场文书
环保建议书范文
2015/09/14 职场文书
详解Nginx的超时keeplive_timeout配置步骤
2022/05/25 Servers