서버가 HTML의 길이를 파악하는 법

2024년 10월 18일 금요일

Today I Learned

날짜

2024년 10월 18일 금요일

내용

HTML에서 전체 길이를 파악하는 법

인스타그램에서 가져온 댓글 10개를 이미지로 만들어야 한다. html2image는 생성할 때 사이즈를 표시할 수 있는데, 어떤 값을 넣어야 할지 불명확했다. 댓글의 작성 길이에 따라 어찌 될지 모르니… GPT께서, selenium을 이용하라고 하신다. 기본적인 원리는

  1. selenium으로 서버에서 크롬창을 띄운다.
  2. 거기에 내가 이미지로 만드려는 HTML 파일을 올린다.
  3. 그 창의 길이를 측정한다.
  4. 이미지로 만들 때 그 값을 높이로 제공하면 딱 알맞은 이미지가 생성된다.

다. 코드가 참 더러운데 어떻게 작동은 된다…?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
from html2image import Html2Image
from selenium import webdriver
from selenium.webdriver.chrome.service import Service

hti = Html2Image(
    browser_executable="/usr/bin/chromium",
    custom_flags=[
        "--no-sandbox",
        "--hide-scrollbars",
        "--disable-dev-shm-usage",
        "--disable-software-rasterizer",
        "--headless=new",
    ],
)

options = webdriver.ChromeOptions()
options.add_argument("--headless=new")  # 브라우저를 GUI 없이 실행
options.add_argument("disable-gpu")
options.add_argument("--no-sandbox")  # 보안 모드 비활성화
options.add_argument(
    "--disable-dev-shm-usage"
)  # /dev/shm 사용 비활성화 (일부 환경에서 오류 해결)
options.add_argument(
    "--disable-software-rasterizer"
)  # 소프트웨어 렌더링 비활성화
options.add_argument("--log-level=3")  # 로그 레벨 설정


def get_height_of_html(self, html_file_path: str):
      try:
          # 크롬 드라이버
          driver = webdriver.Chrome(
              service=Service("/usr/bin/chromedriver"), options=options
          )
          
          # 길이를 측정할 HTML 파일의 절대경로 및 URL 설정
          absolute_path = os.path.abspath(html_file_path)
          file_url = f"file://{absolute_path}"
          
          # 파일 렌더링
          driver.get(file_url)
          
          # 렌더링 시간 보장
          time.sleep(1)
          
          # 높이값 측정
          page_height = driver.execute_script(
              "return document.body.scrollHeight"
          )
          
          # 크롬 드라이버 종료
          driver.quit()
          return page_height
      finally:
          driver.quit()

작동은 되는데 터미널 로그창에 온갖 메시지가 다 뜬다…

회고

6층 백.