How to avoid WEB CAPCHAs when execute Selenium

Dahun Yoo·2023년 8월 5일
0

CAPCHAs

CAPTCHA(Completely Automated Public Turing test to tell Computers and Humans Apart, 완전 자동화된 사람과 컴퓨터 판별, 캡차)는 HIP(Human Interaction Proof) 기술의 일종으로, 어떠한 사용자가 실제 사람인지 컴퓨터 프로그램인지를 구별하기 위해 사용되는 방법이다. 사람은 구별할 수 있지만 컴퓨터는 구별하기 힘들게 의도적으로 비틀거나 덧칠한 그림을 주고 그 그림에 쓰여 있는 내용을 물어보는 방법이 자주 사용된다. 이것은 기존의 텍스트와 이미지를 일그러뜨린 형태로 변형한 후 인식 대상이 변형된 이미지로부터 기존 이미지를 도출해 낼 수 있는지를 확인하는 방식의 테스트이다. 컴퓨터 프로그램이 변형시킨 이미지는 사람이 쉽게 인식 할 수 있지만 컴퓨터 프로그램은 변형된 이미지를 인식하지 못하므로 테스트를 통과하지 못한다면 테스트 대상이 사람이 아님을 판정할 수 있다. 흔히 웹사이트 회원가입을 할 때 뜨는 자동가입방지 프로그램 같은 곳에 쓰인다.

CAPTCHA는 기기가 사람을 대상으로 하는 테스트이므로 사람에 가까운 기기를 대상으로 하는 테스트인 튜링 테스트(Turing test)에서 용어를 따와 리버스 튜링 테스트(Reverse Turing test)라고 부르기도 한다.

https://ko.wikipedia.org/wiki/CAPTCHA

음 사람인지 프로그램인지를 구분하기 위해서 뜨는 그런 것.

이미지를 보고 숫자를 입력해야한다. 셀레니움에서 이것을 통과하는 방법은 사실상 없고, 회피하는 방법만 있을 뿐이다.

1. Options에 User-agent 설정하기

https://velog.io/@ggong/User-agent-%EC%A0%95%ED%99%95%ED%95%98%EA%B2%8C-%ED%95%B4%EC%84%9D%ED%95%98%EA%B8%B0

user-agent 는 리퀘스트를 보낼 때에 브라우저의 식별 정보를 나타낸다. 자동화로 실행되는 크롬 브라우저에서는 이것이 적절한 값이 아니어서, 웹사이트에서 금방 봇이나 크롤링이라는 것을 눈치채고 CAPCHAs를 노출시킨다.

이것을 현재 로컬 브라우저와 같게하기 위해서는 아래와 같이 하면 된다.

1. 크롬 브라우저에서 정보 확인하기

크롬 개발자도구 콘솔창에서 navigator.userAgent 를 입력하면 바로 나온다.

2. 그 다음 드라이버 셋업하는 부분에 셋팅하기

        options = Options()
        options.add_argument("user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, "
                             "like Gecko) Chrome/110.0.0.0 Safari/537.36")
        _driver = webdriver.Chrome(
            service=Service(ChromeDriverManager(chrome_type=ChromeType.CHROMIUM).install()),
            options=options
        )

Options() 객체를 선언하고, 문자열로 user-agent= 값을 넘겨준다.

2. 입력을 최대한 천천히 하기

https://domdom.tistory.com/313

특정 웹사이트에서는 텍스트를 타이핑하는 속도를 체크해서 봇인지 사람인지를 구별하기도 한다고 한다.

그래서 입력하고자 하는 텍스트를 복사 해서 붙여넣기 를 하고, 입력 전후로 시간을 충분히 있어주어야한다는 것이다.

이것은 실행속도가 느려지지만 어쩔 수 없는 문제인 것 같다.

텍스트의 복사를 위해서는 pyperclip 라이브러리를 사용한다.

    def _copy_and_paste(self, by_locator, text):
        time.sleep(2)
        element = self._get_element(by_locator)
        pyperclip.copy(text)
        element.click()

        element.send_keys(Keys.COMMAND, 'v')
        time.sleep(2)

맥에서는 커맨드키와 v를 입력하고, 윈도우에서는 컨트롤키와 v를 입력하면 된다.

끝!

profile
QA Engineer

0개의 댓글