Selenium에게 패배한 개발자 : PIL

2024년 10월 21일 월요일

Today I Learned

날짜

2024년 10월 21일 월요일

내용

Selenium은 말을 듣지 않는다.

인스타그램 댓글을 가져와 이미지를 생성하고 있다. 과정은

Jinja2로 HTML 생성 ⇒ Selenium으로 HTML을 렌더링해 높이 파악 ⇒ HTML2Image로 높이를 정한 이미지 생성

이다. 근데, HTML 하단의 여백이 배경이 없이 나타난다. 그라데이션 모델은 배경이 CSS가 아니라 이미지인데, 하단 84px 정도는 이 배경이미지를 불러오지 못해서 하얗게 나타난다. 이걸 해결하기 위해 온갖 시도를 다해봤으나 실패했다… 오전에 우스갯소리로 “이걸 생성해서 흰색 만큼 자르는건 개발자로서 수치스러운 겁니다”라고 했었는데..

이미 자존심은 20년 전 달고나랑 바꿔먹었기 때문에, 기꺼이 방향을 틀었다. PIL 이라는 라이브러리를 이용해서 이미지의 하단 부위를 잘라냈다.

1
2
3
4
5
6
7
8
9
10
from PIL import Image

img_r = "src/templates/" + self.file_name
img = Image.open(img_r)
width, height = img.size

# left, top, right, bottom 순
img_cropped = img.crop((0, 0, width, height - 80))

img_cropped.save(img_r)

지난주 것

매 주 이미지는 갱신된다. 갱신 시점에, 상품 상세페이지에 우리가 지난주에 추가해둔 이미지가 있는지 확인해서 교체해주어야 한다. 이미지 제목은 해당 이미지 데이터가 DB에서 가지는 고유 ID로 뒀기 떄문에 겹칠일은 없다. 디렉토리도 똑같기 떄문에, 페이지에서 조회조차 할 필요 없이 같은 URL이 새로운 이미지를 나타낼게 분명하다. 하지만 내가 뺴먹은건, 교체될 때 기존에 있던 이미지를 일주일 간 가지고 있어야 한다는 것… 내가 구현한 방식은 덮어 씌우기 때문에 저장할 리가 없다.

어떻게 하면 최소한으로 바꿔서 해결할 까 고민하다가.. S3 저장 디렉토리에 매주 월요일 날짜를 추가해줬다! 기존에는 {user id}/{배너이미지 ID}.png 였는데, 이제 {user id}/{이 주의 월요일 날짜}/{배너이미지 ID}.png 가 됐다. 현재 날짜의 가장 가까운 월요일을 기준으로 일주일이 지난 폴더는 삭제해주면 된다. 갱신될 때마다 겹칠일도 없다. 창의력 만족.

회고

셀레니움은 원리가 도저히 이해가 안된다.