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调用RPC接口的实例详解
Jan 03 Python
基于python生成器封装的协程类
Mar 20 Python
Pyqt5 基本界面组件之inputDialog的使用
Jun 25 Python
对python中基于tcp协议的通信(数据传输)实例讲解
Jul 22 Python
用python中的matplotlib绘制方程图像代码
Nov 21 Python
python画蝴蝶曲线图的实例
Nov 21 Python
python文件绝对路径写法介绍(windows)
Dec 25 Python
Python+Appium实现自动化测试的使用步骤
Mar 24 Python
Python如何使用PIL Image制作GIF图片
May 16 Python
python 逐步回归算法
Apr 06 Python
python元组打包和解包过程详解
Aug 02 Python
Python实现老照片修复之上色小技巧
Oct 16 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的declare控制符和ticks教程(附示例)
2014/03/21 PHP
javascript对象之内置对象Math使用方法
2010/04/16 Javascript
Javascript冒泡排序算法详解
2014/12/03 Javascript
node.js中实现同步操作的3种实现方法
2014/12/05 Javascript
javascript实现英文首字母大写
2015/04/23 Javascript
浅谈jquery中delegate()与live()
2015/06/22 Javascript
jquery单击事件和双击事件冲突解决方案
2016/03/02 Javascript
jQuery实现鼠标滚动图片延迟加载效果附源码下载
2016/06/28 Javascript
使用jquery如何获取时间
2016/10/13 Javascript
js实现选项卡内容切换以及折叠和展开效果【推荐】
2017/01/08 Javascript
javascript 秒表计时器实现代码
2017/03/09 Javascript
深入理解Node内建模块和对象
2019/03/12 Javascript
详解VScode编辑器vue环境搭建所遇问题解决方案
2019/04/26 Javascript
解决 viewer.js 动态更新图片导致无法预览的问题
2019/05/14 Javascript
vue 组件简介
2020/07/31 Javascript
Element-ui upload上传文件限制的解决方法
2021/01/22 Javascript
[01:09:16]DOTA2-DPC中国联赛 正赛 SAG vs Dynasty BO3 第一场 1月25日
2021/03/11 DOTA
python搜索指定目录的方法
2015/04/29 Python
Python中List.index()方法的使用教程
2015/05/20 Python
Python脚本实现自动发带图的微博
2016/04/27 Python
使用python实现对元素的长截图功能
2019/11/14 Python
在python中使用pyspark读写Hive数据操作
2020/06/06 Python
css3动画过渡实现鼠标跟随导航效果
2018/02/08 HTML / CSS
电气专业推荐信范文
2013/11/18 职场文书
优秀英语专业毕业生求职信
2013/11/23 职场文书
《只有一个地球》教学反思
2014/02/14 职场文书
《春晓》教学反思
2014/04/20 职场文书
创业融资计划书
2014/04/25 职场文书
党支部综合考察材料
2014/05/19 职场文书
电子信息专业应届生自荐信
2014/06/04 职场文书
计算机求职信
2014/07/02 职场文书
广播体操比赛主持词
2015/06/29 职场文书
大学生如何逃脱“毕业季创业队即散伙”魔咒?
2019/08/19 职场文书
实例讲解Python中sys.argv[]的用法
2021/06/03 Python
一些让Python代码简洁的实用技巧总结
2021/08/23 Python
Javascript之datagrid查询详解
2021/09/15 Javascript