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中字典的合并值相加与异或对比
Jun 04 Python
Python调用系统底层API播放wav文件的方法
Aug 11 Python
Python实现查看系统启动项功能示例
May 10 Python
Python将文本去空格并保存到txt文件中的实例
Jul 24 Python
python实现简易数码时钟
Feb 19 Python
python实现狄克斯特拉算法
Jan 17 Python
Django ORM 聚合查询和分组查询实现详解
Aug 09 Python
Python多叉树的构造及取出节点数据(treelib)的方法
Aug 09 Python
tensorflow 变长序列存储实例
Jan 20 Python
Python 调用有道翻译接口实现翻译
Mar 02 Python
jupyter notebook 使用过程中python莫名崩溃的原因及解决方式
Apr 10 Python
python如何导入依赖包
Jul 13 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 正则表达式之正则处理函数小结(preg_match,preg_match_all,preg_replace,preg_split)
2012/10/05 PHP
深入Nginx + PHP 缓存详解
2013/07/11 PHP
ThinkPHP自定义Redis处理SESSION的实现方法
2016/05/16 PHP
php微信公众平台开发(一) 配置接口
2016/12/06 PHP
PHP生成各种随机验证码的方法总结【附demo源码】
2017/06/05 PHP
PHP实现向关联数组指定的Key之前插入元素的方法
2017/06/06 PHP
php常用的工具开发整理
2019/09/26 PHP
laravel model模型处理之修改查询或修改字段时的类型格式案例
2019/10/17 PHP
浅谈laravel-admin form中的数据,在提交后,保存前,获取并进行编辑
2019/10/21 PHP
PHP高并发和大流量解决方案整理
2019/12/24 PHP
JavaScript实现url地址自动检测并添加URL链接示例代码
2013/11/12 Javascript
js实现简单的左右两边固定广告效果实例
2015/04/10 Javascript
提高Web性能的前端优化技巧总结
2017/02/27 Javascript
详解Vue.use自定义自己的全局组件
2017/06/14 Javascript
微信小程序实现YDUI的ScrollNav组件
2018/02/02 Javascript
angularjs实现对表单输入改变的监控(ng-change和watch两种方式)
2018/08/29 Javascript
微信小程序tabbar底部导航
2018/11/05 Javascript
vue实现的微信机器人聊天功能案例【附源码下载】
2019/02/18 Javascript
ES6 Generator基本使用方法示例
2020/06/06 Javascript
[08:04]TI4西雅图DOTA2前线报道 海涛探访各路人马
2014/07/09 DOTA
[00:02]DOTA2新版本使用PA至宝后暴击展示
2014/11/19 DOTA
简单的抓取淘宝图片的Python爬虫
2014/12/25 Python
详解字典树Trie结构及其Python代码实现
2016/06/03 Python
基于Python的接口测试框架实例
2016/11/04 Python
python实现微信自动回复功能
2018/04/11 Python
python生成带有表格的图片实例
2019/02/03 Python
Python魔法方法详解
2019/02/13 Python
详解vscode实现远程linux服务器上Python开发
2020/11/10 Python
Lookfantastic日本官网:英国知名护肤、化妆品和头发护理购物网站
2018/04/21 全球购物
如何在存储过程中使用Loop
2016/01/05 面试题
中药专业自荐信范文
2014/03/18 职场文书
幼儿园春季开学寄语
2014/04/03 职场文书
党支部承诺书
2015/01/20 职场文书
校车安全管理责任书
2015/05/11 职场文书
新教师2015年度工作总结
2015/07/22 职场文书
看古人们是如何赞美老师的?
2019/07/08 职场文书