Ubuntu 또는 Debian에서 Chrome 및 Selenium을 설정하고 실행합니다. 본 가이드는 우분투 22.04를 기준으로 작성되었습니다
Selenium은 웹 작업 자동화에 적합하지만 서버에서 봇을 연중무휴로 실행하는 것은 까다로울 수 있습니다. systemd를 사용하면 Selenium 봇을 백그라운드 서비스(데몬)로 실행하여 안정적으로 실행되고 실패 시 다시 시작되도록 할 수 있습니다. 이 가이드는 Linux VPS용 구성에 중점을 두고 설정 단계를 안내합니다.
Google 크롬 설치
가상환경 설정
필요한 패키지 설치
Python 스크립트 생성
systemd 서비스 설정
블록 버퍼링 문제 해결
journalctl을 사용하여 로그에 액세스
참고자료
먼저 모든 패키지를 업데이트합니다.
sudo apt update
안정적인 Google Chrome 패키지를 다운로드하세요.
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
Google 크롬을 설치하세요.
sudo apt install -y ./google-chrome-stable_current_amd64.deb
설치된 구글 크롬 버전을 확인하세요.
google-chrome --version
컴퓨터에서 Selenium 봇만 실행하는 경우에는 이 단계가 필수가 아닙니다. 하지만 다른 프로젝트를 진행 중이거나 격리된 환경이 필요한 경우에는 권장됩니다.
가상 환경을 만들어 보겠습니다.
python3 -m venv venv
가상환경을 활성화하세요.
source venv/bin/activate
이제 Selenium과 webdriver-manager를 설치합니다.
pip install selenium pip install webdriver-manager
webdriver-manger의 목적은 다양한 브라우저의 바이너리 드라이버 관리를 단순화하는 것입니다. 해당 문서에서 이에 대해 자세히 알아볼 수 있습니다.
## main.py from selenium import webdriver ## ---- Use for type hint ---- ## from selenium.webdriver.chrome.webdriver import WebDriver ## --------------------------- ## from selenium.webdriver.chrome.service import Service from selenium.webdriver.chrome.options import Options from webdriver_manager.chrome import ChromeDriverManager def create_chrome_web_driver_connection(headless: bool, detach:bool, use_sandbox: bool, use_dev_shm: bool, window_width: int = 1052, window_height: int = 825 ) -> WebDriver: service = Service(ChromeDriverManager().install()) options = Options() options.add_experimental_option("detach", detach) options.add_argument(f"--window-size={window_width},{window_height}") options.add_argument("--disable-extensions") options.add_argument("--disable-renderer-backgrounding") options.page_load_strategy = 'normal' if not use_sandbox: options.add_argument('--no-sandbox') if not use_dev_shm: options.add_argument('--disable-dev-shm-usage') if headless: options.add_argument("--headless=new") driver = webdriver.Chrome(service= service, options=options) return driver if "__main__" == __name__: driver = create_chrome_web_driver_connection(headless= True, detach= False, use_sandbox= False, use_dev_shm= False) driver.get('https://python.org') print(driver.title) driver.close()
options.add_experimental_option("detach", detach) :
options.add_argument(f"--window-size={window_width},{window_height}") :
원하시면 이 줄을 제거하실 수 있습니다.
헤드리스 모드에서 Selenium을 실행하려는 경우 창 크기를 이 방법으로 설정해야 합니다. 그렇지 않으면 내 경험상 기본 창 크기가 너무 작을 수 있습니다.driver.get_window_size() 명령으로 창 크기를 확인할 수 있습니다
options.add_argument("--disable-extensions") :
options.add_argument("--disable-renderer-Backgrounding") :
options.page_load_strategy = '정상' :
options.add_argument('--no-sandbox') :
options.add_argument('--disable-dev-shm-usage') :
options.add_argument("--headless=new") :
셀레늄 프로그램이 환경 변수를 사용해야 하는 경우 이를 달성할 수 있는 두 가지 방법이 있습니다.
python-dotenv와 같은 라이브러리와 함께 .env 파일 사용(가장 일반적이고 대중적인 방법).
systemd의 내장 옵션을 사용하여 환경 파일 설정
이 예에서는 두 번째 옵션을 사용하겠습니다.
먼저 /etc 디렉토리 안에 conf.d 디렉토리를 생성해 보겠습니다.
sudo apt update
다음으로 일반 텍스트 파일을 만듭니다(이것이 환경 파일이 됩니다).
sudo apt update
이제 방금 생성한 파일에 환경 변수를 추가할 수 있습니다.
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
환경 변수를 사용하도록 Python 스크립트를 수정하세요.
sudo apt install -y ./google-chrome-stable_current_amd64.deb
이 /etc/systemd/system/ 디렉터리 내에 서비스 파일을 생성해야 합니다. 여기에는 시스템 관리자가 설치한 시스템 장치가 배치되어야 합니다.
google-chrome --version
이 예에서는 귀하가 VPS에 있고 루트 사용자로 서비스를 실행하려고 한다고 가정합니다.
[!경고]
서비스는 루트(관리자) 권한으로 실행됩니다. 이렇게 하면 시스템에 대한 전체 액세스 권한이 부여되지만 보안상의 이유로 필요한 경우가 아니면 루트로 실행하는 것은 일반적으로 피됩니다.
서비스 파일에 추가하세요.
python3 -m venv venv
이 섹션에서는 서비스에 대한 메타데이터와 종속성을 정의합니다.
Description=Selenium Bot Service : 서비스가 수행하는 작업에 대한 간단한 설명을 제공합니다. 이 경우에는 "Selenium Bot Service"라고 설명합니다. 이 설명은 시스템 로그 및 systemctl에서 서비스를 식별하는 데 사용됩니다.
After=network.target: 네트워크를 사용할 수 있게 된 후에만 서비스가 시작되도록 합니다. network.target은 기본 네트워킹 기능이 작동 중임을 나타내는 systemd 대상입니다.
이 섹션에서는 서비스 실행 방법, 실행하는 사용자, 실패할 경우 수행할 작업 등 서비스 자체의 구성을 지정합니다.
사용자 : 서비스를 실행할 사용자를 지정합니다. 여기서는 루트로 설정되어 있습니다.
EnvironmentFile : 서비스에서 사용하는 환경변수가 포함된 파일을 지정합니다.
WorkingDirectory: 서비스가 실행될 디렉터리를 지정합니다. 이는 서비스 프로세스의 작업 디렉터리입니다. 여기서 봇 파일은 /root/selenium_bot/
에 저장됩니다.ExecStart : 서비스를 시작하는 명령을 정의합니다. 여기서는 /root/selenium_bot/
에 있는 main.py 파일을 실행합니다.Restart=on-failure : 서비스가 실패(예: 0이 아닌 종료 상태)로 종료되는 경우 자동으로 다시 시작하도록 구성합니다. 이는 가끔 오류가 발생하더라도 봇 서비스가 계속 실행되도록 하는 데 유용합니다.
RestartSec=5s : 실패 시 재시작 간의 지연 시간을 지정합니다. 이 경우 서비스는 실패 후 다시 시작을 시도하기 전에 5초 동안 대기합니다.
StandardOutput=journal : 서비스의 표준 출력(stdout)을 저널ctl을 사용하여 볼 수 있는 시스템 저널로 리디렉션합니다. 이는 로깅 및 디버깅 목적에 유용합니다.
StandardError=journal : 표준 오류(stderr) 출력을 시스템 저널로 리디렉션합니다. 서비스에서 발생한 모든 오류는 기록되며 Journalctl을 사용하여 볼 수도 있습니다
이 섹션에서는 서비스를 활성화하거나 시작하는 방법과 시기를 정의합니다.
WantedBy=multi-user.target : 서비스를 활성화해야 하는 대상을 지정합니다. 이 경우 multi-user.target은 시스템이 비그래픽 다중 사용자 모드(서버에서 일반적)일 때 도달하는 systemd 대상입니다. 이는 시스템이 이 대상에 도달하면 일반적으로 시스템이 다중 사용자 환경으로 부팅될 때 서비스가 시작된다는 것을 의미합니다.
시스템 서비스에 가능한 모든 설정에 대해 자세히 알아보려면 참조를 확인하세요
서비스 파일이 유효한지 확인해 보겠습니다. 모든 것이 정상이면 아무것도 표시되지 않습니다.
sudo apt update
시스템 구성을 다시 로드하여 새롭거나 수정된 장치(서비스)를 찾습니다.
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
서비스를 시작/다시 시작하세요.
sudo apt install -y ./google-chrome-stable_current_amd64.deb
서비스를 중지하세요.
google-chrome --version
서비스 상태를 확인하세요.
python3 -m venv venv
부팅 시 서비스가 자동으로 시작되도록 하려면 이 작업을 수행하세요.
source venv/bin/activate
Python의 대화형 환경에서 스크립트를 실행할 때(예: 터미널에서 python3 filename.py를 수동으로 실행하는 경우) Python은 라인 버퍼링을 사용합니다. 이는 print() 문의 출력과 같은 출력이 즉시 표시된다는 의미입니다.
그러나 Python 프로그램이 비대화형 환경에서 실행되는 경우(이 경우) 출력은 블록 버퍼링을 사용합니다. 이는 버퍼가 가득 차거나 프로그램이 종료될 때까지 프로그램이 출력을 버퍼에 보관하여 로그/출력을 볼 수 있을 때까지 지연된다는 것을 의미합니다.
여기에서 Python의 출력 버퍼링 작동 방식에 대해 자세히 알아볼 수 있습니다.
로그와 출력을 실시간으로 확인하고 싶기 때문에 두 가지 방법으로 이 문제를 해결할 수 있습니다.
python3 문서에 이에 대한 내용이 나와 있습니다.
-u stdout 및 stderr 스트림을 강제로 버퍼링 해제합니다. 이 옵션은 stdin 스트림에 영향을 미치지 않습니다
-u 플래그를 사용하면 Python은 stdout 및 stderr 모두에 대해 완전히 버퍼링되지 않은 모드에서 작동합니다. 이는 각 바이트가 생성되자마자 터미널(또는 로그 파일과 같은 출력 스트림)로 직접 전송된다는 것을 의미합니다. 버퍼링이 전혀 발생하지 않습니다.
일반적으로 stdout으로 이동하는 모든 문자(예: print() 문 또는 오류)는 전체 라인이나 버퍼가 누적될 때까지 기다리지 않고 바이트 단위로 즉시 기록됩니다.
이 옵션을 사용하려면 다음과 같이 스크립트를 실행하세요.
sudo apt update
이 옵션을 선택하는 경우 서비스 파일 내에서 ExecStart를 수정해야 합니다.
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
Python에서 print() 함수는 기본적으로 출력을 버퍼링합니다. 즉, 출력을 메모리에 저장하고 버퍼가 가득 차거나 프로그램이 종료될 때만 출력합니다. 플러시=True를 사용하면 Python이 print() 호출 직후 출력을 플러시하도록 강제하여 출력이 즉시 표시되도록 할 수 있습니다.
sudo apt install -y ./google-chrome-stable_current_amd64.deb
시스템 장치(서비스)의 전체 로그 기록을 보려면 다음 명령을 사용하세요.
google-chrome --version
로그를 실시간으로 모니터링하려면 -f 플래그를 사용하세요. 이렇게 하면 가장 최근의 저널 항목만 표시되며 저널에 추가되는 새 항목이 계속해서 인쇄됩니다.
python3 -m venv venv
위 내용은 systemd를 사용하여 Selenium을 Linux 데몬으로 설정하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!