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的一些用法分享
Oct 07 Python
python写日志封装类实例
Jun 28 Python
AI人工智能 Python实现人机对话
Nov 13 Python
将TensorFlow的模型网络导出为单个文件的方法
Apr 23 Python
Python3.5运算符操作实例详解
Apr 25 Python
python中metaclass原理与用法详解
Jun 25 Python
django 框架实现的用户注册、登录、退出功能示例
Nov 28 Python
解决Keras 与 Tensorflow 版本之间的兼容性问题
Feb 07 Python
Keras实现将两个模型连接到一起
May 23 Python
python如何随机生成高强度密码
Aug 19 Python
bat批处理之字符串操作的实现
Mar 16 Python
python中urllib包的网络请求教程
Apr 19 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
Codeigniter实现智能裁剪图片的方法
2014/06/12 PHP
微信自定义分享php代码分析
2016/11/24 PHP
Yii2设置默认控制器的两种方法
2017/05/19 PHP
JavaScript学习笔记(十七)js 优化
2010/02/04 Javascript
javascript解三阶幻方(九宫格)
2015/04/22 Javascript
js实现tab切换效果实例
2015/09/16 Javascript
前端性能优化及技巧
2016/05/06 Javascript
老生常谈JavaScript 函数表达式
2016/09/01 Javascript
js方法数据验证的简单实例
2016/09/17 Javascript
vue 2.0封装model组件的方法
2017/08/03 Javascript
React Native悬浮按钮组件的示例代码
2018/04/05 Javascript
微信小程序npm引入vant-weapp的踩坑记录
2019/08/01 Javascript
python获取网页状态码示例
2014/03/30 Python
Python脚本实时处理log文件的方法
2016/11/21 Python
python实现协同过滤推荐算法完整代码示例
2017/12/15 Python
详谈Pandas中iloc和loc以及ix的区别
2018/06/08 Python
python判断输入日期为第几天的实例
2018/11/13 Python
Python面向对象类编写细节分析【类,方法,继承,超类,接口等】
2019/01/05 Python
django中账号密码验证登陆功能的实现方法
2019/07/15 Python
基于 Django 的手机管理系统实现过程详解
2019/08/16 Python
Python交互环境下打印和输入函数的实例内容
2020/02/16 Python
基于python3的socket聊天编程
2020/02/17 Python
在django项目中导出数据到excel文件并实现下载的功能
2020/03/13 Python
Pycharm配置lua编译环境过程图解
2020/11/28 Python
Python新建项目自动添加介绍和utf-8编码的方法
2020/12/26 Python
MSC邮轮官方网站:加勒比海、地中海和世界各地的假期
2018/08/27 全球购物
俄罗斯茶和咖啡网上商店:Tea.ru
2021/01/26 全球购物
酒店前台接待岗位职责
2013/12/03 职场文书
办公室文书岗位职责
2013/12/16 职场文书
爱国演讲稿500字
2014/05/04 职场文书
党校毕业心得体会
2014/09/13 职场文书
小学总务工作总结
2015/08/13 职场文书
Django操作cookie的实现
2021/05/26 Python
html实现弹窗的实例
2021/06/09 HTML / CSS
SQL实现LeetCode(176.第二高薪水)
2021/08/04 MySQL