SW개발/python

[python] selenium 활용한 웹페이지 PDF 파일로 저장하기

코대장 2022. 12. 28. 12:17
반응형

들어가며

여러 웹사이트를 돌아다니며 크롤링하다 보면 가끔은 내PC에 저장하고 싶은 정보들이 있을 수 있다.

나 같은 경우 필요성을 느낀 포인트가 한가지 있는데,

포털사이트에서 신문기사를 보면 너무 불필요하게 광고가 덕지덕지 있어 늘 불편했다.

 

 

인쇄버튼을 누르면 광고 없이 깔끔하게 볼 수 있잖아!


파이썬과 셀레니움에는 언제나 정답이 있다!!

 

웹페이지 PDF 파일로 저장하기

아래 예시로 사용할 웹페이지가 있다. 기사 시작하기 전부터 영상이 딸린 커다란 광고가 붙어 있다.

URL : https://www.mk.co.kr/news/world/10584572

그리고 기사 헤드라인 아래쪽으로 보면 프린터 모양 '인쇄' 버튼이 있는데 이걸 눌러 보면 URL은 아래와 같다.

URL : https://www.mk.co.kr/print/10584572

 

웹사이트 마다 다르지만, 보통은 이런 주소체계다. 뉴스기사 키 값이 될 뒤 숫자는 동일하며, 주소 앞쪽으로 'print'라는 단어를 위치 시킨다.

 

 

샘플코드

샘플코드에서는 우리가 웹페이지에서 인쇄버튼을 눌렀을 때 URL 주소를 가지고 PDF 파일을 생성해보려고 한다.

import os
import json
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from datetime import datetime

''' 파일 저장을 위한 디렉토리 생성 '''
save_dir = os.path.join(os.getcwd(), str(datetime.today().date()))
if not os.path.isdir(save_dir):
    os.mkdir(save_dir)

''' PDF 파일 저장하기 위한 setting '''
settings = {
    "recentDestinations": [{
        "id": "Save as PDF",
        "origin": "local",
        "account": "",
    }],
    "selectedDestinationId": "Save as PDF",
    "version": 2,
    #"isHeaderFooterEnabled": False,
    #"isLandscapeEnabled": True
}

prefs = {'printing.print_preview_sticky_settings.appState': json.dumps(settings),
         "download.prompt_for_download": False,
         "profile.default_content_setting_values.automatic_downloads": 1,
         "download.default_directory": save_dir,
         "savefile.default_directory": save_dir,
         "download.directory_upgrade": True,
         "safebrowsing.enabled": True}

chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option('prefs', prefs)
chrome_options.add_argument('--kiosk-printing')
# chrome_options.add_argument('headless')

driver = webdriver.Chrome(executable_path=ChromeDriverManager().install(), options=chrome_options)
driver.implicitly_wait(5)

url1 = 'https://n.news.naver.com/article/654/0000028666?cds=news_media_pc&type=editn'
url2 = 'https://n.news.naver.com/article/print/654/0000028666'

driver.get(url1)
driver.execute_script("window.print();")

driver.close()