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实现绘制树枝简单示例
Jul 24 Python
解决Python传递中文参数的问题
Aug 04 Python
python使用mysql数据库示例代码
May 21 Python
python导入csv文件出现SyntaxError问题分析
Dec 15 Python
浅谈Python中的私有变量
Feb 28 Python
通过python将大量文件按修改时间分类的方法
Oct 17 Python
python正则表达式去除两个特殊字符间的内容方法
Dec 24 Python
Python利用heapq实现一个优先级队列的方法
Feb 03 Python
python按照多个条件排序的方法
Feb 08 Python
Python实现定期检查源目录与备份目录的差异并进行备份功能示例
Feb 27 Python
python中的&&及||的实现示例
Aug 07 Python
Python OpenCV超详细讲解基本功能
Apr 02 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中获取关键词及所属来源搜索引擎名称的代码
2011/02/15 PHP
php实现的click captcha点击验证码类实例
2014/09/23 PHP
WordPress中访客登陆实现邮件提醒的PHP脚本实例分享
2015/12/14 PHP
php常用字符函数实例小结
2016/12/29 PHP
PHP实现简单注册登录系统
2020/12/28 PHP
jquery 表单下所有元素的隐藏
2009/07/25 Javascript
javascript学习笔记(二) js一些基本概念
2012/06/18 Javascript
文字不间断滚动(上下左右)实例代码
2013/04/21 Javascript
JavaScript自执行闭包的小例子
2013/06/29 Javascript
实现51Map地图接口(示例代码)
2013/11/22 Javascript
JavaScript常用脚本汇总(一)
2015/03/04 Javascript
使用RequireJS优化JavaScript引用代码的方法
2015/07/01 Javascript
JS实现仿新浪微博发布内容为空时提示功能代码
2015/08/19 Javascript
如何解决谷歌浏览器下jquery无法获取图片的尺寸
2015/09/10 Javascript
浅谈js在html中的加载执行顺序,多个jquery ready执行顺序
2016/11/26 Javascript
JavaScript中数组的各种操作的总结(必看篇)
2017/02/13 Javascript
基于模板引擎Jade的应用(详解)
2017/12/12 Javascript
基于js中的存储键值对以及注意事项介绍
2018/03/30 Javascript
vue离开当前页面触发的函数代码
2020/09/01 Javascript
实例解析Python设计模式编程之桥接模式的运用
2016/03/02 Python
Python 中pandas.read_excel详细介绍
2017/06/23 Python
python的常见矩阵运算(小结)
2019/08/07 Python
python无序链表删除重复项的方法
2020/01/17 Python
Python 使用 PyQt5 开发的关机小工具分享
2020/07/16 Python
Jupyter notebook命令和编辑模式常用快捷键汇总
2020/11/17 Python
纯CSS3实现圆圈动态发光特效动画的示例代码
2021/03/08 HTML / CSS
canvas学习总结三之绘制路径-线段
2019/01/31 HTML / CSS
UGG雪地靴荷兰官网:UGG荷兰
2016/09/09 全球购物
耐克波兰官方网站:Nike波兰
2019/09/03 全球购物
Made in Design意大利:现代家具、名家灯具和装饰
2020/10/27 全球购物
篮球比赛拉拉队口号
2014/06/10 职场文书
素质教育标语
2014/06/27 职场文书
2014年审计人员工作总结
2014/12/19 职场文书
2015年资料员工作总结
2015/04/25 职场文书
高中物理教学反思
2016/02/19 职场文书
十大最帅动漫男主 碓冰拓海上榜,第一是《灌篮高手》男主角
2022/03/18 日漫