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 11 Python
python实现代理服务功能实例
Nov 15 Python
python实现从字符串中找出字符1的位置以及个数的方法
Aug 25 Python
python字典序问题实例
Sep 26 Python
Python面向对象之继承代码详解
Jan 29 Python
对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解
Jun 28 Python
用pandas中的DataFrame时选取行或列的方法
Jul 11 Python
Pandas DataFrame 取一行数据会得到Series的方法
Nov 10 Python
python3 小数位的四舍五入(用两种方法解决round 遇5不进)
Apr 11 Python
Python实现bilibili时间长度查询的示例代码
Jan 14 Python
Django 5种类型Session使用方法解析
Apr 29 Python
django表单中的按钮获取数据的实例分析
Jul 31 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 带逗号千位符数字的处理方法
2012/01/10 PHP
图文介绍PHP添加Redis模块及连接
2015/07/28 PHP
php+jQuery递归调用POST循环请求示例
2016/10/14 PHP
PHP获取当前执行php文件名的代码
2017/03/02 PHP
PHP开发实现快递查询功能详解
2019/04/08 PHP
thinkphp框架无限级栏目的排序功能实现方法示例
2020/03/29 PHP
js checkbox(复选框) 使用集锦
2009/04/28 Javascript
javascript 获取页面的高度及滚动条的位置的代码
2010/05/06 Javascript
Extjs gridpanel 出现横向滚动条问题的解决方法
2011/07/04 Javascript
JavaScript中的Math 使用介绍
2014/04/21 Javascript
Javascript 读取操作Sql中的Xml字段
2014/10/09 Javascript
jQuery菜单插件用法实例
2015/07/25 Javascript
判断是否存在子节点的实现代码
2016/05/18 Javascript
JQuery EasyUI学习教程之datagrid 添加、修改、删除操作
2016/07/09 Javascript
js创建对象几种方式的优缺点对比
2016/09/28 Javascript
微信小程序 密码输入(源码下载)
2017/06/27 Javascript
jQuery操作DOM_动力节点Java学院整理
2017/07/04 jQuery
关于vue.js发布后路径引用的问题解决
2017/08/15 Javascript
webpack+vue2构建vue项目骨架的方法
2018/01/09 Javascript
JS设计模式之观察者模式实现实时改变页面中金额数的方法
2018/02/05 Javascript
原生javascript运动函数的封装示例【匀速、抛物线、多属性的运动等】
2020/02/23 Javascript
Python中逗号的三种作用实例分析
2015/06/08 Python
Python实现的密码强度检测器示例
2017/08/23 Python
Python实现一个服务器监听多个客户端请求
2018/04/12 Python
Python3中bytes类型转换为str类型
2018/09/27 Python
python获取磁盘号下盘符步骤详解
2019/06/19 Python
Django models filter筛选条件详解
2020/03/16 Python
Django Admin设置应用程序及模型顺序方法详解
2020/04/01 Python
Python文件夹批处理操作代码实例
2020/07/21 Python
Python如何实现Paramiko的二次封装
2021/01/30 Python
CSS3实现复选框动画特效示例代码
2016/09/27 HTML / CSS
排序都有哪几种方法?请列举。用JAVA实现一个快速排序
2014/02/16 面试题
大专会计自我鉴定
2014/02/06 职场文书
学校2014重阳节活动策划方案
2014/09/16 职场文书
2014大四本科生自我鉴定总结
2014/10/04 职场文书
python-opencv 中值滤波{cv2.medianBlur(src, ksize)}的用法
2021/06/05 Python