PYTHON 웹 스크래핑

Playwright를 활용한 브라우저 최대화 실행 방법: 동기식과 비동기식 접근법

나루하루001 2025. 6. 26. 05:22
반응형
📌 목차
1. Playwright 소개
2. 비동기식(Async) 방식으로 브라우저 최대화하기
3. 동기식(Sync) 방식으로 브라우저 최대화하기
4. 코드 분석 및 함수 설명
5. 예외 처리 방법
6. 주요 차이점 비교
7. 마치며



Playwright 소개


Playwright는 Microsoft에서 개발한 웹 브라우저 자동화 라이브러리로,

웹 테스트 및 스크래핑에 강력한 기능을 제공합니다.


이 도구는 Chrome, Firefox, Safari 등 다양한 브라우저를 지원하며,

동기식과 비동기식 두 가지 방식으로 코드를 작성할 수 있습니다.


이번 포스팅에서는 Playwright를 사용하여

브라우저를 최대화된 상태로 실행하는 방법을

동기식과 비동기식 코드로 나누어 살펴보겠습니다.


비동기식(Async) 방식으로 브라우저 최대화하기


비동기식 방식은 asyncio 라이브러리를 활용하여 코드를 실행하는 방식입니다.
다음은 비동기식으로 네이버 웹사이트에 접속하고 브라우저를 최대화하는 코드입니다.

import asyncio
from playwright.async_api import async_playwright

async def run_naver_async():
    async with async_playwright() as p:

        browser = await p.chromium.launch(
            headless=False,
            args=['--start-maximized']
        )

        context = await browser.new_context(no_viewport=True)

        page = await context.new_page()

        await page.goto("https://www.naver.com")

        try:
            await page.wait_for_event("close", timeout=0)
        except Exception as e:
            print(f"브라우저가 닫혔습니다. ({e})")
        finally:
            await browser.close()

if __name__ == "__main__":
    asyncio.run(run_naver_async())



반응형

동기식(Sync) 방식으로 브라우저 최대화하기


동기식 방식은 코드가 순차적으로 실행되는 방식으로,

비동기식에 비해 더 직관적이고 이해하기 쉽습니다.


다음은 동기식으로 동일한 기능을 구현한 코드입니다.

from playwright.sync_api import sync_playwright

def run_naver_sync():
    with sync_playwright() as p:

browser = p.chromium.launch(
            headless=False,
            args=['--start-maximized']
        )

        context = browser.new_context(no_viewport=True)

        page = context.new_page()

        page.goto("https://www.naver.com")
        
        print("네이버 페이지가 최대화된 창으로 열렸습니다.")

        try:
            # 동기식에서는 input() 함수를 사용하여 사용자 입력 대기
            input("계속하려면 아무 키나 누르세요...")
        except Exception as e:
            print(f"브라우저가 닫혔습니다. ({e})")
        finally:
            browser.close()

if __name__ == "__main__":
    run_naver_sync()



코드 분석 및 함수 설명

 

비동기식 코드 주요 함수


1. `async_playwright()`: 비동기 컨텍스트 매니저로 Playwright 인스턴스를 생성합니다.
2. `await p.chromium.launch()`: 크로미움 브라우저를 비동기적으로 실행합니다.
3. `await browser.new_context()`: 브라우저 컨텍스트를 비동기적으로 생성합니다.
4. `await context.new_page()`: 새 페이지를 비동기적으로 생성합니다.
5. `await page.goto()`: 지정된 URL로 비동기적으로 이동합니다.
6. `await page.wait_for_event("close", timeout=0)`: 페이지가 닫힐 때까지 비동기적으로 대기합니다.
7. `await browser.close()`: 브라우저를 비동기적으로 종료합니다.
8. `asyncio.run()`: 비동기 함수를 실행하는 진입점입니다.

 

동기식 코드 주요 함수


1. `sync_playwright()`: 동기 컨텍스트 매니저로 Playwright 인스턴스를 생성합니다.
2. `p.chromium.launch()`: 크로미움 브라우저를 동기적으로 실행합니다.
3. `browser.new_context()`: 브라우저 컨텍스트를 동기적으로 생성합니다.
4. `context.new_page()`: 새 페이지를 동기적으로 생성합니다.
5. `page.goto()`: 지정된 URL로 동기적으로 이동합니다.
6. `input()`: 사용자 입력을 기다리는 동기 함수입니다.
7. `browser.close()`: 브라우저를 동기적으로 종료합니다.

 

브라우저 최대화 관련 파라미터


1. `headless=False`: 브라우저 UI를 화면에 표시합니다. 기본값은 True로 화면에 표시되지 않는 헤드리스 모드입니다.
2. `args=['--start-maximized']`: 브라우저 시작 시 최대화 상태로 실행하도록 요청하는 인수입니다.
3. `no_viewport=True`: Playwright의 기본 뷰포트 제어를 비활성화하고 브라우저 창의 실제 크기를 사용하도록 설정합니다.

💡 중요 포인트
브라우저를 최대화하려면 두 가지 설정이 모두 필요합니다:
1. args=['--start-maximized']: 브라우저 창을 최대화하도록 OS에 요청
2. no_viewport=True: Playwright의 뷰포트 제어를 비활성화하여 최대화 상태 유지



예외 처리 방법


두 코드 모두 try-except-finally 구문을 사용하여 예외를 처리합니다.


예외는 다음과 같은 상황에서 발생할 수 있습니다:
1. 브라우저의 강제 종료: 사용자가 브라우저를 작업 관리자에서 종료한 경우
2. 시스템 문제: 메모리 부족, 시스템 충돌 등으로 인한 브라우저 종료
3. 네트워크 문제: 연결 끊김으로 인한 오류
4. 사용자의 프로그램 중단: 스크립트 실행을 중단한 경우

 

비동기식 코드의 예외 처리


비동기식 코드에서는 `await page.wait_for_event("close", timeout=0)`를 사용하여 페이지가 닫힐 때까지 대기합니다.
이 함수는 페이지가 예상치 못하게 닫히거나 timeout이 발생하면 예외를 발생시킵니다.
`timeout=0`은 무한정 대기한다는 의미입니다.

try:
    await page.wait_for_event("close", timeout=0)
except Exception as e:
    print(f"브라우저가 닫혔습니다. ({e})")
finally:
    await browser.close()

 

동기식 코드의 예외 처리


동기식 코드에서는 `input()` 함수를 사용하여 사용자 입력을 기다립니다.
사용자가 프로그램을 중단하거나 예기치 않은 오류가 발생하면 예외가 발생합니다.

try:
    input("계속하려면 아무 키나 누르세요...")
except Exception as e:
    print(f"브라우저가 닫혔습니다. ({e})")
finally:
    browser.close()
⚠️ 주의사항
finally 블록은 예외 발생 여부와 관계없이 항상 실행되므로, 브라우저 리소스를 확실히 정리하는 데 중요합니다.
브라우저를 명시적으로 닫지 않으면 백그라운드에서 계속 실행되어 시스템 리소스를 낭비할 수 있습니다.



주요 차이점 비교

 

동기식 vs 비동기식 코드 구조


1. 모듈 임포트:
- 비동기식: `from playwright.async_api import async_playwright`와 `import asyncio`
- 동기식: `from playwright.sync_api import sync_playwright`


2. 함수 정의:
- 비동기식: `async def run_naver_async():`
- 동기식: `def run_naver_sync():`


3. 컨텍스트 매니저:
- 비동기식: `async with async_playwright() as p:`
- 동기식: `with sync_playwright() as p:`


4. 함수 호출:
- 비동기식: 모든 비동기 함수 앞에 `await` 키워드 사용
- 동기식: 일반 함수 호출 방식


5. 메인 실행:
- 비동기식: `asyncio.run(run_naver_async())`
- 동기식: `run_naver_sync()`


6. 대기 방식:
- 비동기식: `await page.wait_for_event("close", timeout=0)`
- 동기식: `input("계속하려면 아무 키나 누르세요...")`


마치며


이 포스팅에서는 Playwright를 사용하여 브라우저를 최대화된 상태로 실행하는 방법을

동기식과 비동기식 접근법으로 살펴보았습니다.


두 방식 모두 동일한 결과를 얻을 수 있지만,

코드 구조와 실행 방식에 차이가 있습니다.


비동기식 방식은 I/O 작업이 많은 경우 더 효율적이며,

특히 여러 브라우저나 페이지를 동시에 제어해야 할 때 유용합니다.


반면 동기식 방식은 코드가 더 직관적이고 이해하기 쉬워 간단한 자동화 작업에 적합합니다.


예외 처리는 두 방식 모두에서 중요하며,

특히 브라우저의 예상치 못한 종료나 시스템 문제에 대응하기 위해 필수적입니다.


finally 블록을 활용하여 항상 브라우저 리소스를 정리하는 것이 좋은 습관입니다.


Playwright는 강력한 웹 자동화 도구로, 이 포스팅에서 다룬 기본적인 브라우저 제어 외에도 다양한 고급 기능을 제공합니다.

[ 파이썬 관련 블로그 글 목록 ] 

파이썬(Python) 블로그 목록
반응형