웹 자동화는 이제 현대 소프트웨어 개발 및 테스트에 없어서는 안 될 도구입니다. 이 포괄적인 Selenium Python 튜토리얼에서는 실제 시나리오를 처리할 수 있는 강력한 웹 자동화 프레임워크를 구축하는 방법을 배웁니다. Python에서 자동화된 테스트를 구현하거나 복잡한 웹 스크래핑 자동화 솔루션을 만드는 데 관심이 있는 경우 이 가이드는 업계에서 테스트된 접근 방식과 Selenium 모범 사례를 제공합니다.
웹 자동화는 최신 소프트웨어 개발, 테스트 및 데이터 수집에 필수적입니다. 해당 애플리케이션은 웹 애플리케이션의 엔드투엔드 테스트부터 양식 제출 또는 웹 스크래핑과 같은 반복적인 워크플로 단순화에 이르기까지 다양합니다. Selenium WebDriver Python 통합은 강력한 기능을 제공하지만 강력한 웹 자동화는 사용자 상호 작용을 모방하는 스크립트를 작성하는 것 이상입니다. 유지 관리 및 적응이 가능하며 대상 웹 애플리케이션의 변경 사항에 탄력적으로 대처할 수 있는 워크플로와 프레임워크를 설계하는 것입니다.
다음은 이 튜토리얼 전체에서 다룰 주요 측면입니다.
Selenium 모범 사례를 준수하면서 이러한 개념을 보여주기 위해 Books to Scrape를 데모 사이트로 사용하여 전자 상거래 웹사이트의 가격 추적기를 위한 웹 스크래핑 자동화 프로젝트를 구축할 것입니다.
이 튜토리얼을 진행하려면 다음이 필요합니다.
이 튜토리얼의 코드는 Github 저장소에서 확인할 수 있습니다. 따라하려면 자유롭게 복제하세요.
적절한 개발 환경을 설정하고 필요한 Python 패키지를 설치해 보겠습니다. 먼저 아래 명령을 실행하여 프로젝트 폴더와 새로운 가상 환경을 생성합니다.
mkdir price_tracker_automation && cd price_tracker_automation python3 -m venv env source env/bin/activate
그런 다음 다음 Python 패키지를 생성하여 요구사항.txt 파일에 추가하세요.
selenium==4.16.0 webdriver-manager==4.0.1 python-dotenv==1.0.0 requests==2.31.0
위 코드에서는 핵심 종속성을 정의했습니다. Selenium 패키지는 웹 자동화 프레임워크의 기반을 제공하는 반면 webdriver-manager는 브라우저 드라이버 관리를 자동으로 처리합니다. python-dotenv 패키지는 환경 구성용이고, 요청 패키지는 HTTP 요청 처리용입니다.
이제 아래 명령을 실행하여 요구사항.txt 파일에 있는 모든 Python 패키지를 설치하려면 아래 명령을 실행하세요.
pip install -r requirements.txt
마지막으로 프로젝트에 대해 다음 폴더 구조를 만듭니다.
mkdir price_tracker_automation && cd price_tracker_automation python3 -m venv env source env/bin/activate
여기서 우리는 소프트웨어 엔지니어링 모범 사례에 따라 모듈식 프로젝트 구조를 구축합니다. core 디렉토리에는 기본 자동화 구성 요소가 포함되어 있고 database는 데이터 지속성을 처리합니다.
생성된 프로젝트 환경, 종속성, 폴더 구조를 바탕으로 Selenium과 Python을 사용하여 가격 추적기 자동화 도구 구축을 진행해 보겠습니다.
브라우저 관리 시스템을 구현해 보겠습니다. 이는 안정적인 Selenium WebDriver Python 통합을 위한 중요한 구성 요소입니다. core/browser.py 파일에 아래 코드 조각을 추가하세요.
selenium==4.16.0 webdriver-manager==4.0.1 python-dotenv==1.0.0 requests==2.31.0
위 코드는 WebDriver 초기화 및 구성을 처리하는 BrowserManager 클래스를 생성합니다. 이 수업에서는 안정성과 성능을 위해 Chrome 옵션을 구성하여 Selenium 모범 사례를 구현합니다. 헤드리스 매개변수를 사용하면 브라우저 창을 표시하지 않고도 테스트를 실행할 수 있으며 이는 CI/CD 파이프라인에 매우 중요합니다.
이제 핵심 브라우저 관리 기능을 구현하려면 BrowserManager 클래스에 다음 메서드를 추가하세요.
pip install -r requirements.txt
위 코드에서 start_browser 메소드는 webdriver-manager를 활용하여 드라이버 설치 및 업데이트를 자동으로 처리하고 close_browser는 적절한 리소스 정리를 보장합니다. 구현에는 동적 페이지 로딩을 적절하게 처리하기 위한 암시적 대기 구성이 포함됩니다.
다음으로 요소 상호 작용 시스템을 구현해 보겠습니다. 이는 Selenium의 모범 사례를 따르면서 안정적인 방식으로 요소를 감지하고 상호 작용할 수 있게 해주기 때문에 모든 웹 자동화 프레임워크에서 중요합니다. core/element_handler.py에 코드 조각을 추가하세요
price_tracker_automation/ ├── core/ │ ├── browser.py | ├── scraper.py │ └── element_handler.py ├── database/ │ └── db_manager.py ├── notifications/ | └── price_alert.py ├── requirements.txt ├── run.py └── main.py
위 코드에서는 Selenium WebDriver Python 상호 작용 패턴을 캡슐화하는 ElementHandler 클래스를 만들었습니다. 이 클래스는 WebDriver 인스턴스와 구성 가능한 시간 초과 매개변수를 허용합니다.
핵심 요소 상호 작용 방법을 추가하려면 ElementHandler 클래스를 업데이트하세요.
from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.support import expected_conditions as EC import logging class BrowserManager: def __init__(self, headless=False): self.options = webdriver.ChromeOptions() if headless: self.options.add_argument('--headless') # Add additional stability options self.options.add_argument('--no-sandbox') self.options.add_argument('--disable-dev-shm-usage') self.options.add_argument('--disable-gpu') self.driver = None self.logger = logging.getLogger(__name__)
위 메서드는 Selenium의 WebDriverWait 및 Expect_conditions를 사용하여 요소를 감지하므로 요소가 비동기적으로 로드될 수 있는 동적 웹 페이지도 처리할 수 있습니다.
텍스트 추출 논리를 구현하는 다른 방법을 추가합니다.
def start_browser(self): """Initialize and return a ChromeDriver instance""" try: service = webdriver.ChromeService() self.driver = webdriver.Chrome(service=service, options=self.options) self.driver.implicitly_wait(10) return self.driver except Exception as e: self.logger.error(f"Failed to start browser: {str(e)}") raise def close_browser(self): """Safely close the browser""" if self.driver: self.driver.quit() self.driver = None
이 메소드에는 웹 자동화에서 흔히 발생하는 문제인 StaleElementReferenceException을 처리하기 위한 재시도 논리가 포함되어 있습니다.
이제 자동화된 테스트 Python 개념과 강력한 오류 처리 기능을 통합하여 주요 스크래핑 기능을 구축해 보겠습니다. core/scraper.py 파일에 아래 코드 조각을 추가하세요.
mkdir price_tracker_automation && cd price_tracker_automation python3 -m venv env source env/bin/activate
위 코드에서는 브라우저와 요소 처리 구성 요소를 통합하는 BookScraper 클래스를 만들었습니다. 이 클래스는 요소 로케이터를 중앙 집중화하고 스크래핑 작업을 위한 깔끔한 API를 제공함으로써 웹 자동화 프레임워크 설계의 핵심 개념인 페이지 개체 모델 패턴을 따릅니다.
다음으로 BookScraper 클래스를 업데이트하여 핵심 제품 데이터 추출 방법을 추가합니다.
selenium==4.16.0 webdriver-manager==4.0.1 python-dotenv==1.0.0 requests==2.31.0
위 방법은 구조화된 접근 방식을 사용하여 제품 정보를 수집하고 디버깅 및 모니터링을 위한 자세한 로그를 유지합니다.
스크랩된 데이터의 영구 저장을 처리하는 웹 자동화 프레임워크의 데이터베이스 계층을 구현해 보겠습니다. 이 구성요소를 사용하면 시간에 따른 가격 변화를 추적할 수 있습니다. 아래 코드 조각을 데이터베이스/db_manager.py에 추가하세요.
pip install -r requirements.txt
위 코드에서는 모든 데이터베이스 작업을 처리하는 DatabaseManager 클래스를 정의했습니다. 우리는 데이터베이스를 설정하고 구성할 필요가 없도록 단순성과 이식성을 위해 SQLite를 사용했으며, 많은 양의 데이터를 저장하지 않기 때문에 SQLite는 웹 스크래핑 자동화 프로젝트에도 이상적입니다.
다음으로, 데이터베이스/db_manager.py를 업데이트하여 데이터베이스 초기화 방법을 추가하세요.
price_tracker_automation/ ├── core/ │ ├── browser.py | ├── scraper.py │ └── element_handler.py ├── database/ │ └── db_manager.py ├── notifications/ | └── price_alert.py ├── requirements.txt ├── run.py └── main.py
여기에서는 SQL DDL 문을 사용하여 데이터베이스 스키마를 설정하고, 가격을 추적하고 저장한 데이터에 대한 기록 분석을 수행할 수 있는 적절한 관계와 제약 조건을 갖춘 제품 및 가격 기록에 대한 별도의 테이블을 만듭니다.
이제 데이터베이스에 데이터를 저장하는 또 다른 방법을 추가해 보겠습니다.
from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.support import expected_conditions as EC import logging class BrowserManager: def __init__(self, headless=False): self.options = webdriver.ChromeOptions() if headless: self.options.add_argument('--headless') # Add additional stability options self.options.add_argument('--no-sandbox') self.options.add_argument('--disable-dev-shm-usage') self.options.add_argument('--disable-gpu') self.driver = None self.logger = logging.getLogger(__name__)
위 코드에서는 SQL 삽입을 방지하기 위해 매개변수화된 쿼리를 사용하여 데이터 지속성 논리를 구현했습니다. 이 메소드는 SQLite의 ON CONFLICT 절을 사용하여 삽입 및 업데이트 작업을 모두 처리합니다.
Selenium WebDriver Python 구현의 모든 요소를 통합하여 모든 것을 기본 애플리케이션 클래스와 하나로 묶어 보겠습니다. 아래 코드 조각을 main.py 파일에 추가하세요.
def start_browser(self): """Initialize and return a ChromeDriver instance""" try: service = webdriver.ChromeService() self.driver = webdriver.Chrome(service=service, options=self.options) self.driver.implicitly_wait(10) return self.driver except Exception as e: self.logger.error(f"Failed to start browser: {str(e)}") raise def close_browser(self): """Safely close the browser""" if self.driver: self.driver.quit() self.driver = None
위 코드에서는 웹 스크래핑 자동화 솔루션의 모든 구성 요소를 조정하는 기본 PriceTracker 클래스를 생성합니다. PriceTracker 클래스는 모듈성과 테스트 가능성을 유지하기 위해 종속성 주입 패턴을 따릅니다.
다음으로 PriceTracker 클래스를 업데이트하여 핵심 추적 방법을 추가합니다.
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.common.exceptions import TimeoutException, StaleElementReferenceException class ElementHandler: def __init__(self, driver, timeout=10): self.driver = driver self.timeout = timeout
여기서 웹 스크래핑을 처리하고 스크래핑된 데이터를 저장하는 주요 제품 추적 로직을 구현했습니다.
자동화 스크립트를 실행하기 위한 실행 스크립트를 만들어 보겠습니다. run.py 파일에 다음 코드 조각을 추가하세요.
def wait_for_element(self, locator, timeout=None): """Wait for element with retry mechanism""" timeout = timeout or self.timeout try: element = WebDriverWait(self.driver, timeout).until( EC.presence_of_element_located(locator) ) return element except TimeoutException: raise TimeoutException(f"Element {locator} not found after {timeout} seconds") def get_text_safely(self, locator, timeout=None): """Safely get text from element with retry mechanism""" max_retries = 3 for attempt in range(max_retries): try: element = self.wait_for_element(locator, timeout) return element.text.strip() except StaleElementReferenceException: if attempt == max_retries - 1: raise continue
이제 터미널에서 다음 명령을 실행하여 스크립트를 실행하세요.
mkdir price_tracker_automation && cd price_tracker_automation python3 -m venv env source env/bin/activate
위 명령은 아래 스크린샷에 출력을 표시합니다.
위 스크립트에서 자동화 스크립트가 지정된 모든 URL에 대한 가격을 추적하고 있음을 알 수 있습니다.
현재 구현에서는 제품 가격만 추적하고 저장합니다. 가격을 추적한 후 사용자에게 가격 변동에 대해 알리도록 가격 추적기를 개선해 보겠습니다. 알림/price_alert.py 파일에 다음 코드 조각을 추가하세요.
selenium==4.16.0 webdriver-manager==4.0.1 python-dotenv==1.0.0 requests==2.31.0
위의 코드 조각에서는 필수 종속성이 있는 PriceAlertManager 클래스를 만들었습니다. 관리자는 데이터베이스 관리자 인스턴스를 매개변수로 사용하고 경보 작업 추적을 위한 로깅을 설정합니다. 이 클래스는 현재 가격과 이전 가격을 비교하기 위해 복잡한 조인을 사용합니다. 그런 다음 동적 가격 변동률 계산을 구현하고 가격 변동 정보에 대한 구조화된 사전을 만들었습니다.
다음으로 PriceAlertManager 클래스를 업데이트하여 이메일 알림 기능을 추가하세요.
pip install -r requirements.txt
여기에서는 Python의 이메일 및 SMTP 라이브러리를 사용하여 이메일 알림을 만들었습니다. 구현에서는 MIMEText 클래스를 사용하여 올바른 형식의 이메일 메시지를 생성합니다. 이메일 본문은 F-문자열을 사용하여 동적으로 생성되며, 정확한 통화 형식과 함께 자세한 가격 변동 정보가 통합되어 있습니다.
이제 가격 알림을 포함하도록 실행 스크립트를 수정해 보겠습니다.
price_tracker_automation/ ├── core/ │ ├── browser.py | ├── scraper.py │ └── element_handler.py ├── database/ │ └── db_manager.py ├── notifications/ | └── price_alert.py ├── requirements.txt ├── run.py └── main.py
이제 스크립트를 다시 실행하면 아래 스크린샷처럼 제품 가격을 추적하고 가격이 변경된 제품에 대해 알려줍니다.
매번 수동으로 실행할 필요 없이 cron 작업에서 이 스크립트를 실행하여 제품 가격을 추적하고 가격 변동에 대해 실시간으로 알림을 받을 수 있습니다.
예. 0 */6 * * * python run.py --urls
"http://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html"
"http://books.toscrape.com/catalogue/tipping-the-velvet_999/index.html"
"http://books.toscrape.com/catalogue/soumission_998/index.html"
이 튜토리얼 전체에서 Selenium과 Python을 사용하여 강력한 웹 자동화 도구를 구축하는 방법을 배웠습니다. 우리는 웹 자동화 기본 사항을 이해하는 것부터 시작한 다음 이 튜토리얼의 데모를 위해 구축한 Price Traker 도구에 대한 개발 환경을 설정했습니다. 그런 다음 제품 가격을 추적하고 사용자에게 가격 변동을 알리는 가격 추적기 애플리케이션을 구축했습니다. 이제 이러한 지식을 갖추었으므로 다음에 어떤 도구를 구축하시겠습니까? 댓글 섹션을 통해 알려주세요. 즐거운 코딩하세요!
위 내용은 Selenium과 Python을 사용하여 강력한 웹 자동화 구축의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!