AiPE

[SecretMode GUI] 3. Selenium으로 Chrome 시크릿모드 특정 탭 열기 본문

[XiBBaL] Development Project/SecretMode GUI

[SecretMode GUI] 3. Selenium으로 Chrome 시크릿모드 특정 탭 열기

Oshimaker XiBBaL 2022. 12. 10. 17:44
반응형

SecretMode GUI의 이름은 직관적이다.

등록한 특정 사이트를 Chrome의 시크릿모드로 열어주니 "SecretMode"이고 나중에 GUI(Graphic User Interface)로 만들거라 "GUI"이다. 물론 일단은 시크릿모드로 특정 사이트를 열어주는 기능부터 만들어야 한다.

 

Google Chrome을 내 마음대로 조정하기 위해서는 Selenium과 ChromeDriver가 필요하다.

Selenium은 크롬 등 웹브라우저를 크롤링하는데 자주 쓰이는 파이썬 라이브러리이고 ChromeDriver는 크롬을 프로그래밍 언어를 이용해 조정하기 위해 필요한 툴이며, 구글에서 버전별로 직접 제공해주고 있었다.

 

 

급한 사람들을 위해 먼저 설명하자면 이 글 안에는
 1. chrome webdriver 자동 업데이트 방법
 2. selenium 통해 chrome 시크릿모드로 켜는법
 3. chromedriver maximized와 fullscreen차이점
 4. selenium 창꺼짐 오류 해결법
 5. Anaconda없이 Jupyter Notebook쓰는 방법 (외부링크, 다른 사람의 포스팅)
 6. selenium사용시 사용자프로필 위조 하는 방법

 7. 최종 전체 코드
 
 가 순서대로 포함되어 있다.

 

 

 

1. Selenium

Selenium은 파이썬 pip에서 직접 설치할 수 있다. 참고로 파이썬 처음 배울때 납득이 안됐던 건데, pip 관련 명령어는 윈도우의 CMD에서 치는거다.

 

pip install selenium

 

 

 

2. Chrome Driver

chromedriver는 https://chromedriver.chromium.org/downloads 에서 직접 다운로드 할 수 있다. 단, 사용하고 있는 chrome의 버전과 다운받을 chromedriver의 버전이 완벽히 일치해야 정상작동하는데, 이게 문제다.

 

 개발은 하루아침에 하는게 아니라 그 사이에 쓰는 chrome의 버전이 바뀔 수도 있는데, 그럴 때마다 chromedriver를 다시 다운해줘야한다. 심지어 당시 내 chrome 버전을 확인해봤는데 저 사이트에서 맞는 버전의 chromedriver를 제공하지도 않았다. 모든 버전에 대해 chromedriver가 제공되는 것은 아닌 듯 하다.

 (그래서 그냥 제일 가까운 버전의 chromedriver를 다운해서 사용해봤는데 오류가 있었다. 딱 알맞는 버전을 사용하자.)

 

 정말 다행이도 이를 자동으로 해주는 Python라이브러리가 존재했다. 이름은 webdriver-manager.

 

pip install webdriver-manager

 

이를 이용해 chromedriver를 자동으로 업데이트 하는 코드를 짜보았다. 그냥 import만 해도 알아서 알맞는 버전의 chromedriver를 로드해주더라. Chrome Beta도 깔려있었는데 이는 무시하고 정식 버전의 chrome에 대한 chromedriver만을 로드했다. 이게 없었으면 골아플 뻔했다. 감사.

 

# 크롬 드라이버 자동 업데이트
from webdriver_manager.chrome import ChromeDriverManager

 

 

 

3. 뼈대 코드 작성

이제 selenium과 chromedriver를 이용해 chrome 탭을 열어보자.

 1) 탭은 시크릿모드로 연다.

 2) 탭을 한 창에 여러개 열어서 각각의 주소로 접속한다.

 3) 사용자가 탭을 여러개 요청한 경우 최종적으로는 첫 번째 탭을 보여준다.

 

def OpenAll():
    from selenium import webdriver
    from selenium.webdriver.chrome.service import Service
    from selenium.webdriver.chrome.options import Options

    # 크롬 드라이버 자동 업데이트
    from webdriver_manager.chrome import ChromeDriverManager
    
    
    # 브라우저 기타 설정
    chrome_options.add_argument('incognito')
    chrome_options.add_argument('--start-maximized')
    
    
        #브라우저 실행 및 탭 추가
    driver.execute_script('window.open("about:blank", "_blank");')
    driver.execute_script('window.open("about:blank", "_blank");')
 
    tabs = driver.window_handles
 
    # TAB_1
    driver.switch_to.window(tabs[0])
    driver.get('웹주소1')
 
    # TAB_2
    driver.switch_to.window(tabs[1])
    driver.get('웹주소2')
 
    # TAB_3
    driver.switch_to.window(tabs[2])
    driver.get('웹주소3')

    driver.switch_to.window(driver.window_handles[0])

 

나중에 이 함수(def)를 실행하는 식으로 코드를 짤거라 OpenAll() 이라는 함수 안에 코드를 작성했다. 그래도 간단하게 코드 설명을 하고 넘어가자.

 

 1) 7행까지는 필요한 라이브러리를 불러온다. 아까 언급한 selenium과 webdriver-manager가 포함된다.

 

 2) chrome_options.add_argument() 에서는 chrome탭에 대한 설정을 한다. 'incognito'는 시크릿모드를 의미하며 '--start-maximized'는 화면을 모니터 가득 (일반적으로 1920x1080) 표시하는 것을 의미한다. 저기에 fullscreen이 들어가는 경우는 우리가 chrome에서 F11키를 눌렀을 때처럼 작업표시줄과 url주소 창까지 없어지는 [전체 화면]모드로 실행된다. 밑의 사진을 보자.

maximized모드로 실행시킨 경우
fullscreen모드로 실행시킨 경우

 

  3) 이후는 앞에서 한 설정대로 브라우저를 실행시킨 뒤 각 Tab에 url을 부여해 접속하는 코드이다. driver.switch_to.window()명령어를 사용해 탭을 전환하며 driver.get('url')을 이용해 ''안의 문자열에 해당하는 주소로 접속한다.

 

  4) 마지막 한 줄은 처음 실행한 첫번째 탭(=tab[0])을 최종적으로 사용자 화면에 표시하는 코드이다. 지금 단계에서는 크게 의미가 없지만 나중에 사용자가 각 tab의 순서를 설정할 수 있게 만드려고 일부러 추가했다.

 

 

 

4. 트러블 슈팅

저대로 실행하니 탭이 열리기는 한다. 시크릿모드/maximized크기로 잘 열리고, 3개의 탭이 모두 열리긴 하는데.. 동작이 끝나고 한 3초 뒤에 탭이 모두 꺼져버린다.

 

솔직히 무슨 문제인지 잘 모르겠어서 (코드에는 문제가 없다고 생각해서) 구글링을 열심히 했다. "selenium 창 닫힘"을 치니 동종 오류가 많이 보고되어 있었다. 나는 코드 편집기로 VS Code를 이용하는데, 얘가 문제였다. 사람들이 Jupyter Notebook으로 실행하니 잘 된다고 하길래 나도 Jupyter Notebook으로 실행하니 창이 닫히는 오류는 없어졌다.

 

이렇게 간단하게 써두니 내가 이걸 되게 쉽게 발견한 것 같지만 해결법을 찾는데 상당히 오래걸렸다. 앞으로 코드의 실제 실행 검증 과정에서는 Jupyter Notebook을 적극 이용해야겠다.

 

여담이지만, Jupyter Notebook을 쓰는게 처음이라 설치법을 여기저기에 검색해보니 아나콘다 설치가 뭐 필수인것 처럼 이야기한 사람들이 많았다. 없어도 잘 된다. 아래 블로그를 많이 참고했다. 감사합니다.

https://m.blog.naver.com/i_am_sangyun/222182455430

 

추가로, 브라우저의 꺼짐을 방지한다고 소개된 코드를 한두 줄 추가했는데, 저게 무슨 기능을 하는지는 잘 모르겠다.. 

 

 

 

5. 코드 정리

이제 코드를 좀 정제하고 마무리짓자. 결국  def OpenAll(): 아래에 들어갈 코드는 다음과 같다.

 

def OpenAll():
    from selenium import webdriver
    from selenium.webdriver.chrome.service import Service
    from selenium.webdriver.chrome.options import Options

    # 크롬 드라이버 자동 업데이트
    from webdriver_manager.chrome import ChromeDriverManager

    # 브라우저 꺼짐 방지 (사실 무슨 역할인지 잘 모른다. 누가 이렇게 해결했다길래 넣었다. Jupyter Notebook을 쓰면 필요 없는 코드인 것 같긴 하다)
    chrome_options = Options()
    chrome_options.add_experimental_option("detach", True)


    # 브라우저 기타 설정
    chrome_options.add_argument('incognito')
    chrome_options.add_argument('--start-maximized')


    # 불필요한 에러 로깅 끄기
    chrome_options.add_experimental_option("excludeSwitches", ["enable-logging"])
    service = Service(executable_path=ChromeDriverManager().install())
    driver = webdriver.Chrome(service=service, options=chrome_options)


    # 자동화기계 방지 뚫기+프로필위조 (가끔 selenium을 자동화기계로 오인해서 차단하는 사이트들이 있다는데.. (사실 오인이 아니다) 이를 방지하기 위해 프로필을 위조한다.)
    chrome_options.add_argument("disable-gpu")   # GPU가속 끄기
    chrome_options.add_argument("lang=ko_KR")    # 가짜 플러그인 탑재
    chrome_options.add_argument('user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36')  # user-agent 위조
    chrome_options.add_experimental_option('excludeSwitches', ['enable-automation']) #자동화된 소프트웨어 제어 문구 삭제


    #브라우저 실행 및 탭 추가
    driver.execute_script('window.open("about:blank", "_blank");')
    driver.execute_script('window.open("about:blank", "_blank");')
 
    tabs = driver.window_handles
 
    # TAB_1
    driver.switch_to.window(tabs[0])
    driver.get('웹주소1')
 
    # TAB_2
    driver.switch_to.window(tabs[1])
    driver.get('웹주소2')
 
    # TAB_3
    driver.switch_to.window(tabs[2])
    driver.get('웹주소3')

    driver.switch_to.window(driver.window_handles[0])

 

코드 설명은 #주석으로 달아놓았다. 기본적인 틀은 아까 3번에서 설명한 것과 다르지 않다. 

 

 

이 이후에는

 1) GUI버전으로 만들어서 잘 동작하는지 확인하고

 2) "웹주소" 부분에 input()을 이용해 사용자가 웹사이트 주소를 직접 지정할 수 있도록 만들 것이다.

 3) 2)의 기능 또한 GUI로 만든 후 사용자가 Tab의 개수 또한 조절할 수 있게 제작한다. Tab을 각각 실행시킬 수도 있어야 한다.

 4) 전체적으로 실행속도가 좀 느린거같으니 코드를 좀 손봐야겠다.

 

이정도로 작업하려고 계획하고 있다. 완성하면 GitHub에 실행파일(.exe)로 만들어 배포할 예정이다. 여기다는 올리면 잡혀갈까봐 못올리겠다.

 

한 포스팅에 너무 많은 글자 (사실 큰 코드블럭을 넣으면서)를 넣으니 백스페이스가 눌리는 게 반응이 늦다. 그만써야겠다.

반응형