← 전체 사례
2026자체 제품

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

PythonPlaywrightCustomTkinterPyInstaller

맥락

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

문제

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

내린 결정

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

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

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

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

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

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

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

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

내가 맡은 범위

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

실제 산출물

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

솔직하게 — 아직 못 한 것

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

이런 일이 필요하시면

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

다른 사례