웹 크롤링이나 단순 반복적인 사이트 입력 업무를 자동화할 때, 오랜 시간 Selenium(셀레니움) 이 표준처럼 사용되어 왔습니다.

다만 브라우저 버전이 업데이트될 때마다 chromedriver가 충돌하거나, 동적 페이지 로딩 대기(time.sleep) 때문에 스크립트가 불안정해지는 문제가 자주 생깁니다.

Python Playwright(플레이라이트) 는 Microsoft가 개발한 웹 자동화 프레임워크로, 자동 대기와 브라우저 컨텍스트 분리 기능이 강점입니다. 본문에서는 Playwright의 기본 흐름과 엑셀 저장 예제를 정리합니다.


1. Playwright를 검토할 만한 이유

비교 항목구형 Selenium현대적 Playwright
브라우저 드라이버 관리버전별 별도 다운로드 및 PATH 설정 필수별도 드라이버 불필요 (playwright install 한 번으로 끝)
동적 페이지 로딩 대기WebDriverWait 등 복잡한 대기 로직 작성Auto-waiting 내장 (버튼이 클릭 가능해질 때까지 자동 대기)
병렬 처리설정에 따라 복잡해질 수 있음브라우저 컨텍스트 분리로 병렬 작업 구성 가능
테스트 자동화오래된 자료와 예제가 많음최신 웹앱 테스트와 자동화 흐름에 맞춘 API 제공

2. 1분 만에 끝나는 Playwright 설치 및 환경 설정

파이썬 환경이 있다면 라이브러리와 브라우저 엔진(Chromium, Firefox, WebKit)을 설치해 사용할 수 있습니다.

# 1. 라이브러리 설치
pip install pytest-playwright pandas openpyxl
 
# 2. 전용 브라우저 엔진 다운로드 (최초 1회 필수 실행)
playwright install

3. 실전 예제: 동적 스크롤 웹페이지 크롤링 & 엑셀 자동 저장

아래는 공개적으로 접근 가능한 페이지에서 필요한 텍스트를 추출해 엑셀(.xlsx) 파일로 저장하는 기본 흐름 예시입니다. 실제 서비스에 적용할 때는 해당 사이트의 약관, robots.txt, 요청 빈도 제한, 개인정보 처리 기준을 확인해야 합니다.

import asyncio
from playwright.async_api import async_playwright
import pandas as pd
 
async def crawl_news_to_excel(keyword: str):
    async with async_playwright() as p:
        # headless=False로 설정하면 브라우저가 실제로 움직이는 모습을 볼 수 있습니다!
        browser = await p.chromium.launch(headless=True)
        
        # 필요한 경우 뷰포트, 언어 등 정상적인 테스트 환경을 명시합니다.
        context = await browser.new_context(
            viewport={"width": 1280, "height": 720},
            locale="ko-KR",
        )
        page = await context.new_page()
 
        print(f"🚀 '{keyword}' 키워드 뉴스 자동 크롤링 시작...")
        # 1. 페이지 접속 (네이버 뉴스 검색)
        url = f"https://search.naver.com/search.naver?where=news&query={keyword}"
        await page.goto(url)
 
        # 2. 동적 로딩이 완료될 때까지 뉴스 리스트 영역 자동 대기 (Selenium의 늪 탈출)
        await page.wait_for_selector(".list_news")
 
        # 3. 데이터 추출 (제목, 요약, 링크)
        articles = await page.locator(".news_wrap").all()
        results = []
 
        for article in articles[:15]:  # 상위 15개 추출
            title_el = article.locator(".news_tit")
            summary_el = article.locator(".dsc_wrap")
            
            title = await title_el.text_content()
            link = await title_el.get_attribute("href")
            summary = await summary_el.text_content() if await summary_el.count() > 0 else ""
 
            if title and link:
                results.append({
                    "기사 제목": title.strip(),
                    "기사 요약": summary.strip()[:100] + "...",
                    "원문 링크": link
                })
 
        await browser.close()
 
        # 4. 판다스(Pandas)를 활용한 엑셀 파일 변환 및 저장
        df = pd.DataFrame(results)
        excel_name = f"자동화크롤링_{keyword}_결과.xlsx"
        df.to_excel(excel_name, index=False)
        print(f"✅ 총 {len(results)}건의 데이터 추출 완료! '{excel_name}' 파일로 저장되었습니다.")
 
if __name__ == "__main__":
    # 비동기 루프 실행
    asyncio.run(crawl_news_to_excel("생성형 AI 트렌드"))

이 코드의 실무상 장점

  1. time.sleep(3) 같은 불안정한 지연 코드가 단 한 줄도 없습니다. wait_for_selector가 화면에 요소가 그려지는 즉시 0.01초 단위로 포착해 다음 코드로 넘어갑니다.
  2. async / await 비동기 방식을 사용하면 여러 작업을 구조적으로 관리할 수 있습니다. 다만 실제 사이트에 요청을 보낼 때는 과도한 병렬 요청을 피하고 속도 제한을 둬야 합니다.

4. 웹 자동화 시 지켜야 할 기준

웹 자동화는 기술적으로 가능하더라도 항상 허용되는 것은 아닙니다. 다음 기준을 먼저 확인하는 편이 안전합니다.

  • 서비스 약관과 robots.txt를 확인합니다.
  • 로그인, 결제, 개인정보가 포함된 영역은 자동화를 피하거나 명시적 허가를 받습니다.
  • 짧은 시간에 많은 요청을 보내지 않도록 속도 제한을 둡니다.
  • 캡차, 보안 확인, 접근 제한을 우회하려고 하지 않습니다.
  • 수집한 데이터의 출처와 이용 목적을 기록합니다.

요약 및 결론

  • Python Playwright는 드라이버 관리와 동적 페이지 대기 문제를 줄이는 데 도움이 되는 자동화 도구입니다.
  • 자동 대기(Auto-waiting), 비동기 처리, 브라우저 컨텍스트 분리를 활용하면 테스트와 반복 업무 자동화를 더 안정적으로 구성할 수 있습니다.
  • 크롤링 목적이라면 기술 구현보다 먼저 약관, 요청 빈도, 개인정보, 접근 권한을 확인해야 합니다.
📦추천 상품🔒 개인정보 수집 없음

쿠팡 로켓배송 특가 & 가성비 추천 제품 확인

이 글에서 소개하거나 추천하는 IT 기기, 가공식품, 가성비 필수 꿀템을 쿠팡 로켓배송 최저가로 빠르게 만나보세요.

쿠팡 최저가 확인하기 →