← 전체 사례
2026자체 제품

EXITO Supply Collector — 모르는 사이트도 일단 읽는 수집기

PythonPlaywrightCustomTkinterPyInstaller

확인한 결과배포 가능한 데스크톱 실행 파일 (PyInstaller)

맥락

쇼핑몰 운영자는 공급사 사이트에서 상품 정보를 옮겨 담는 데 하루의 상당 부분을 씁니다. 공급사는 계속 늘어나고, 사이트 구조는 제각각입니다.

문제

공급사마다 크롤러를 새로 만들면 공급사가 늘어날 때마다 개발자가 필요합니다. 그 구조로는 운영자가 스스로 못 씁니다.

내린 결정

지원하지 않는 사이트에서도 빈손으로 돌아오지 않게 했다

등록된 크롤러가 없으면 GenericCrawler가 구조화 데이터(JSON-LD), OpenGraph, meta 태그, DOM을 순서대로 분석합니다. 완벽하진 않지만 '이 사이트는 지원 안 됩니다'로 끝나지 않습니다.

공급사 추가를 개발이 아니라 등록으로 만들었다

`BaseCrawler`를 상속해 `can_handle`과 `collect`만 구현하고 `CrawlerRegistry`에 등록하면 됩니다. 사이트별 선택자와 인증 정보는 코드가 아니라 설정에 둡니다.

개발자가 아닌 사람에게 넘길 수 있게 포장했다

CLI로 끝내지 않고 CustomTkinter로 MVC 구조의 화면을 붙이고 PyInstaller로 실행 파일까지 만들었습니다. 파이썬을 모르는 운영자가 받아서 바로 쓸 수 있는 형태여야 실제로 쓰입니다.

이미지 경로까지 실제로 열리게 치환했다

수집한 HTML 안의 이미지 링크를 다운로드된 로컬 상대경로로 치환합니다. 원본 사이트가 바뀌거나 핫링크가 막혀도 산출물이 깨지지 않습니다.

내가 맡은 범위

  • 아키텍처 설계
  • 크롤러 개발
  • 데스크톱 UI
  • 패키징·배포

실제 산출물

  • 배포 가능한 데스크톱 실행 파일 (PyInstaller)
  • 공급사별 크롤러 플러그인 + 범용 폴백 크롤러
  • Excel · JSON · CSV 내보내기 어댑터

수행 범위와 확인 기준

배포 가능한 데스크톱 실행 파일 (PyInstaller)

GenericCrawler는 구조화 데이터가 부실한 사이트에서 정확도가 떨어집니다. 그런 사이트는 결국 전용 플러그인을 써야 하고, 그래서 플러그인 구조를 먼저 만들었습니다.

이런 일이 필요하시면

지금 막힌 지점을 그대로 적어 보내주세요. 제가 할 수 있는 일과 없는 일을 먼저 구분해 답장드립니다.

kjyhopekr@gmail.com

같은 분야의 다음 사례