验证码识别 --Python

今天一下午都在搞这个,终于弄明白了,网上很多方法写的语焉不详,我自己写一个,方便回看。

前期工作

1、用到的包

Pillow 和 aip 是比较重要的,所以拎出来提醒一下。

from PIL import Image
from aip import AipOcr

下面的1、2是必用的,需要用pip安装一下
3顺便把百度的文字识别也安装一下
4如果运行from aip import AipOcr这句时报错,把4也安装一下
5也是防止报错(缺少chardet模块)用的
6是一个简单的文字识别
(我写的不一定全)

pip install selenium
pip install Pillow
pip install baidu-aip
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pytesseract
pip install chardet
pip install pytesseract

这里体会到的一点就是:不要全信网上的办法,不然反而可能比较麻烦。(可能是我太菜,遇到的问题比较简单,用不到太复杂的办法 /菜鸡自嘲

重点说一下chardet报错的解决方法,分两步:1下载安装、2改pytesseract文件。下面展开说
1下载安装:链接如下
https://digi.bib.uni-mannheim.de/tesseract/tesseract-ocr-w64-setup-v5.0.0-alpha.20200223.exe
全程next,在安装路径时,记得路径是什么(最好暂时先复制到某个txt备注里。
2在vs code 或者 pycharm 输入这行代码 import pytesseract.pytesseract 按住Ctrl,单击第二个pytesseract,跳转到该文件的第31行左右,改成如下样式:
在这里插入图片描述

记得前面加r。

2、用到百度文字识别工具

百度文字识别是免费的,这个网上教程很多,我贴个链接过来
主要记住接下来要用到的3串数字即可
AppID
API Key
Secret Key
https://www.cnblogs.com/yanghui3306/p/14385824.html
(标题:图片验证码识别百度API文字识别的使用

开始

准备工作结束,下面开始撸代码,
https://www.cnblogs.com/yanghui3306/p/14385824.html
(我也不知道为什么链接一样,直接贴标题过来:python爬虫解决图片验证码问题

我是根据上面那串链接的代码调试的,后面又融汇了网上其他人的代码


# -* coding: utf-8 *-
 
import time
import random
from PIL import Image
from aip import AipOcr
from selenium.webdriver import Chrome
from selenium.webdriver.common.by import By

# 百度API参数
APP_ID = '***'
API_KEY = '**************'
SECRET_KEY = '*****************'
# 刚才让记住的那3串数字,放到这里来
client = AipOcr(APP_ID, API_KEY, SECRET_KEY)  # 调用API接口


def scrapy(username, password):
    """
    :param username:    用户名
    :param password:    密码
    """
    driver = Chrome()
    driver.get('https://so.gushiwen.cn/user/login.aspx')
    driver.find_element(By.ID,'email').send_keys(username)  # 输入账号
    driver.find_element(By.ID,'pwd').send_keys(password)    # 输入密码

    element = driver.find_element(By.ID,'imgCode')  # 定位验证码图片
    # 获取验证码图片在网页中的位置
    left = (element.location['x'])*1.25  # 获取图片左上角坐标x
    top = (element.location['y'])*1.25  # 获取图片左上角y
    right = (element.location['x']*1.25 + element.size['width']+10)  # 获取图片右下角x
    bottom = (element.location['y']*1.25 + element.size['height']+10)  # 获取图片右下角y


    # 通过Image处理图像
    filename = 'E:/i1/' + str(random.random()) + '.png'
    # filename = str(random.random()) + '.png'  # 生成随机文件名
    driver.save_screenshot(filename)  # 截取当前窗口并保存图片
    im = Image.open(filename)  # 打开图片
    im = im.crop((left, top, right, bottom))  # 截图验证码
    im.save(filename)  # 保存验证码图片
    # 由于我处理的验证码图片没有填多的线条,所以直接采用灰度是验证码数字更加清晰,具体的处理方式可根据验证码的实际情况而定
    im = Image.open(filename)
    # 转换为灰度图像
    im = im.convert('L')
    im.save(filename)
    # 读取图片,应为百度API中提供的方法参数只能是字节流
    with open(filename, 'rb')as f:
        image = f.read()
    # 使用API中提供的方法识别验证码并返回验证码
    data = client.basicGeneral(image)
    try:
        code = data['words_result'][0]['words']
    except:
        return data['error_msg']


    driver.find_element(By.ID,'code').send_keys(code)   # 输入验证码
    driver.find_element(By.ID,'denglu').click()     # 点击登录
    time.sleep(50)    # 为了看清登录,等待1000秒,50秒就够了
    


if __name__ == '__main__':
    print(scrapy('123123123', '123123')) # 传入你在古诗文网注册的账号密码

    # input('')

需要注意的点1:注意自己的版本号
from selenium.webdriver.common.by import By
今天是2022.04.20
win 10
Python版本是3.10.4
selenium是3.3
但大版本是 Python 3 + selenium 3
所以selenium 2 里的一些写法不适用了,如:driver.find_element_by_id('code')
新版应该写为:driver.find_element(By.ID,'code')

需要注意的点2:
left = (element.location['x'])*1.25 # 获取图片左上角坐标x
win 10大多数系统显示都125%。
(查看方式:桌面空白处 -> 右键 -> 显示设置 -> 屏幕 -> 缩放与布局
在这里插入图片描述

所以left top right bottom都乘了1.25,注意乘在谁身上了!
此外:原代码(忘记出处了,侵权删,想起来了放链接)
求这四个值时加了int,私以为不加int会更好,所以删掉了。

其他的都是selenium的一些基础知识,没什么说的。如果非要说的话,就再加一条吧。
需要注意的点3:
整个自动化登录过程最重要的除了定位,就应该是验证码识别了,这也是最难的。
它的方法是:截全图(点4),获取验证码的坐标,计算验证码图片的长宽,crop裁剪,得到只含有验证码的图,转换为灰度图像,识别(API提供的方法)。

啰里啰唆的点4:
应该可以发现,其实这是一个非常简单的识别,而且也没有那么严谨。比如在打开登录页面之初,应该休息5秒,检查打开的页面对不对,类似这样print(EC.title_contains('gushiwen'))

再比如为了防止验证码动态刷新,我们可以先截全图,再去定位,这样对后续工作也比较有利
driver.save_screenshot('E:/imooc.png') # 截全图
element = driver.find_element(By.ID,'imgCode')
。(当然这里没有做,不过也可能是多此一举了哈哈,我后面再学学…只是觉得截个全图保险一点,方便后续复盘)

如有其他问题后续再补充。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值