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程序的执行原理
Apr 11 Python
Python的时间模块datetime详解
Apr 17 Python
python sort、sort_index方法代码实例
Mar 28 Python
Python在cmd上打印彩色文字实现过程详解
Aug 07 Python
Python人工智能之路 jieba gensim 最好别分家之最简单的相似度实现
Aug 13 Python
python3 写一个WAV音频文件播放器的代码
Sep 27 Python
详解python 中in 的 用法
Dec 12 Python
Python使用socketServer包搭建简易服务器过程详解
Jun 12 Python
python集合能干吗
Jul 19 Python
python中子类与父类的关系基础知识点
Feb 02 Python
Python爬虫之爬取二手房信息
Apr 27 Python
详解python的内存分配机制
May 10 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
索尼SONY ICF-SW7600GR电路分析与改良
2021/03/02 无线电
php中日期加减法运算实现代码
2011/12/08 PHP
PHP仿博客园 个人博客(2) 数据库增添改删
2013/07/05 PHP
php中fsockopen用法实例
2015/01/05 PHP
使用laravel的migrate创建数据表的方法
2019/09/30 PHP
用javascript实现画板的代码
2007/09/05 Javascript
Jquery判断IE6等浏览器的代码
2011/04/05 Javascript
读jQuery之三(构建选择器)
2011/06/11 Javascript
javascript中onmouse事件在div中失效问题的解决方法
2012/01/09 Javascript
window.addEventListener来解决让一个js事件执行多个函数
2012/12/26 Javascript
javascript中2个感叹号的用法实例详解
2014/09/04 Javascript
jquery点击缩略图切换视频播放特效代码分享
2015/09/15 Javascript
基于jQuery实现复选框是否选中进行答题提示
2015/12/10 Javascript
借助FileReader实现将文件编码为Base64后通过AJAX上传
2015/12/24 Javascript
jQuery简单实现提交数据出现loading进度条的方法
2016/03/29 Javascript
AngularJS中$http服务常用的应用及参数
2016/08/22 Javascript
Bootstrap输入框组件简单实现代码
2017/03/06 Javascript
JavaScript数据结构之广义表的定义与表示方法详解
2017/04/12 Javascript
深入浅析Node.js单线程模型
2017/07/10 Javascript
js实现图片放大展示效果
2017/08/30 Javascript
mint-ui的search组件在键盘显示搜索按钮的实现方法
2017/10/27 Javascript
vue中进入详情页记住滚动位置的方法(keep-alive)
2018/09/21 Javascript
Vue2.0+Vux搭建一个完整的移动webApp项目的示例
2019/03/19 Javascript
vue中v-model对select的绑定操作
2020/08/31 Javascript
python web自制框架之接受url传递过来的参数实例
2018/12/17 Python
python Tkinter版学生管理系统
2019/02/20 Python
Python操作redis实例小结【String、Hash、List、Set等】
2019/05/16 Python
Python基于Dlib的人脸识别系统的实现
2020/02/26 Python
加拿大最大的相机店:Henry’s
2017/05/17 全球购物
Bed Bath & Beyond加拿大官网:购买床上用品、浴巾、厨房电器等
2019/10/04 全球购物
关于读书的活动方案
2014/08/14 职场文书
2014国庆节标语口号
2014/09/19 职场文书
2014年电话销售工作总结
2014/12/01 职场文书
百年孤独读书笔记
2015/06/29 职场文书
asyncio异步编程之Task对象详解
2022/03/13 Python
介绍一下28个JS常用数组方法
2022/05/06 Javascript