Python을 활용한 자동 인식 캡차 처리 시스템 구현

웹사이트의 보안 캡차를 자동으로 인식하고 입력하는 기능은 웹 스크래핑과 이미지 분석 기술을 결합하여 구현할 수 있습니다. 아래는 파이썬 기반의 종합적인 해결 방안입니다.

1. 캡차 이미지 다운로드

목표 페이지에서 캡차 이미지의 링크를 추출한 후, requests 라이브러리를 사용해 로컬에 저장합니다.

import requests

def fetch_captcha_image(image_url, save_path='captcha.jpg'):
    response = requests.get(image_url, timeout=10)
    if response.status_code == 200:
        with open(save_path, 'wb') as f:
            f.write(response.content)
    else:
        raise Exception("이미지 다운로드 실패")

2. 이미지 전처리 및 텍스트 추출

다운로드한 이미지를 선명하게 만들고, pytesseractopencv-python를 이용해 문자를 인식합니다. 사전 설치가 필요합니다:

pip install pytesseract opencv-python

이후, 이미지 전처리 및 추출 로직은 다음과 같습니다:

import cv2
import pytesseract

def extract_text_from_captcha(image_path):
    # 이미지 읽기 및 그레이스케일 변환
    img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
    
    # 노이즈 제거 및 밝기 조정
    blurred = cv2.GaussianBlur(img, (3, 3), 0)
    enhanced = cv2.adaptiveThreshold(blurred, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, 
                                     cv2.THRESH_BINARY, 11, 2)
    
    # OCR 실행 (영문 전용)
    text = pytesseract.image_to_string(enhanced, lang='eng', config='--psm 7 --oem 3')
    
    return text.strip()

3. 브라우저 자동화를 통한 폼 제출

Selenium을 사용해 실제 브라우저 환경을 시뮬레이션하고, 인식된 텍스트를 입력 필드에 전달합니다.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options

def submit_form_with_captcha(captcha_value, form_url):
    chrome_options = Options()
    chrome_options.add_argument("--headless")  # GUI 없이 실행
    chrome_options.add_argument("--no-sandbox")
    
    driver_service = Service('/path/to/chromedriver')  # 경로 설정 필요
    driver = webdriver.Chrome(service=driver_service, options=chrome_options)
    
    try:
        driver.get(form_url)
        
        # 입력 필드 및 제출 버튼 찾기
        input_field = driver.find_element(By.ID, "captcha_input")
        submit_btn = driver.find_element(By.ID, "submit_button")
        
        # 인식된 텍스트 입력 후 제출
        input_field.send_keys(captcha_value)
        submit_btn.click()
        
    finally:
        driver.quit()

4. 전체 프로세스 통합

모든 단계를 하나의 함수로 연결하여 자동화 흐름을 완성합니다.

def automate_captcha_process(captcha_url, form_url):
    fetch_captcha_image(captcha_url)
    recognized_text = extract_text_from_captcha('captcha.jpg')
    submit_form_with_captcha(recognized_text, form_url)

if __name__ == "__main__":
    CAPTCHA_URL = "https://example.com/captcha.png"
    FORM_URL = "https://example.com/submit"
    automate_captcha_process(CAPTCHA_URL, FORM_URL)

이 시스템은 간단한 정적 캡차에 효과적이지만, 회전, 왜곡, 배경 잡음 등이 있는 복잡한 경우 정확도가 감소할 수 있습니다. 또한, 대량의 요청은 사이트의 차단 정책에 의해 차단될 수 있으므로 주의가 필요합니다.

태그: python selenium OpenCV pytesseract Web Scraping

6월 23일 23:53에 게시됨