티스토리 뷰

728x90
반응형

 

 

 

파이썬의 pytesseract를 이용하여 이미지 캡챠뚫는 방법입니다.

 

 

1. tesseract 설치

tesseract를 이용하기 위해서는 먼저 설치를 해야합니다.

저는 이미 가지고있지만,

아직 설치 되지 않은 분들을 위해 다운로드링크를 첨부합니다.

https://github.com/UB-Mannheim/tesseract/wiki

 

GitHub - UB-Mannheim/tesseract: Tesseract Open Source OCR Engine (main repository)

Tesseract Open Source OCR Engine (main repository) - GitHub - UB-Mannheim/tesseract: Tesseract Open Source OCR Engine (main repository)

github.com

 

설치 시 기본 폴더 위치는 아래와 같습니다.

C:\Program Files (x86)\Tesseract-OCR

 

 

 

2. 크롬드라이버로 캡챠이미지가 있는 URL에 접속하여 이미지 저장

저는 크롬드라이버로 자동화하는 코드를 만들고 있기 때문에

크롬드라이버를 이용하여 캡챠이미지가 있는 URL에 접속해, 캡챠이미지를 로컬에 저장하였습니다.

이미지를 code.png라는 이름으로 저장합니다.

 

driver.get(캡챠이미지가 있는 URL)
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')

#글씨가 있는 이미지를 가져와 code.png로 저장함
imgUrl = soup.find("fieldset",{"class":"fieldset_login"}).find("img")["src"]
driver.get_screenshot_as_file('code.png')

 

 

3. 캡챠이미지 위치조정

만약 캡챠이미지가 특정 위치에 쏠려(?)있다면 위치를 조정해줍니다.

조정할 필요 없이 정상적으로 저장이 되어있다면 필요없는 절차입니다.

cv2가 설치되어 있지 않다면 pip install opencv-python 명령어를 통해 설치하면 됩니다.

 

import cv2

# 저장한 이미지를 불러와서
image = cv2.imread("code.png")

#글씨가 있는 좌표만 짤라서 다시 target.png로 저장함
Image = image[330:365, 240:430]
cv2.imwrite("target.png", Image)

# 저장한 이미지를 다시 불러옴
image2 = cv2.imread("target.png")

 

제가 저장한 이미지는 아래와 같습니다.

 

 

4. tesseract를 이용해 이미지에서 문자열 추출

tesseract로 이미지에서 문자열을 추출합니다.

pytesseract가 설치되어 있지 않다면 pip install pytesseract 명령어를 통해 설치하면 됩니다.

 

import pytesseract

#해당 이미지에 있는 글씨(문자)를 pytersseract를 이용하여 추출함
pytesseract.pytesseract.tesseract_cmd =r"C:\Program Files (x86)\Tesseract-OCR\tesseract.exe"
text = pytesseract.image_to_string(image2)

 

저의 경우 a49d는 정상적으로 잘 가져와졌지만 뒤에 특수문자 \n가 붙어있기에,

영어와 숫자가 아닌 문자들은 전부 지워줍니다.

text = re.sub('[^a-zA-Z0-9]'," ", text).strip().replace(" ","")

이렇게하면 캡챠이미지 뚫기 완성!

 

 

아래와 같이 정렬되어있지 않은 문자도 추출가능합니다.

이미지를 불러와서 문자열로 변환한 후, 영어와 숫자가 아닌 문자들만 지워주면 끝!

 

5. 캡챠이미지 문자들을 입력해 다음 페이지로 이동

캡챠이미지에서 문자를 가져왔다면 가져온 문자를 인풋창에 넣고 다음페이지로 이동하는 버튼을 눌러주면 됩니다.

저의 경우 로그인 화면에서 캡챠가 나왔기에 캡챠 문자열을 적고 로그인 버튼을 눌러주었습니다.

 

driver.find_element_by_name('code').send_keys(text)
#로그인버튼을 누름
driver.find_element_by_class_name('login_botton').click()

 

 

끝입니다!

728x90
반응형
댓글