왜 디버깅 모드를 사용해야 하나요?(캡챠 Capcha)
셀레니움(Selenium)으로 크롤링을 할때 몇몇 사이트에서는 봇 감지 기능을 사용하여, 로그인을 할때 질문글을 사용하여 사람인지 아닌지 검증하는 단계를 진행해야 하는 경우가 있다.
보통 이런걸 "Capcha"라고 하는데 종류도 굉장히 많다. (일반 캡
챠 / 키 캡챠 / 클릭 캡챠 / 회전 캡챠 / GeeTest 캡챠 / 카피 퍼즐 등)
Capcha 우회 방법?
OCR(Optical Character Recognition)과 AI를 적절히 활용하여 화면을 캡쳐 후 AI가 분석한 결과를 토대로 Capcha를 해결하는 방법과, 캡챠 발생시 캡챠 화면만 해결하도록 알림 메시지를 전달하여 크롤링을 지속하는 방법도 있습니다.
아예 이러한 Capcha만 해결해주는 API를 판매하는 사이트도 있습니다.
혼자 해결하는 방법은 없을까요?
보통 Capcha는 사용자 편의성을 위해 사이트 이용 중간중간에 체크를 하지 않고, 로그인을 할때에만 Capcha 체크를 하는 경우가 대부분입니다.
즉, 일단 로그인만 해두면 크롤링을 할때 Capcha를 걱정할 필요가 없다는 것입니다.(물론 사이트의 자동 로그아웃 기능이 있는 경우 매번 로그인을 해줘야 합니다. <- 연장 버튼이 있다면 연장버튼을 클릭하도록 코드 수정)
그런데 문제가 있습니다, Selenium을 실행할때 로그인을 해두면 다음 코드가 실행될때 로그인이 유지가 안되고 새로 로그인을 해야 하는 경우가 발생할 수 있습니다.
이를 해결하기 위한 방법이 바로 Debugging Mode입니다.
Selenium을 Debugging Mode로 실행하기
크롬을 사용하다보면 용량이 부족한 경우가 있는데, 이는 크롬 브라우저가 사용자의 행동 정보를 사용자 PC에 캐시로 저장해두기 때문에 발생하는 문제 입니다. 이를 활용하면 "이미 로그인되어 있는 사용자 정보를 불러와 사용할 수 있습니다"
원리를 알면 다음에 이어질 코드를 이해하는데 큰 도움이 될것입니다.
디버깅 모드 원리(디버깅 == 크롬을 계속 켜두기)
1) 특정 포트에 크롬을 실행 시킨다.(== 해당 포트에 항상 크롬이 실행되는 것입니다.)
2) 해당 크롬의 사용자 정보가 저장될 폴더 위치를 지정해줍니다.(Chrome_debug_temp폴더)
3) Selenium에서 1)에서 실행한 크롬의 포트와 연결해줍니다.
4) 끝.
cmd(window) / Terminal(mac) 명령어
※MAC과 Window의 크롬의 위치가 다르고 사용자 환경에 따라 다르니 직접 해당 경로로 이동하여 Google Chrome.exe가 있는지 확인 해야 합니다.
Mac은 /Applications/Google Chrome.app/Contents/MacOS/Google Chrome 가 Chrome의 기본 경로이다.
Termianl(Mac)
open -na "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --args --remote-debugging-port=9222 --user-data-dir="/Users/YourUsername/Chrome_debug_temp"
Window(cmd)
Window는 보통 C:\Program Files (x86)\Google\Chrome chrome.exe 가 Chrome의 기본 경로이다.
C:\Program Files (x86)\Google\Chrome chrome.exe --remote-debugging-port=9222 --user-data-dir="C:/Chrome_debug_temp"
위 명령어를 실행하면 9222포트에 크롬을 항시 실행시키는 명령어이다. Ctrl + C를 누르면 사용중인 크롬 프로세스를 종료할 수 있다.
9222포트 사용하기 Python코드
from selenium.webdriver.common.keys import Keys
from selenium import webdriver
from seleniuhttp://m.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from seleniuhttp://m.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service, options=chrome_options)
driver.get('https://naver.com')
driver.save_screenshot("screenshot.png")
위 코드를 실행하면 당연히 로그인 창과 Capcha가 실행될것이지만, 이후에는 팝업된 창을 종료하더라도 9222포트에 계속 실행중이므로 PC를 종료하지 않는한 로그인은 계속 유지되어 있습니다.
+ Debugging모드를 설정하면 별도의 쿠키정보를 할당하지 않아도 사용자 PC의 쿠키가 자동으로 전달되게 됩니다.
끝.