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目录操作之python遍历文件夹后将结果存储为xml
Jan 27 Python
用Python编写一个简单的Lisp解释器的教程
Apr 03 Python
利用numpy+matplotlib绘图的基本操作教程
May 03 Python
python list元素为tuple时的排序方法
Apr 18 Python
Python进阶之自定义对象实现切片功能
Jan 07 Python
Python读取csv文件分隔符设置方法
Jan 14 Python
用django-allauth实现第三方登录的示例代码
Jun 24 Python
python 获取等间隔的数组实例
Jul 04 Python
实例详解Python装饰器与闭包
Jul 29 Python
python ftplib模块使用代码实例
Dec 31 Python
基于python-pptx库中文文档及使用详解
Feb 14 Python
python opencv实现图像配准与比较
Feb 09 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
PHP源码之explode使用说明
2011/08/05 PHP
基于PHP字符串的比较函数strcmp()与strcasecmp()的使用详解
2013/05/15 PHP
yii上传文件或图片实例
2014/04/01 PHP
PHP实现删除字符串中任何字符的函数
2015/08/11 PHP
PHP操作XML中XPath的应用示例
2019/07/04 PHP
js实现GridView单选效果自动设置交替行、选中行、鼠标移动行背景色
2010/05/27 Javascript
JavaScript Math.ceil() 函数使用介绍
2013/12/11 Javascript
如何将网页表格内容导入excel
2014/02/18 Javascript
jquery通过visible来判断标签是否显示或隐藏
2014/05/08 Javascript
Javascript实现颜色rgb与16进制转换的方法
2015/04/18 Javascript
js中日期的加减法
2015/05/06 Javascript
javascript中tostring()和valueof()的用法及两者的区别
2015/11/16 Javascript
js的各种排序算法实现(总结)
2016/07/23 Javascript
[原创]jQuery常用的4种加载方式分析
2016/07/25 Javascript
js从数组中删除指定值(不是指定位置)的元素实现代码
2016/09/13 Javascript
jQuery tip提示插件(实例分享)
2017/04/28 jQuery
使用prop解决一个checkbox选中后再次选中失效的问题
2017/07/05 Javascript
解决js ajax同步请求造成浏览器假死的问题
2018/01/18 Javascript
Python实现数通设备端口使用情况监控实例
2015/07/15 Python
zookeeper python接口实例详解
2018/01/18 Python
python使用numpy读取、保存txt数据的实例
2018/10/14 Python
python模块导入的细节详解
2018/12/10 Python
python项目对接钉钉SDK的实现
2019/07/15 Python
spyder 在控制台(console)执行python文件,debug python程序方式
2020/04/20 Python
python自定义函数def的应用详解
2020/06/03 Python
python使用opencv resize图像不进行插值的操作
2020/07/05 Python
精美的手工家居和生活用品:Nkuku
2019/11/01 全球购物
英国100%防污和防水的靴子:Muck Boot Company
2020/09/08 全球购物
static函数与普通函数有什么区别
2015/12/25 面试题
国际贸易专业个人职业生涯规划
2014/02/15 职场文书
数据保密承诺书
2014/06/03 职场文书
延安红色之旅心得体会
2014/10/07 职场文书
Python Parser的用法
2021/05/12 Python
Redis读写分离搭建的完整步骤
2021/09/14 Redis
Golang ort 中的sortInts 方法
2022/04/24 Golang