Mac OS에서 Selenium 속도 느릴 때

반응형

애플 실리콘 mac을 사용하고 있고, VSCode 및 Cursor ai IDE를 활용하여 개발을 하고 있는 상황. 크롬 드라이버로 실행된 브라우저는 속도가 너무 느려서 뭐가 문제인지 찾아보니 다음과 같은 원인을 발견할 수 있었습니다.

 

 

 

번역에 의한 느려짐

1. 애플 실리콘(ARM) vs 인텔(x86)

  • 애플 실리콘 (M1, M2, M3...): Apple이 자체 설계한 ARM 아키텍처 기반의 칩입니다. 네이티브(Native) 앱들은 이 칩에 최적화되어 매우 빠른 속도로 동작합니다.
  • 인텔 (x86_64): 과거 Mac에 탑재되었던 CPU 아키텍처입니다.

2. 인텔 맥과 실리콘 맥의 번역기, 로제타 2

애플 실리콘 Mac이 출시되면서, 기존 인텔 Mac용으로 만들어진 프로그램(x86)들을 애플 실리콘 Mac(ARM)에서도 실행할 수 있도록 Apple이 만든 번역기(에뮬레이터)입니다. Rosetta 2는 x86 명령어를 실시간으로 ARM 명령어로 번역해주기 때문에 구형 프로그램도 실행할 수 있지만, 이 과정에서 성능 저하가 발생합니다.

3. 문제의 핵심: "번역의 연쇄 작용"

IDE/터미널(x86) → Python(x86) → ChromeDriver(x86)

  • 만약 VScode나 Cursor, iTerm2 같은 개발 도구(부모 프로세스)가 Rosetta 2를 통해 x86 버전으로 실행되면,
  • 그 개발 도구에서 실행하는 Python 인터프리터(자식 프로세스) 역시 x86 모드로 실행될 가능성이 높습니다.
  • 그리고 그 Python 스크립트가 실행하는 ChromeDriver(손자 프로세스) 마저도 x86 버전을 찾아 실행하게 됩니다.

결과적으로, 모든 과정이 실시간 번역을 거치게 되면서 댓글에서 언급한 것처럼 4배에서 10배까지 엄청난 속도 저하가 발생하는 것입니다. 심지어 ChromeDriver와 Chrome 브라우저를 최신 애플 실리콘 버전(mac-arm64)으로 잘 설치했더라도, 실행 주체인 Python이나 IDE가 x86 모드이면 아무 소용이 없습니다.


번역 할 필요 없이 언어를 통일하면 해결되는 문제입니다

그렇기에 우리는 전체 자동화 과정 (IDE → Python → ChromeDriver)이 모두 애플 실리콘 네이티브(ARM64)로 실행되도록 환경을 맞춰야 합니다.

1단계: 모든 구성 요소를 네이티브(ARM64)로 전환하기

  • 터미널을 열고 다음 명령어를 실행하여 현재 Python의 아키텍처를 확인하세요.
    python -c "import platform; print(platform.machine())"
    • arm64 가 출력되면 정상입니다.
    • x86_64 가 출력되면 Intel 버전이므로, 네이티브 버전으로 재설치해야 합니다.
  • ARM64 버전 Python 설치
    • Homebrew 사용 (권장): 애플 실리콘 Mac의 Homebrew는 기본적으로 ARM64용 패키지를 설치합니다.
      brew install python
      1. Homebrew 설치하지 않았다면?
        터미널에 아래 명령어를 붙여넣어 설치합니다. 애플 실리콘 Mac에서는 자동으로 ARM64 버전으로 /opt/homebrew 경로에 설치됩니다.Generated bash
        /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
        설치 과정 마지막에 ~/.zshrc 파일에 경로를 추가하라는 안내가 나오면 그대로 따라 하시면 됩니다.
      2. Homebrew로 Python 설치
        brew install python
        Homebrew는 최신 안정 버전의 Python을 설치하고, /opt/homebrew/bin에 심볼릭 링크를 만들어 경로 문제를 자동으로 해결해줍니다.
      3. 확인
        마찬가지로 IDE를 재시작한 후 터미널에서 확인합니다.
        # Homebrew로 설치 시 python3의 위치
        which python3 
        # 예상 결과: /opt/homebrew/bin/python3
        
        # 아키텍처 확인
        python3 -c "import platform; print(platform.machine())"
        # 예상 결과: arm64

Python과 IDE가 모두 네이티브(ARM64)라면, 이제 ChromeDriver를 확실하게 맞춰줘야 합니다.

  1. 현재 사용 중인 Chrome 브라우저의 버전을 확인합니다. (Chrome 주소창에 chrome://version 입력)
  2. Chrome for Testing 대시보드로 이동합니다. 이곳에서 버전에 맞는 드라이버를 가장 확실하게 받을 수 있습니다.
  3. 자신의 Chrome 버전에 맞는 Stable 또는 원하는 버전 섹션에서 chromedriver 를 찾습니다.
  4. URL 목록에서 chromedriver-mac-arm64.zip 을 다운로드합니다. (...mac-x64.zip이 아닙니다!)
  5. 다운로드한 chromedriver 실행 파일의 압축을 풀고, 프로젝트 내의 특정 경로에 두거나 시스템 경로에 추가합니다.

2단계: Selenium 코드에서 네이티브 드라이버 경로 지정하기

webdriver-manager 같은 라이브러리가 자동으로 잘못된 버전을 받을 수도 있으니, 수동으로 다운로드한 드라이버의 경로를 명시해주는 것이 가장 확실합니다.

from selenium import webdriver
from selenium.webdriver.chrome.service import Service

# 1. 위에서 다운로드한 arm64용 chromedriver의 절대 경로를 지정합니다.
# 예시: '/Users/your_name/project/drivers/chromedriver-mac-arm64/chromedriver'
CHROME_DRIVER_PATH = '/path/to/your/downloaded/chromedriver-mac-arm64/chromedriver'

# 2. Service 객체를 통해 드라이버 경로를 명시적으로 전달합니다.
service = Service(executable_path=CHROME_DRIVER_PATH)
options = webdriver.ChromeOptions()
# 필요한 옵션 추가
# options.add_argument(...) 

# 3. 드라이버를 실행합니다.
driver = webdriver.Chrome(service=service, options=options)

# 이제부터 네이티브 속도로 자동화가 실행됩니다.
driver.get("https://www.google.com")

print("드라이버 실행 완료!")

# ... (자동화 코드) ...

driver.quit()

요약 및 최종 체크리스트

  1. Python: 터미널에서 python -c "import platform; print(platform.machine())" 실행 시 arm64 가 나오는지 확인. (아니라면 재설치)
  2. ChromeDriver: Chrome for Testing 대시보드에서 chromedriver-mac-arm64.zip 을 다운로드했는지 확인.
  3. Selenium 코드: Service 객체를 사용하여 다운로드한 드라이버의 경로를 직접 지정.
반응형