爬虫系列教程(8.1)--- 使用OCR技术识别图形验证码

前文

文件内容是关于使用Python进行网络爬虫时如何处理验证码的问题。特别是验证码的识别。

1 简介

1.1验证码的识别:

  • 验证码是网站用来防止自动化脚本的一种安全措施,随着技术的发展,验证码的形式越来越复杂,包括图形验证码、滑动验证码、点选验证码和手机验证码等。

  • 验证码的识别方法多样,有的可以通过图像处理库识别,有的需要深度学习技术,还有的需要借助工具和平台。

1.2 使用OCR技术识别图形验证码:

  • OCR(Optical Character Recognition,光学字符识别)技术可以识别打印在纸上的字符,将其转换成计算机文字。

  • 对于简单的图形验证码,可以使用OCR技术进行识别。

2 操作步骤

2.1 准备工作:

  • 需要安装tesserocr库,以及其他辅助库如Selenium、Pillow、NumPy和retrying。

  • 安装命令示例:

pip3 install selenium Pillow numpy retrying

2.2 保存验证码图片:

  • 将验证码图片保存到本地,以便进行识别。

2.3 识别测试:

  • 使用tesserocr库的image_to_text方法识别验证码图片。

  • 代码示例:

import tesseroct
from PIL import Image
image = Image.open('captcha.png')
result = tesseroct.image_to_text(image)
print(result)

2.4 处理验证码:

  • 对于有干扰的验证码图片,需要进行预处理以去除干扰信息。

  • 通过颜色阈值处理,将图片转化为灰度图像,并去除干扰点。

  • 代码示例:

from PIL import Image
import numpy as np
image = Image.open("captcha2.png")
image = image.convert('L')
threshold = 50
array = np.array(image)
array = np.where(array > threshold, 255, 0)
image = Image.fromarray(array.astype("uint8"))
image.show()

3 识别实战:

  • 使用Selenium自动化操作浏览器,结合tesserocr进行验证码识别。

  • 定义preprocess方法进行图片预处理,去除噪声。

  • 定义login方法进行登录操作,包括识别验证码并输入。

  • 代码示例:

import time
import re
import tesseroct
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common.exceptions import TimeoutException
from PIL import Image
import numpy as np
from retrying import retry

def preprocess(image):
    image = image.convert("L")
    array = np.array(image)
    array = np.where(array > 50, 255, 0)
    image = Image.fromarray(array.astype("uint8"))
    return image

@retry(stop_max_attempt_number=10, retry_on_result=lambda x: x is False)
def login():
    browser = webdriver.Chrome()
    browser.get("https://captcha7.scrape.center/")
    browser.find_element_by_css_selector(".usernameinput[type='text']").send_keys('admin')
    browser.find_element_by_css_selector(".password input[type='password']").send_keys('admin')
    captcha = browser.find_element_by_css_selector('#captcha')
    image = Image.open(BytesIO(captcha.screenshot_as_png))
    image = preprocess(image)
    captcha_text = tesseroct.image_to_text(image)
    captcha_text = re.sub("[^A-Za-z0-9]", "", captcha_text)
    browser.find_element_by_css_selector(".captcha input[type='text']").send_keys(captcha_text)
    browser.find_element_by_css_selector(".login").click()
    try:
        WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.XPATH, "//h2[contains(text, '登录成功')]")))
        time.sleep(10)
        browser.close()
        return True
    except TimeoutException:
        return False

if __name__ == "__main__":
    login()

识别结果

通过自动化测试,如果识别正确,页面会显示“登录成功”,否则需要重试。

文章持续跟新,可以微信搜一搜公众号  rain雨雨编程 ],或扫描下方二维码,第一时间阅读,涉及爬虫,机器学习,Java编程,实战项目等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值