프로그래밍/PYTHON

Python : Playwright 라이브러리, 웹사이트 내용 PDF로 변환

재우니 2024. 9. 3. 19:57

주어진 코드는 Playwright 라이브러리를 사용하여 원격 웹사이트의 내용을 PDF로 변환하는 Python 스크립트입니다. 이 스크립트를 주니어 개발자의 시각에서 자세히 설명해 드리겠습니다.

개요

이 스크립트는 웹 브라우저를 자동화하여 특정 URL의 웹 페이지를 PDF로 저장합니다. Playwright는 웹 브라우저를 제어할 수 있는 파이썬 라이브러리로, 웹 페이지의 내용을 가져오거나 조작할 때 많이 사용됩니다.

요구사항

  1. Python이 설치되어 있어야 합니다.

  2. Playwright 라이브러리를 설치해야 합니다. 이를 위해 아래 명령어를 터미널이나 명령 프롬프트에서 실행합니다:

    pip install playwright
  3. 설치 후, Playwright가 브라우저들을 설치할 수 있도록 아래 명령어도 실행해야 합니다:

    playwright install

코드 설명

from playwright.sync_api import sync_playwright

def generate_pdf(url, output_path):
    with sync_playwright() as p:
        # 1. Chromium 브라우저를 실행합니다.
        browser = p.chromium.launch(headless=True)
        page = browser.new_page()

        # 2. URL로 이동하여 페이지를 로드합니다.
        page.goto(url, wait_until='networkidle')

        # 3. 추가 대기 시간 (10초) - 페이지가 완전히 로드될 때까지 기다림
        page.wait_for_timeout(10000)  # 10000 밀리초 = 10초

        # 4. 페이지를 PDF로 저장합니다.
        page.pdf(
            path=output_path, 
            format="A4", 
            landscape=True,  # 가로 방향 설정
            margin={'top': '0.5in', 'bottom': '0.5in', 'left': '0.5in', 'right': '0.5in'}  # 여백 설정
        )

        print(f"PDF 생성 완료: {output_path}")

        # 5. 브라우저를 닫습니다.
        browser.close()

# 사용 예시
url = 'https://catalog.us-east-1.prod.workshops.aws/workshops/600420b7-5c4c-498f-9b80-bc7798963ba3/ko-KR/ec2'
output_path = '1. EC2.pdf'
generate_pdf(url, output_path)

코드 단계별 설명

  1. Playwright 동기 API 가져오기:

    from playwright.sync_api import sync_playwright
    • Playwright의 동기 방식 API를 사용합니다. 비동기 API도 있지만, 동기 API가 더 직관적이어서 초보자에게 이해하기 쉽습니다.
  2. 브라우저 실행 및 페이지 열기:

    browser = p.chromium.launch(headless=True)
    page = browser.new_page()
    • chromium.launch(headless=True): 브라우저를 백그라운드(화면에 표시되지 않음)에서 실행합니다.
    • new_page(): 새 탭을 엽니다.
  3. URL 로드:

    page.goto(url, wait_until='networkidle')
    • goto(url, wait_until='networkidle'): 지정된 URL로 이동합니다. 'networkidle'은 네트워크 요청이 대부분 완료된 상태를 기다려 페이지가 완전히 로드되도록 합니다.
  4. 추가 대기 시간:

    page.wait_for_timeout(10000)
    • 추가로 10초 동안 기다립니다. 이 과정은 페이지가 완전히 렌더링될 수 있도록 보장합니다.
  5. PDF 생성:

    page.pdf(
        path=output_path, 
        format="A4", 
        landscape=True,
        margin={'top': '0.5in', 'bottom': '0.5in', 'left': '0.5in', 'right': '0.5in'}
    )
    • 페이지를 PDF로 저장합니다.
    • format="A4": PDF의 용지를 A4 크기로 설정합니다.
    • landscape=True: PDF를 가로 방향으로 저장합니다.
    • margin={'top': '0.5in', 'bottom': '0.5in', 'left': '0.5in', 'right': '0.5in'}: PDF의 여백을 설정합니다.
  6. 브라우저 닫기:

    browser.close()
    • 작업이 끝난 후 브라우저를 닫습니다.

실행 예시

마지막 부분의 generate_pdf(url, output_path) 함수 호출은 실제로 웹 페이지를 PDF로 변환합니다. 주어진 URL에서 웹 페이지를 PDF로 저장하고, 지정한 output_path에 파일을 생성합니다.

이 코드를 실행하면 지정된 웹 페이지가 A4 크기의 가로 방향 PDF로 저장되며, PDF 파일은 지정한 경로에 저장됩니다. PDF 파일을 생성할 때 여백 설정과 같은 다양한 옵션을 통해 출력 형식을 제어할 수 있습니다.

   from playwright.sync_api import sync_playwright

def generate_pdf(url, output_path):
    with sync_playwright() as p:
        # Chromium 브라우저를 실행합니다.
        browser = p.chromium.launch(headless=True)
        page = browser.new_page()

        # URL로 이동하여 페이지를 로드합니다.
        page.goto(url, wait_until='networkidle')

        # 추가 대기 시간 (3초) - 페이지가 완전히 로드될 때까지 기다림
        page.wait_for_timeout(1500)  # 1000 밀리초 = 1초


        # 페이지를 PDF로 저장합니다.
        # 페이지를 가로 방향으로 PDF로 저장합니다.
        page.pdf(
            path=output_path, 
            format="A4", 
            landscape=True,  # 가로 방향 설정
            margin={'top': '0.5in', 'bottom': '0.5in', 'left': '0.5in', 'right': '0.5in'}  # 여백 설정
        )

        print(f"PDF 생성 완료: {output_path}")

        # 브라우저를 닫습니다.
        browser.close()

# 사용 예시
url = 'https://catalog.us-east-1.prod.workshops.aws/workshops/600420b7-5c4c-498f-9b80-bc7798963ba3/ko-KR/ec2'
output_path = '1. EC2.pdf'
generate_pdf(url, output_path)

url = 'https://catalog.us-east-1.prod.workshops.aws/workshops/600420b7-5c4c-498f-9b80-bc7798963ba3/ko-KR/ec2/20-preq'
output_path = '1-1. EC2_워크샵 시작 전 준비 사항.pdf'
generate_pdf(url, output_path)

url = 'https://catalog.us-east-1.prod.workshops.aws/workshops/600420b7-5c4c-498f-9b80-bc7798963ba3/ko-KR/ec2/20-preq/100-account'
output_path = '1-1-1. EC2_워크샵 시작_AWS계정으로시작.pdf'
generate_pdf(url, output_path)

url = 'https://catalog.us-east-1.prod.workshops.aws/workshops/600420b7-5c4c-498f-9b80-bc7798963ba3/ko-KR/ec2/20-preq/300-setting'
output_path = '1-1-2. EC2_워크샵 시작_추가설정하기.pdf'
generate_pdf(url, output_path)

url = 'https://catalog.us-east-1.prod.workshops.aws/workshops/600420b7-5c4c-498f-9b80-bc7798963ba3/ko-KR/ec2/30-vpc'
output_path = '1-2. EC2_네트워크 구성하기.pdf'
generate_pdf(url, output_path)

url = 'https://catalog.us-east-1.prod.workshops.aws/workshops/600420b7-5c4c-498f-9b80-bc7798963ba3/ko-KR/ec2/30-vpc/100-create-vpc'
output_path = '1-2-1. EC2_네트워크 구성하기_VPC 생성하기.pdf'
generate_pdf(url, output_path)

url = 'https://catalog.us-east-1.prod.workshops.aws/workshops/600420b7-5c4c-498f-9b80-bc7798963ba3/ko-KR/ec2/30-vpc/200-create-subnet'
output_path = '1-2-2. EC2_네트워크 구성하기_추가 서브넷 생성하기.pdf'
generate_pdf(url, output_path)

url = 'https://catalog.us-east-1.prod.workshops.aws/workshops/600420b7-5c4c-498f-9b80-bc7798963ba3/ko-KR/ec2/30-vpc/300-set-route-table'
output_path = '1-2-3. EC2_네트워크 구성하기_라우팅 테이블 편집하기.pdf'
generate_pdf(url, output_path)

url = 'https://catalog.us-east-1.prod.workshops.aws/workshops/600420b7-5c4c-498f-9b80-bc7798963ba3/ko-KR/ec2/30-vpc/400-create-sg'
output_path = '1-2-3. EC2_네트워크 구성하기_보안 그룹 생성하기.pdf'
generate_pdf(url, output_path)

url = 'https://catalog.us-east-1.prod.workshops.aws/workshops/600420b7-5c4c-498f-9b80-bc7798963ba3/ko-KR/ec2/40-ec2'
output_path = '1-3. EC2_웹 서버 생성하기.pdf'
generate_pdf(url, output_path)


url = 'https://catalog.us-east-1.prod.workshops.aws/workshops/600420b7-5c4c-498f-9b80-bc7798963ba3/ko-KR/ec2/40-ec2/100-create-ec2'
output_path = '1-3-1. EC2_웹 서버 생성하기_웹 서버 인스턴스 생성하기.pdf'
generate_pdf(url, output_path)

url = 'https://catalog.us-east-1.prod.workshops.aws/workshops/600420b7-5c4c-498f-9b80-bc7798963ba3/ko-KR/ec2/40-ec2/200-create-ami'
output_path = '1-3-2. EC2_웹 서버 생성하기_AMI 생성하기.pdf'
generate_pdf(url, output_path)

url = 'https://catalog.us-east-1.prod.workshops.aws/workshops/600420b7-5c4c-498f-9b80-bc7798963ba3/ko-KR/ec2/40-ec2/300-create-ami-ec2'
output_path = '1-3-3. EC2_웹 서버 생성하기_AMI 기반 인스턴스 생성하기.pdf'
generate_pdf(url, output_path)

url = 'https://catalog.us-east-1.prod.workshops.aws/workshops/600420b7-5c4c-498f-9b80-bc7798963ba3/ko-KR/ec2/50-elb'
output_path = '1-4. EC2_로드밸런서 구성하기.pdf'
generate_pdf(url, output_path)

url = 'https://catalog.us-east-1.prod.workshops.aws/workshops/600420b7-5c4c-498f-9b80-bc7798963ba3/ko-KR/ec2/50-elb/100-create-elb'
output_path = '1-4-1. EC2_로드밸런서 구성하기_로드밸런서 생성하기.pdf'
generate_pdf(url, output_path)

url = 'https://catalog.us-east-1.prod.workshops.aws/workshops/600420b7-5c4c-498f-9b80-bc7798963ba3/ko-KR/ec2/60-additional'
output_path = '1-5. EC2_(옵션)추가실습.pdf'
generate_pdf(url, output_path)


url = 'https://catalog.us-east-1.prod.workshops.aws/workshops/600420b7-5c4c-498f-9b80-bc7798963ba3/ko-KR/ec2/60-additional/100-cloudwatch-alarm'
output_path = '1-5-1. EC2_(옵션)추가실습_모니터링.pdf'
generate_pdf(url, output_path)

url = 'https://catalog.us-east-1.prod.workshops.aws/workshops/600420b7-5c4c-498f-9b80-bc7798963ba3/ko-KR/ec2/60-additional/200-auto-scaling'
output_path = '1-5-2. EC2_(옵션)추가실습_오토스케일링.pdf'
generate_pdf(url, output_path)

url = 'https://catalog.us-east-1.prod.workshops.aws/workshops/600420b7-5c4c-498f-9b80-bc7798963ba3/ko-KR/ec2/60-additional/300-static-web'
output_path = '1-5-3. EC2_(옵션)추가실습_정적 웹 사이트 호스팅.pdf'
generate_pdf(url, output_path)

url = 'https://catalog.us-east-1.prod.workshops.aws/workshops/600420b7-5c4c-498f-9b80-bc7798963ba3/ko-KR/ec2/70-cleanup'
output_path = '1-6. EC2_실습 리소스 정리.pdf'
generate_pdf(url, output_path)

url = 'https://catalog.us-east-1.prod.workshops.aws/workshops/600420b7-5c4c-498f-9b80-bc7798963ba3/ko-KR/ec2/70-cleanup/100-clean-up'
output_path = '1-6-1. EC2_실습 리소스 정리_세션실습삭제.pdf'
generate_pdf(url, output_path)

url = 'https://catalog.us-east-1.prod.workshops.aws/workshops/600420b7-5c4c-498f-9b80-bc7798963ba3/ko-KR/ec2/70-cleanup/200-clean-up'
output_path = '1-6-2. EC2_실습 리소스 정리_추가실습삭제.pdf'
generate_pdf(url, output_path)


url = 'https://catalog.us-east-1.prod.workshops.aws/workshops/600420b7-5c4c-498f-9b80-bc7798963ba3/ko-KR/serverless'
output_path = '2. Serverless.pdf'
generate_pdf(url, output_path)

url = 'https://catalog.us-east-1.prod.workshops.aws/workshops/600420b7-5c4c-498f-9b80-bc7798963ba3/ko-KR/serverless/100-preq'
output_path = '2-1. Serverless_워크샵 시작 전 준비 사항.pdf'
generate_pdf(url, output_path)

url = 'https://catalog.us-east-1.prod.workshops.aws/workshops/600420b7-5c4c-498f-9b80-bc7798963ba3/ko-KR/serverless/100-preq/100-setting'
output_path = '2-1-1. Serverless_워크샵 시작 전 준비 사항_언어와 리전 설정하기.pdf'
generate_pdf(url, output_path)

url = 'https://catalog.us-east-1.prod.workshops.aws/workshops/600420b7-5c4c-498f-9b80-bc7798963ba3/ko-KR/serverless/100-preq/200-account'
output_path = '2-1-1. Serverless_워크샵 시작 전 준비 사항_AWS 계정으로 시작.pdf'
generate_pdf(url, output_path)

url = 'https://catalog.us-east-1.prod.workshops.aws/workshops/600420b7-5c4c-498f-9b80-bc7798963ba3/ko-KR/serverless/110-dynamodb'
output_path = '2-2. Serverless_Dynamodb Table 생성하기.pdf'
generate_pdf(url, output_path)

url = 'https://catalog.us-east-1.prod.workshops.aws/workshops/600420b7-5c4c-498f-9b80-bc7798963ba3/ko-KR/serverless/110-dynamodb/100-create-dynamodb'
output_path = '2-2-1. Serverless_Dynamodb Table 생성하기_DynamoDB 생성.pdf'
generate_pdf(url, output_path)

url = 'https://catalog.us-east-1.prod.workshops.aws/workshops/600420b7-5c4c-498f-9b80-bc7798963ba3/ko-KR/serverless/120-lambda'
output_path = '2-3. Serverless_Lambda로 앱서버 생성하기.pdf'
generate_pdf(url, output_path)

url = 'https://catalog.us-east-1.prod.workshops.aws/workshops/600420b7-5c4c-498f-9b80-bc7798963ba3/ko-KR/serverless/120-lambda/100-create-api-service-lambda'
output_path = '2-3-1. Serverless_Lambda로 앱서버 생성하기_Lambda 생성.pdf'
generate_pdf(url, output_path)

url = 'https://catalog.us-east-1.prod.workshops.aws/workshops/600420b7-5c4c-498f-9b80-bc7798963ba3/ko-KR/serverless/130-apigateway'
output_path = '2-4. Serverless_API Gateway 구성하기.pdf'
generate_pdf(url, output_path)

url = 'https://catalog.us-east-1.prod.workshops.aws/workshops/600420b7-5c4c-498f-9b80-bc7798963ba3/ko-KR/serverless/130-apigateway/100-create-apigateway'
output_path = '2-4-1. Serverless_API Gateway 구성하기_API Gateway 생성.pdf'
generate_pdf(url, output_path)

url = 'https://catalog.us-east-1.prod.workshops.aws/workshops/600420b7-5c4c-498f-9b80-bc7798963ba3/ko-KR/serverless/130-apigateway/200-add-apigateway'
output_path = '2-4-2. Serverless_API Gateway 구성하기_API Gateway 추가 설정.pdf'
generate_pdf(url, output_path)

url = 'https://catalog.us-east-1.prod.workshops.aws/workshops/600420b7-5c4c-498f-9b80-bc7798963ba3/ko-KR/serverless/140-s3'
output_path = '2-5. Serverless_S3로 웹서버 기능 사용하기.pdf'
generate_pdf(url, output_path)

url = 'https://catalog.us-east-1.prod.workshops.aws/workshops/600420b7-5c4c-498f-9b80-bc7798963ba3/ko-KR/serverless/140-s3/100-create-bucket'
output_path = '2-5-1. Serverless_S3로 웹서버 기능 사용하기_S3 Bucket 생성하기.pdf'
generate_pdf(url, output_path)

url = 'https://catalog.us-east-1.prod.workshops.aws/workshops/600420b7-5c4c-498f-9b80-bc7798963ba3/ko-KR/serverless/140-s3/200-static-website-hosting'
output_path = '2-5-2. Serverless_S3로 웹서버 기능 사용하기_S3 정적 웹사이트 호스팅 기능 활성화하기.pdf'
generate_pdf(url, output_path)

url = 'https://catalog.us-east-1.prod.workshops.aws/workshops/600420b7-5c4c-498f-9b80-bc7798963ba3/ko-KR/serverless/150-cleanup'
output_path = '2-6. Serverless_실습 리소스 정리.pdf'
generate_pdf(url, output_path)

url = 'https://catalog.us-east-1.prod.workshops.aws/workshops/600420b7-5c4c-498f-9b80-bc7798963ba3/ko-KR/serverless/150-cleanup/100-clean-up'
output_path = '2-6-1. Serverless_실습 리소스 정리_세션 실습 자원 삭제.pdf'
generate_pdf(url, output_path)

url = 'https://catalog.us-east-1.prod.workshops.aws/workshops/600420b7-5c4c-498f-9b80-bc7798963ba3/ko-KR/serverless/900-faq'
output_path = '2-7. Serverless_FAQ.pdf'
generate_pdf(url, output_path)

url = 'https://catalog.us-east-1.prod.workshops.aws/workshops/600420b7-5c4c-498f-9b80-bc7798963ba3/ko-KR/serverless/900-faq/100-account-faq'
output_path = '2-7-1. Serverless_FAQ_계정 생성 FAQ.pdf'
generate_pdf(url, output_path)

url = 'https://catalog.us-east-1.prod.workshops.aws/workshops/600420b7-5c4c-498f-9b80-bc7798963ba3/ko-KR/serverless/900-faq/200-workshop-faq'
output_path = '2-7-2. Serverless_FAQ_실습 환경 FAQ.pdf'
generate_pdf(url, output_path)

url = 'https://catalog.us-east-1.prod.workshops.aws/workshops/600420b7-5c4c-498f-9b80-bc7798963ba3/ko-KR/serverless/900-faq/300-network-faq'
output_path = '2-7-1. Serverless_FAQ_네트워크 FAQ.pdf'
generate_pdf(url, output_path)

url = 'https://catalog.us-east-1.prod.workshops.aws/workshops/600420b7-5c4c-498f-9b80-bc7798963ba3/ko-KR/serverless/900-faq/400-webserver-faq'
output_path = '2-7-1. Serverless_FAQ_웹 서버 FAQ.pdf'
generate_pdf(url, output_path)

url = 'https://catalog.us-east-1.prod.workshops.aws/workshops/600420b7-5c4c-498f-9b80-bc7798963ba3/ko-KR/serverless/900-faq/500-lb-faq'
output_path = '2-7-1. Serverless_FAQ_로드 밸런서 FAQ.pdf'
generate_pdf(url, output_path)

url = 'https://catalog.us-east-1.prod.workshops.aws/workshops/600420b7-5c4c-498f-9b80-bc7798963ba3/ko-KR/serverless/900-faq/600-resource-faq'
output_path = '2-7-1. Serverless_FAQ_실습 리소스 정리 FAQ.pdf'
generate_pdf(url, output_path)