All Articles

[파이썬 Selenium] 2Captcha로 크롤링 시 캡챠 (Captcha) 자동화 하기

지루한 노가다성 업무를 매일 진행하고 있는가? 파이썬과 Selenium을 배워서 Daily 데이터 다운로드 등의 노가다성 업무를 자동화 하고, 그 시간에 더 생산성 높은 업무를 진행하는 것도 괜찮은 선택이라고 생각한다.

업무 자동화를 위해 파이썬 Selenium 같은 것으로 사이트를 자동화 하다 보면, 보안 문자를 입력하라는 사이트들이 있다. 이런 경우 기술로 해결하고자 한다고 하면 OCR을 진행하거나, 머신 러닝을 이용해서 캡챠를 자동화할 수 있다. 실제 인터넷에 찾아보면 머신 러닝으로 모델을 학습시켜서 캡챠를 자동화했다는 글들을 볼 수 있다.

하지만 내가 원하는 것은 간단하게 로그인만 진행하는 것인데, 로그인이나 글쓰기를 자동화 하겠다고 머신 러닝 같은 기술을 도입하는 것은 배보다 배꼽이 커지는 거라고 생각한다. 물론 기술적인 만족감을 위해서라면 당연히 해볼 만 하다. 하지만 개발에 걸리는 개발 공수의 ROI를 생각해 보면, 누군가가 잘 만들어 놓은 서비스를 약간의 돈을 지불하고 사용하는 것도 괜찮은 접근이다.

이 글에서는 해외에서 캡챠를 대신 풀어주는 서비스인 2Captcha를 가입하는 방법, 그리고 Selenium 과 2Captcha 서비스를 연동하는 예제 코드를 올려 두었다.

해당 서비스의 이용 가격 정보는 사이트에서 실시간으로 보여준다. 매 시간마다 조금씩 달라지는 것 같다. 글을 작성하는 시간에는 일반 캡챠는 1,000회에 0.75 달러 (836원), 리캡챠는 1,000회에 2.99 달러 (3,334원) 이다.

이용 가격 정보가 홈페이지에 실시간으로 보여진다

2Captcha 가입하기

  1. https://2captcha.com/ 사이트에 들어가서 좌측의 Quick START 버튼을 누른다.

    Step 1

  2. 회원 가입을 진행한다.

    Step 2

  3. 그 다음 나오는 화면이다. 우리는 캡챠를 해결하는 게 목표이기 때문에, I’M A CUSTOMER 아래의 NEXT 버튼을 누르고 진행한다.

    Step 3

  4. 그러면 이렇게 대시보드가 나온다. 아래에 API KEY 도 보이지만, 현재는 잔고가 0 달러이기 때문에 API KEY가 작동하지 않는다. Add funds 버튼을 눌러서 먼저 충전을 한다.

    Step 4

  5. 그러면 이렇게 돈을 지불하는 창이 나온다. 나는 PayPal으로 최소 금액인 3달러만 결제를 진행해보았다.

    Step 5

  6. 그러면 이렇게 PayPal 주문 창이 나온다. 신용카드를 이용해 구매하였다.

    Step 6

  7. 그러면 이렇게 결제되었다고 카드사에서 알림이 온다.

    Step 7

  8. 다시 대시보드로 사이트로 돌아가 보면 3 달러가 결제된 것을 볼 수 있다. 이제 결제가 완료되었다.

    Step 8

2Captcha 테스트해보기

https://2captcha.com/demo/normal 페이지에 가 보면 테스트를 해 볼 수 있는 캡차 화면이 나온다.

  1. 사진을 내려받는다. 나는 normal.jpg 파일로 내려받았다.

    /media/20210427/Untitled%206.png

  2. 2captcha-python 라이브러리를 설치한다.

    (.venv) $ pip install 2captcha-python 
    
    ...
    
    Successfully installed 2captcha-python-1.0.3 certifi-2020.12.5 chardet-4.0.0 idna-2.10 requests-2.25.1 urllib3-1.26.4
  3. 다음 파이썬 파일을 작성한다. api_key 부분에는 대시보드에 있는 API_KEY 를 복사해서 붙여넣으면 된다.

    import sys
    import os
    
    from twocaptcha import TwoCaptcha
    
    api_key = '625..........................76c'
    
    solver = TwoCaptcha(api_key)
    
    try:
        result = solver.normal('normal.jpg')
    
    except Exception as e:
        sys.exit(e)
    
    else:
        sys.exit('solved: ' + str(result))
  4. 파이썬 스크립트를 실행해본다. 위의 캡챠인 W9H5K 가 텍스트로 출력된 것을 알 수 있다.

    (.venv) $ python3 test.py
    solved: {'captchaId': '66716047795', 'code': 'W9H5K'}

위에서는 Simple Captcha 만 적용을 해 보았는데, 구글 캡챠 등 여러가지 다른 캡챠도 풀 수 있다. 공식 문서를 참고해보자.

이제 준비는 끝났다. 실전으로 가 보자.

Selenium 과 연동하기

이 글에서 Selenium을 설치하고 브라우저를 띄우는 것은 설명하지 않는다. 다른 블로그를 찾아보면 Selenium 설치하는 예제는 많이 나온다.

이번에는 위** 판매자센터 로그인을 예시로 들겠다. 해당 사이트는 아이디와 비밀번호를 입력하고 아래와 같이 캡챠를 입력해야 로그인이 된다.

크롬 DevTool로 구조를 분석해 보니, img#_captchaImage CSS 선택자로 해당 캡챠 이미지를 가져올 수 있는 것을 확인할 수 있다.

또한, input#_captchaWord CSS 선택자에 해당 캡챠의 값을 입력하면 되는 것을 확인할 수 있다.

이것을 기반으로 2Captcha를 활용한 Selenium 코드를 작성해 보았다.

import sys
import os
import time

from twocaptcha import TwoCaptcha

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome()
driver.get("https://wpartner.we*********.com/login")

time.sleep(1)

# 캡챠 이미지를 스크린샷을 찍는다.
captcha_png = driver.find_element_by_css_selector('img#_captchaImage').screenshot_as_png

# 캡챠 스크린샷을 captcha.png 파일로 쓴다.
with open('captcha.png', 'wb') as file:
    file.write(captcha_png)

# 2Captcha 서비스에 캡챠 해결을 요청한다.
api_key = '625..........................76c'
solver = TwoCaptcha(api_key)
try:
    result = solver.normal('captcha.png')
    result_code = result['code']

except Exception as e:
    driver.close()
    sys.exit(e)

# 위에서 가져온 Captcha 값을 작성한다.
result_elem = driver.find_element_by_css_selector('input#_captchaWord')
result_elem.send_keys(result_code)

# 추가적인 로직을 작성한다.

driver.close()

위 스크립트를 실행해 보면, 해당 페이지가 열리고 잠시 후 보안 문자가 입력되는 것을 확인할 수 있다.

위 예제에서는 간단한 캡챠를 예시로 들었지만, 공식 문서를 좀 참고하면 구글의 리캡챠 등 다른 캡챠 서비스들도 큰 공수를 들이지 않고 자동화할 수 있다.

본 포스팅은 2Captcha 로부터 소정의 원고료를 지원받아 작성한 글입니다.