讯飞AI开发者社区 如何使用Python识别处理验证码

如何使用Python识别处理验证码

CAPTCHAs旨在通过提出通常对人类容易但对计算机具有挑战性的问题来防止自动机器人访问。但是,自动解决CAPTCHA是有正当理由的,例如对于难以进行CAPTCHA或测试目的的用户的可访问性。用Python高效求解验证码对于那些对使用Python解决captcha的简单方法感兴趣的人,您可以利用selenium用于web自...

egzosn  ·  2025-01-18 14:19:33 发布

CAPTCHAs旨在通过提出通常对人类容易但对计算机具有挑战性的问题来防止自动机器人访问。但是,自动解决CAPTCHA是有正当理由的,例如对于难以进行CAPTCHA或测试目的的用户的可访问性。

用Python高效求解验证码

对于那些对使用Python解决captcha的简单方法感兴趣的人,您可以利用selenium用于web自动化和pytesseract用于OCR功能。

让我们看看如何使用这些紧凑的解决方案:

  • 首先确保你已经安装了Pythonselenium,pytesseract,和Pillow。的使用Selenium有助于自动化浏览器交互,而Pillowpytesseract处理图像和从中提取文本。您可以使用pip安装它们:
pip install pytesseract selenium pillow
  • 1.
  • 您需要下载与浏览器兼容的web驱动程序,例如  Chrome驱动程序并在脚本中指定其路径。

例如,基本代码设置可以如下所示:

from selenium import webdriver
from PIL import Image
import pytesseract
from io import BytesIO

# Set up the web driver
browser = webdriver.Chrome(executable_path='path_to_chromedriver')

# Open the webpage that contains the CAPTCHA
browser.get('https://example.com/captcha')

# Find the CAPTCHA image by its ID and take a screenshot
captcha_element = browser.find_element_by_id('captcha_image_id')
captcha_image = captcha_element.screenshot_as_png

# Load the image into PIL for processing and use pytesseract to extract the text
image = Image.open(BytesIO(captcha_image))
captcha_text = pytesseract.image_to_string(image, config='--psm 8 --oem 3')

print("CAPTCHA Text:", captcha_text)
browser.quit()
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.

提供的Python脚本旨在使用两个主要工具自动解决验证码的过程:SeleniumPytesseract。以下是代码的每个部分如何有助于解决CAPTCHA的详细说明:

  • browser = webdriver.Chrome(executable_path='path_to_chromedriver')有助于实现浏览器的自动化,因此Selenium可以导航到页面,查找CAPTCHA图像,并与页面上的任何必要元素进行交互。使用Selenium的直接从屏幕捕获验证码screenshot_as_png功能。
  • 将捕获的图像加载到Pytesseract,pytesseract.image_to_string(image, config='--psm 8 --oem 3')分析图像并从中提取文本。配置(--psm 8 --oem 3) 优化Pytesseract识别单个单词,这是典型的验证码,提高准确性。
  • 通过显示验证码文本print("CAPTCHA Text:", captcha_text),这确认验证码已被处理并解决,这是脚本的最终目标。
  • 最后browser.quit()确保在脚本运行后关闭浏览器以防止资源泄漏,这对于保持效率的自动化任务非常重要。

这个Python脚本为解决验证码的直接解决方案提供了一个很好的开始,通过使用Selenium从网页访问和捕获CAPTCHA图像,然后使用Pytesseract提取并输出文本。

了解captcha及其挑战

验证码,或完全自动化的公共图灵测试可以区分计算机和人类,是网站用来确保与之交互的实体是人而不是机器人的工具。

它们对自动化系统构成的主要挑战是它们的设计目的:只能被人类解决

这一特性使CAPTCHAs成为涉及web自动化和抓取的任务的重大障碍,其中机器人需要执行类似于人类的操作。验证码有各种形式,每种形式都有独特的挑战。例如:

  • 基于文本的验证码: 这些显示用户必须正确输入的扭曲文本。它们通常包括视觉上相似的字符,以测试用户区分细微差异的能力。
  • 基于图像的验证码: 用户选择适合特定描述的图像,例如像选择所有带有交通信号灯的图像,要求能够直观地解释和分析复杂的场景。
  • 音频验证码: 适用于有视觉障碍的用户,这些播放用户必须正确输入的失真数字和字母的音频剪辑。
  • 交互式验证码: 这些要求用户执行一项任务,例如拖动滑块或用鼠标做出特定的手势,测试用户以类人的方式与元素进行交互的能力。

高效的CAPTCHA解决方案增强了各种领域中自动化流程的有效性,例如数据抓取和web应用程序的自动化测试。

对于企业来说,克服CAPTCHA可能意味着访问基本web数据和面临重大运营延迟之间的区别。但是,如前所述,由于captcha旨在防止自动访问,因此它们对web抓取等任务构成了重大障碍,其中机器人用于从网站收集大量数据。

它们破坏了抓取过程,要求开发人员手动解决captcha或实施高级解决方案来绕过它们。这一挑战增加了开发有效的web自动化和抓取工具的复杂性和成本。

什么是CAPTCHAs?

CAPTCHAs是网站上使用的安全机制,用于区分人类用户和自动机器人。这些测试通常对人类来说很容易,但对机器或机器人来说具有挑战性。

例如:

  • 基于文本的验证码要求用户输入失真或重叠的字母和数字,这些字母和数字会出现视觉噪声和线条干扰,旨在混淆标准的光学字符识别软件。
  • 基于图像的验证码要求用户从一组图像中识别特定图像,例如查找包含汽车的所有图片,测试处理复杂视觉信息的能力。
  • 复选框验证码,通常被认为是reCAPTCHA,涉及一个简单的复选框,但可能会分析相关的鼠标移动,以验证它们是否类似于人类。

例如,这是不同的captcha看起来像:

如何使用Python识别处理验证码_解决方案

如何使用Python识别处理验证码_解决方案_02

如何使用Python识别处理验证码_解决方案_03

可以绕过验证码吗?

验证码确实可以被绕过,尽管它构成了一个巨大的挑战。CAPTCHAs的设计主要是为了防止自动化系统执行敏感或潜在有害的操作,它包含了计算机通常难以解码的复杂性。诀窍不仅仅是解决它们,而是始终如一地有效地做到这一点,以便在现实世界的应用程序中切实可行。

为了有效地处理CAPTCHAs,先发制人的措施往往比直接对抗更有利。例如,修改自动化系统的行为以模仿人类交互模式可以降低触发CAPTCHA的可能性。

这些可能包括改变请求的时间,像普通用户一样使用cookie,或者在发出请求之前与页面的其他元素进行交互。

如果确实出现了CAPTCHA,一种策略是简单地重试该操作-如果网站的安全触发器未持续激活,则重新加载页面或提交新表单可能会绕过CAPTCHA。

处理验证码的方法

有效处理验证码需要一种战略方法,通常涉及预防或直接解决:

1.模仿人类行为:

  • 第一种策略涉及配置自动化系统以尽可能地模拟人类浏览行为。这包括保持页面请求之间的实际间隔,使用一致的ip地址,不要切换太频繁,并有效地管理cookie和会话数据。
  • 与网站进行类似人类的交互,例如在发出请求之前随机移动鼠标或滚动页面,也可以帮助避免被检测为机器人。
  • 网站跟踪行为模式,看起来像典型用户的系统不太可能被提供验证码。

2.直接解决验证码:

  • 当captcha出现时,下一个方法是使用内部开发的系统或第三方服务来解决它们。
  • 开发内部解决方案通常涉及使用OCR技术来解释基于文本的CAPTCHAs或机器学习模型,以用于更复杂的基于图像或交互式的CAPTCHAs。
  • 这可能是技术要求高且资源密集的,但提供了对过程的控制,并且可以专门针对遇到的CAPTCHAs类型进行定制。
  • 另外,第三方验证码解决服务提供了一个实用的解决方案,特别是对于需要处理大量验证码的企业。
  • 这些服务使用人工或先进的人工智能系统来实时解决发送给他们的验证码,在几秒钟内提供解决的验证码。这种方法导致每个CAPTCHA的成本,但非常有效,特别是在需要高精度的情况下。

这两种方法都需要仔细考虑法律和道德影响,确保用于绕过或解决验证者的任何方法都符合相关法律和网站服务条款。

对这两种策略进行细致的了解,可以更有效地计划和实施web自动化和抓取项目。

如何解决验证码?

解决captcha是各种自动化任务中的常见需求,尤其是在处理web数据提取,用户行为模拟和自动化测试时。

有几种可用的方法,从利用免费和开源软件到依赖强大的付费第三方服务。每种方法都有其优势,适合不同的需求和背景。

免费和开源验证码求解库

Tesseract OCR

开源库提供了一种经济高效的方式来处理简单的captcha,尤其是那些基于文本的captcha。例如,Tesseract OCR 是一个开源OCR引擎,可在Apache 2.0许可证,广泛用于各种语言的图像到文本转换。

它支持广泛的语言,并且可以被训练以识别其他语言或专用字体,并且是高度可配置的,允许对OCR处理步骤的精细控制。

您可以安装Tesseract与:

pip install pytesseract
  • 1.

要使用Tesseract在Python中,您通常需要一个图像处理库,如PIL打开并预处理图像。

让我们看一个例子:

from PIL import Image
import pytesseract

# Open an image file
img = Image.open('path_to_image.jpg')

# Use Tesseract to convert the image to text
text = pytesseract.image_to_string(img)

print(text)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

EasyOCR

接下来,EasyOCR是一个更新的补充,旨在直接用于OCR任务。它在从嘈杂的背景和非常规布局中识别文本时特别有效支持80多种语言,并包含一个深度学习模型,可以处理更复杂的图像和文本布局。

对于安装,您可以使用:

pip install easyocr
  • 1.

EasyOCR可以用几行代码来识别图像中的文本。例如:

import easyocr

# Create a reader instance for English
reader = easyocr.Reader(['en'])

# Read from an image
results = reader.readtext('path_to_image.jpg')

for result in results:
    print(result[1])
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

Python图像库 (PIL)

Python Imaging Library,或称为Pillow库对于在Python中打开,操作和保存许多不同的图像文件格式至关重要。PIL对于OCR任务中的图像预处理非常有用,例如调整大小、裁剪和转换为灰度。

您可以使用以下命令进行安装:

pip install Pillow
  • 1.

PIL可用于在将图像传递给OCR引擎之前对其进行预处理:

from PIL import Image, ImageFilter

# Open an image file
img = Image.open('path_to_image.jpg')

# Apply image filters
img = img.convert('L')  # Convert to grayscale
img = img.filter(ImageFilter.SHARPEN)  # Sharpen image

# Save or display the processed image
img.save('processed_image.jpg')
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

OpenCV

Python库,如OpenCV可以在将图像馈送到OCR工具之前用于此类图像操纵。这种方法对于具有技术熟练程度的开发人员特别有吸引力,他们希望将其解决方案保留在内部而无需额外成本。OpenCV可用于比更复杂的图像转换和增强PIL

对于安装,请使用以下命令:

pip install opencv-python
  • 1.

这里是你如何使用OpenCV对于图像处理,尤其是在为OCR准备图像时:

import cv2

# Load an image
img = cv2.imread('path_to_image.jpg')

# Convert to grayscale
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# Apply Gaussian Blur
blurred = cv2.GaussianBlur(gray, (5, 5), 0)

# Save the processed image
cv2.imwrite('processed_image.jpg', blurred)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

这些库中的每一个都在从图像中识别文本的管道中起着至关重要的作用,特别是在解决验证码的情况下,预处理和准确的文本识别至关重要。

用Python解决文本验证码

字母数字验证码是一种验证码,要求用户从屏幕上显示的扭曲或模糊图像中识别并输入字母和数字的组合。

这些验证码旨在防止自动机器人访问web服务,完成注册或在线提交表单,方法是提出一个通常比机器更容易解决的挑战。

以下是字母数字验证码的一些示例:

如何使用Python识别处理验证码_解决方案_04

这是字母数字验证卡的工作方式:

  • 图像生成: CAPTCHA系统生成一个图像,该图像包括一串随机的字母和数字。这些字符通常被扭曲,扭曲或覆盖有视觉噪声,例如点,线或变化的背景颜色,以使自动化系统的OCR复杂化。
  • 用户交互: 提示用户输入图像中出现的字符。这项任务涉及视觉感知和解释,与当前的自动化系统相比,人类通常表现良好的技能。
  • 验证: 一旦用户提交了他们的输入,系统就会检查输入的文本是否与验证码文本匹配。如果是,则允许用户继续; 如果不是,则可能会要求他们再次尝试,可能使用新的验证码。

该方法利用了以下事实: 尽管OCR技术已经进步,但在各种视觉干扰中解释高度失真或重叠的文本仍然对自动化构成重大挑战。

字母数字验证码的有效性在于它们能够平衡复杂性以击败机器人以及允许人类用户通过的简单性。

使用开源解决方案解决文本验证码

在本节中,我们将在开源库的帮助下,探索使用Python解决文本验证码的实际实现,例如PIL,SciPy,NumPy,和Pytesseract。这些库中的每一个在处理和解释CAPTCHA图像中起着至关重要的作用。

让我们测试下图以查看结果:

如何使用Python识别处理验证码_解决方案_05

下面是一个完整的Python脚本,演示了如何使用上述库解决文本验证码:

from PIL import Image, ImageFilter
from scipy.ndimage import gaussian_filter
import numpy as np
import pytesseract

def solve_captcha(filename):
    # Thresholds and blurring sigma
    th1 = 140
    th2 = 140  
    sig = 1.5  

    # Load and save the original image
    original = Image.open(filename)
    # Convert to black and white
    black_and_white = original.convert("L")
    black_and_white.save("black_and_white.png")

    # Apply the first threshold
    first_threshold = black_and_white.point(lambda p: p > th1 and 255)
    first_threshold.save("first_threshold.png")

    # Apply Gaussian blur
    blur = np.array(first_threshold)  # Create an image array
    blurred = gaussian_filter(blur, sigma=sig)
    blurred = Image.fromarray(blurred)
    blurred.save("blurred.png")

    # Apply the final threshold
    final = blurred.point(lambda p: p > th2 and 255)
    final = final.filter(ImageFilter.EDGE_ENHANCE_MORE)
    final = final.filter(ImageFilter.SHARPEN)
    final.save("final.png")

    # Perform OCR using Tesseract
    result = pytesseract.image_to_string(final, lang='eng', config='--psm 7')

    # Print the result
    print(f"Captured CAPTCHA: {result}")
    return result

# Example usage
result = solve_captcha('path_to_image.jpg')
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.

用Python解决reCAPTCHAs

如下图所示,reCAPTCHA是Google的一项免费服务,有助于保护网站免受垃圾邮件和滥用。reCAPTCHA是传统CAPTCHA的重大演变,它要求用户从扭曲的图像中输入文本,reCAPTCHA利用先进的风险分析技术来区分人类和机器人。

如何使用Python识别处理验证码_Python_06

Recaptcha比原始captcha更复杂,涉及对人类更容易但对机器人具有挑战性的测试。有几种类型的reCAPTCHAs:

  • reCAPTCHA v2: 包括一个复选框说我不是机器人并且还可能涉及图像挑战,其中用户选择匹配特定描述的图像。
  • 隐形reCAPTCHA: 当用户与网站交互时执行背景检查,并仅在检测到可疑活动时提示他们解决验证码。
  • reCAPTCHA v3: 在没有任何用户交互的情况下对与网站的用户交互进行评分,从而允许网站所有者根据该分数采取行动 (例如,阻止,挑战,节流)。

该系统通过使用复杂的算法分析用户交互和网络流量模式来识别潜在的机器人。提出的挑战是基于此分析动态调整的。

使用开源解决方案解决reCAPTCHAs

现在让我们介绍如何使用Google的reCAPTCHA进行交互 selenium-recaptcha-solver,一个开源解决方案,用于自动化与Google的reCAPTCHA v2的交互。当您需要在处理captcha是必要障碍的开发环境中测试或自动化工作流时,此工具特别有用。

让我们剖析下面的代码片段,以了解如何 selenium-recaptcha-solver与Selenium一起工作,以与上的reCAPTCHA交互 演示页

网站最初看起来像这样:

如何使用Python识别处理验证码_验证码_07

现在,让我们转到代码:

from selenium_recaptcha_solver import RecaptchaSolver
from selenium.webdriver.common.by import By
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

# User-Agent to mimic a real user visit
test_ua = 'Mozilla/5.0 (Windows NT 4.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2049.0 Safari/537.36'

options = Options()

options.add_argument("--window-size=1920,1080")

# Setting a custom User-Agent
options.add_argument(f'--user-agent={test_ua}')

options.add_argument('--no-sandbox')
options.add_argument("--disable-extensions")

# Initialize the Chrome WebDriver with the specified options
test_driver = webdriver.Chrome(options=options)

# Create an instance of RecaptchaSolver using the initialized WebDriver
solver = RecaptchaSolver(driver=test_driver)

# Navigate to Google's reCAPTCHA demo page
test_driver.get('https://www.google.com/recaptcha/api2/demo')

# Locate the reCAPTCHA iframe using its title attribute and switch to it
recaptcha_iframe = test_driver.find_element(By.XPATH, '//iframe[@title="reCAPTCHA"]')

# Use the solver to click on the reCAPTCHA checkbox
solver.click_recaptcha_v2(iframe=recaptcha_iframe)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.

然后,我们可以看到selenium-recaptcha-solver解决了reCAPTCHA:

如何使用Python识别处理验证码_验证码_08

  • 脚本首先配置ChromeDriver并初始化Selenium WebDriver对于具有指定选项的Chrome。
  • 的一个实例RecaptchaSolver创建时,将WebDriver作为参数传递。此对象将处理与reCAPTCHA的交互。
  • 然后,脚本导航到包含reCAPTCHA的演示页面,并定位其iframe,并将其传递给求解器的方法以执行单击操作。
Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐

  • 浏览量 1205
  • 收藏 0
  • 0

所有评论(0)

查看更多评论 
已为社区贡献21条内容