웹사이트의 보안 캡차를 자동으로 인식하고 입력하는 기능은 웹 스크래핑과 이미지 분석 기술을 결합하여 구현할 수 있습니다. 아래는 파이썬 기반의 종합적인 해결 방안입니다.
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. 이미지 전처리 및 텍스트 추출
다운로드한 이미지를 선명하게 만들고, pytesseract와 opencv-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)
이 시스템은 간단한 정적 캡차에 효과적이지만, 회전, 왜곡, 배경 잡음 등이 있는 복잡한 경우 정확도가 감소할 수 있습니다. 또한, 대량의 요청은 사이트의 차단 정책에 의해 차단될 수 있으므로 주의가 필요합니다.