플레이 wright-pythhon이 AWS Lambda나 Alpine Linux로 조작하면 좋을 것 같은데...?

12148 단어 Pythonplaywrighttech
playwright-python은 로컬 기기에서 실행하는 가장 좋은 브라우저 자동 조작 환경이다.
다만, Django에 편입하거나 AWS Lambda 등 서버 없는 환경에서 활동하려면 힘들 수 있다.
왜냐하면, 이유는 두 가지가 있다.
  • Playwright run-driver를 실행할 수 있는 셸이 필요합니다.
    그래서 Docker 컨테이너 준비부터...
  • 브라우저를 실행하려면 다양한 라이브러리 필요
  • 웹 서비스라면 원래 조개 같은 건 피해야 하는데 웹 서비스 용기에 GUI 계열의 프로그램 라이브러리가 쌓여 있으면 취약성이 강해져요...잠깐만요.
    AWS Lambda에서 Playwright를 시작하기 위해서는 아래 기사에서 언급한 바와 같이 준비 작업이 비교적 힘들다.
    https://tech.smartshopping.co.jp/lambda-container-playwright

    실제로 파이톤으로 구동할 수 있는 구조가 있어요.


    Playwright는 서버/클라이언트 구조로 이전에 파이프(표준 입력/표준 출력)를 통신 경로로 하고 서버(Node.js 기반의 Playwright 드라이브)와 클라이언트(playwright-python에서 쓴 스크립트)가 일했다.
    통신선이 웹소켓으로 바뀌면 어때요?

    이런 느낌으로 서버는 어떤 PaaS에서 이동하고 클라이언트 부분만 Django 또는 AWS Lambda 방식으로 이동하면 된다.이 구조를 사용하면 브라우저 동작에 필요한 의존성 패키지 등이 필요하지 않으므로 Alpine Linux를 사용해도 됩니다.

    Playwright 1.11에서 가져온 WebSocketTransport


    ※ _덧붙인 포장이라 앞으로 변할 가능성이 큽니다!!
    https://github.com/microsoft/playwright-python/commit/9d796623a104e082f57878d29d9aea20009b88c1
    전통적인 Pipe Transport 방식 외에 웹소켓 Transport도 추가했다.
    이로써 sync_playwright()에서 PipeTransport 제작 Connection 처리를 모방하여 `WebSocketTransport 제작 Connection 버전의sync를 제작하였다.playwright_리모트 () 같은 거 만들면 돼요.
    https://github.com/microsoft/playwright-python/blob/v1.12.1/playwright/sync_api/_context_manager.py
    ↑ 이걸 복사해서 이렇게 만든 느낌.
    class SyncPlaywrightRemoteContextManager:
        def __init__(self, ws_endpoint) -> None:
            self._playwright: SyncPlaywright
            self._ws_endpoint = ws_endpoint
    
        def __enter__(self) -> SyncPlaywright:
            loop: asyncio.AbstractEventLoop
            own_loop = None
            try:
                loop = asyncio.get_running_loop()
            except RuntimeError:
                loop = asyncio.new_event_loop()
                own_loop = loop
            if loop.is_running():
                raise Error(
                    """It looks like you are using Playwright Sync API inside the asyncio loop.
    Please use the Async API instead."""
                )
    
            def greenlet_main() -> None:
                loop.run_until_complete(self._connection.run_as_sync())
    
                if own_loop:
                    loop.run_until_complete(loop.shutdown_asyncgens())
                    loop.close()
    
            dispatcher_fiber = greenlet(greenlet_main)
            self._connection = Connection(
                dispatcher_fiber,
                create_remote_object,
                WebSocketTransport(loop, self._ws_endpoint)
            )
    
            g_self = greenlet.getcurrent()
    
            def callback_wrapper(playwright_impl: Playwright) -> None:
                self._playwright = SyncPlaywright(playwright_impl)
                g_self.switch()
    
            self._connection.call_on_object_with_known_name(
                "Playwright", callback_wrapper)
    
            dispatcher_fiber.switch()
            playwright = self._playwright
            playwright.stop = self.__exit__  # type: ignore
            return playwright
    
        def start(self) -> SyncPlaywright:
            return self.__enter__()
    
        def __exit__(self, *args: Any) -> None:
            self._connection.stop_sync()
    
    
    def sync_playwright_remote(ws_endpoint) -> SyncPlaywrightRemoteContextManager:
        return SyncPlaywrightRemoteContextManager(ws_endpoint)
    
    다음
    main.py
    
    with sync_playwright_remote('ws://127.0.0.1:8080/ws') as playwright:
      playwright.chromium.launch() as browser:
        page = browser.new_page()
        page.goto('https://.....')
    
    이런 느낌으로 Squraping clopt를 쓰면 WebSocket을 통해 wright 프로토콜 흐름을 재생하면 자동으로 작동할 수 있다.
    실제 Heroku에서 Playwright 서버를 이동하고 손 옆python:3.9-alpine의 Docker 이미지로 이동하는 샘플은 이 폐기물↓
    https://zenn.dev/yusukeiwaki/scraps/3ad5f8ed536720
    GiitHub 코드↓
    https://github.com/YusukeIwaki/playwright-python-playWithWebSocket/tree/main
    Alpine Linux에 Playwright↓ 설치
    https://github.com/YusukeIwaki/playwright-python-remote#execute-python-script-on-alpine-linux-environment

    총결산


    Playwright 1.11 이후라면 패키지에 포함된 WebSocketTransport를 숨길 수 있습니다.
    숨겨진 포장이라 언젠가는 망가질 수 있지만 1.12.3은 아직 망가지지 않았다.

    좋은 웹페이지 즐겨찾기