반응형
안녕하세요! 오늘은 Python과 Selenium을 사용하여 Chrome 브라우저를 자동화하는 방법에 대해 알아보겠습니다. 이 방법은 웹 페이지 테스트, 데이터 스크래핑 등 다양한 목적으로 사용될 수 있습니다.
시작하기 전에
우선 필요한 라이브러리를 임포트합니다. subprocess
, os
, socket
는 시스템과 네트워크 상호작용을 위해, selenium
은 웹 브라우저의 자동화를 위해 사용됩니다.
import subprocess
import os
import socket
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import WebDriverException, TimeoutException
from selenium.webdriver.common.by import By
import configparser
주요 기능들
- 사용 가능한 포트 찾기:
find_free_port
함수는 사용 가능한 네트워크 포트를 찾아 반환합니다. 이는 Chrome을 디버깅 모드로 실행할 때 필요합니다. - Chrome 디버깅 모드 실행:
start_chrome
함수는 Chrome을 디버깅 모드로 실행합니다. 이렇게 실행된 Chrome은 Selenium을 통해 제어될 수 있습니다. - Chrome WebDriver 설정 및 연결:
setup_chrome_driver
함수는 Selenium WebDriver를 설정하고, Chrome에 연결합니다. - 설정 파일 로드:
load_config
함수는 Chrome 실행 파일과 드라이버 경로를config.ini
파일에서 읽어옵니다. 이렇게 하면 코드 수정 없이 설정을 변경할 수 있습니다.
자동화 프로세스
- 설정 파일에서 Chrome 경로와 드라이버를 로드합니다.
- 사용 가능한 포트를 찾고, 해당 포트에서 Chrome을 실행합니다.
- WebDriver를 설정하고, "https://www.naver.com"으로 이동합니다.
WebDriverWait
를 사용하여 페이지의 "body" 태그가 로드될 때까지 최대 10초간 대기합니다.
예외 처리 및 종료
페이지 로딩 시간이 초과되면 TimeoutException
을 통해 예외 처리를 하고, 작업 완료 후 WebDriver와 Chrome 프로세스를 안전하게 종료합니다.
마치며
이 방법을 통해 Python과 Selenium을 사용하여 웹 브라우저를 효율적으로 자동화할 수 있습니다. 설정 파일을 사용함으로써 코드의 유연성을 높일 수 있고, WebDriver의 대기 기능을 통해 로딩 시간을 최적화할 수 있습니다. 이것은 웹 테스트나 데이터 수집에 매우 유용할 것입니다.
이 글이 여러분의 프로젝트에 도움이 되길 바랍니다! 다음 포스팅에서 더 유용한 정보로 찾아뵙겠습니다. 😊👋
전체 코드
import subprocess
import os
import socket
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import WebDriverException, TimeoutException
from selenium.webdriver.common.by import By
import configparser
def find_free_port():
""" 사용 가능한 포트 찾기 """
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind(('', 0))
return s.getsockname()[1]
def start_chrome(chrome_path, port):
""" Chrome을 디버깅 모드로 실행 """
try:
chrome_command = [chrome_path, f'--remote-debugging-port={port}']
return subprocess.Popen(chrome_command)
except subprocess.SubprocessError as e:
print(f"Chrome 실행 에러: {e}")
return None
def setup_chrome_driver(chrome_driver_path, port):
""" Chrome WebDriver 설정 및 연결 """
try:
chrome_options = Options()
chrome_options.add_experimental_option("debuggerAddress", f"localhost:{port}")
return webdriver.Chrome(executable_path=chrome_driver_path, options=chrome_options)
except WebDriverException as e:
print(f"WebDriver 설정 에러: {e}")
return None
def load_config():
""" 설정 파일 로드 """
config = configparser.ConfigParser()
#해당 설정 파일에 Chrome 과 webdriver 경로를 포함돼 있음.
config.read(r'C:\Users\user2401\chrome_config\config.ini')
return config['chrome']['path'], config['chrome']['driver_path']
# 설정 파일에서 Chrome 실행 파일 및 드라이버 경로 로드
chrome_path, chrome_driver_path = load_config()
# 사용 가능한 포트 찾기
debugging_port = find_free_port()
# Chrome 실행 및 WebDriver 설정
chrome_process = start_chrome(chrome_path, debugging_port)
driver = setup_chrome_driver(chrome_driver_path, debugging_port)
try:
driver.get("https://www.naver.com")
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.TAG_NAME, "body")))
print("접속완료")
except TimeoutException:
print("페이지 로딩 시간 초과")
# 사용 후 정리
if driver:
driver.quit()
if chrome_process:
chrome_process.terminate()
메모장을 사용하여 config.ini
파일을 생성하고 설정하는 방법
- 메모장 열기: 필요한 설정 정보를 입력하기 위해 Windows 메모장을 엽니다.
- 내용 입력: 메모장에 Chrome 실행 파일 및 드라이버 경로를 기입합니다.
- 파일 저장: '모든 파일' 형식으로
config.ini
라는 이름으로 저장합니다..txt
가 아닌.ini
확장자를 사용해야 합니다. - 적절한 위치에 저장: Python 스크립트와 같은 디렉토리에 저장하여 스크립트가 파일을 쉽게 찾을 수 있도록 합니다.
이 파일은 Python 스크립트에서 load_config
함수로 읽을 수 있습니다.
반응형
댓글