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编程之gui程序实现简单文件浏览器代码
Dec 08 Python
人生苦短我用python python如何快速入门?
Mar 12 Python
Python二进制串转换为通用字符串的方法
Jul 23 Python
Python写一个基于MD5的文件监听程序
Mar 11 Python
使用Python做垃圾分类的原理及实例代码附源码
Jul 02 Python
Django密码系统实现过程详解
Jul 19 Python
决策树剪枝算法的python实现方法详解
Sep 18 Python
python元组和字典的内建函数实例详解
Oct 22 Python
python opencv pytesseract 验证码识别的实现
Aug 28 Python
python 线程的五个状态
Sep 22 Python
小白教你PyCharm从下载到安装再到科学使用PyCharm2020最新激活码
Sep 25 Python
python3.9之你应该知道的新特性详解
Apr 29 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 CURL模拟登录新浪微博抓取页面内容 基于EaglePHP框架开发
2012/01/16 PHP
PHP实现读取一个1G的文件大小
2013/08/24 PHP
php延迟静态绑定实例分析
2015/02/08 PHP
利用PHP将部分内容用星号替换
2020/04/21 PHP
YII Framework教程之异常处理详解
2016/03/14 PHP
利用js读取动态网站从服务器端返回的数据
2014/02/10 Javascript
Javascript图片上传前的本地预览实例
2014/06/16 Javascript
基于javascript实现句子翻牌网页版小游戏
2016/03/23 Javascript
快速解决Canvas.toDataURL 图片跨域的问题
2016/05/10 Javascript
基于JS实现导航条flash导航条
2016/06/17 Javascript
js事件冒泡、事件捕获和阻止默认事件详解
2016/08/04 Javascript
JS 事件绑定、事件监听、事件委托详细介绍
2016/09/28 Javascript
修改UA在PC中访问只能在微信中打开的链接方法
2017/11/27 Javascript
vue接入腾讯防水墙代码
2019/05/07 Javascript
uni-app实现点赞评论功能
2019/11/25 Javascript
使用python实现扫描端口示例
2014/03/29 Python
python服务器与android客户端socket通信实例
2014/11/12 Python
详解Python中with语句的用法
2015/04/15 Python
Python3.遍历某文件夹提取特定文件名的实例
2018/04/26 Python
Python使用pyodbc访问数据库操作方法详解
2018/07/05 Python
Tensorflow 同时载入多个模型的实例讲解
2018/07/27 Python
Python中常用的8种字符串操作方法
2019/05/06 Python
python:目标检测模型预测准确度计算方式(基于IoU)
2020/01/18 Python
django有外键关系的两张表如何相互查找
2020/02/10 Python
斯福泰克软件测试面试题
2015/02/16 面试题
软件工程师面试题
2012/06/25 面试题
在校大学生的职业生涯规划书
2014/03/14 职场文书
国际贸易毕业生自荐书
2014/06/22 职场文书
党员干部反四风民主生活会对照检查材料思想汇报
2014/10/12 职场文书
建筑安全员岗位职责
2015/02/15 职场文书
小升初自荐信范文
2015/03/05 职场文书
沂蒙六姐妹观后感
2015/06/08 职场文书
教导处教学工作总结
2015/08/12 职场文书
高考百日冲刺决心书
2015/09/23 职场文书
该怎么书写道歉信?
2019/07/03 职场文书
python之PySide2安装使用及QT Designer UI设计案例教程
2021/07/26 Python