채식주의자를 위한 식당 메뉴 분석 서비스의 데이터 수집 및 AI 분석 자동화 시스템
✅ 1단계: 메뉴 자동 수집 (collect_area_menus.py)
- 네이버 검색 API로 지역 내 식당 검색
- Playwright로 Place ID 자동 추출
- 메뉴 정보 (이름, 가격, 설명, 이미지) 자동 수집
✅ 2단계: AI 메뉴 분석 (analyze_menus.py)
- GPT-4 API로 재료 자동 분석
- 이미지 기반 분석 지원 (빈번한 오류 발상으로 사용 권장하지 않음)
- 채식 범주 자동 분류 (CompleteVegan ~ Uncertain)
- 프롬프트 파일 기반 관리 (튜닝 용이)
# Python 3.8+
python --version
# 필수 패키지 설치
pip install playwright requests openai
pip install -r requirements.txt
# Playwright 사용을 위한 추가 설치
playwright install chromium# 1. 메뉴 수집 (별내동 식당 5개)
python collect_area_menus.py
# 2. AI 분석 (GPT-4)
python analyze_menus.py data/menus_별내동_식당_최신파일.json
[지역 이름]
↓
1. 네이버 검색 API
↓ 식당 목록 (이름, 주소, 카테고리)
2. Playwright Place ID 추출
↓ Place ID
3. Playwright 메뉴 크롤링
↓
[메뉴 데이터 JSON]
명령어:
python collect_area_menus.py설정:
- collect_area_menus.py:
QUERY = "별내동 식당" # 지역 변경 MAX_RESTAURANTS = 5 # 수집 개수
출력:
data/menus_별내동_식당_20260205_181333.json
[메뉴 데이터 JSON]
↓
1. GPT-4 재료 분석
↓ 주재료, 부재료, 동물성 성분
2. GPT-4 채식 범주 분류
↓
[분석 결과 JSON]
명령어:
python analyze_menus.py data/menus_별내동_식당_20260205_181333.json출력:
data/analyzed_menus_별내동_식당_20260205_184835.json
특징:
- Place ID 수동 입력 불필요
- 이미지 URL 자동 수집
- 메타데이터 자동 생성
- 실패 시 재시도 로직
성능:
- 10개 식당: 약 3분
- 100개 식당: 약 30분
- 성공률: 95%+
사용 예시:
# 강남역 식당 20개 수집
QUERY = "강남역 식당"
MAX_RESTAURANTS = 20특징:
- 메뉴명 + 설명 → 재료 추정
- 이미지 포함 시 더 정확한 분석
- 동물성 성분 자동 탐지
- 불확실성 명시
분석 항목:
- 주재료, 부재료
- 육수 종류
- 소스 및 양념
- 동물성 재료 (육류, 해산물, 유제품, 달걀 등)
8가지 범주:
- CompleteVegan: 완전 비건
- Lacto: 락토 베지테리언
- Ovo: 오보 베지테리언
- Lacto/Ovo: 락토-오보 베지테리언
- Pescatarian: 페스코 베지테리언
- Pollotarian: 폴로테리언
- Flexitarian: 플렉시테리언
- Noremal: 일반식(육식 확실히 포함)
- Uncertain: 판단 불가
분류 원칙:
- 주재료 기반 우선 분류
- 가장 엄격한 범주 적용
- 불확실성 명시
Root/
├── README.md 📖 메뉴 수집, AI 분석 가이드
│
├── collect_area_menus.py ⭐ 메뉴 자동 수집 (메인)
├── analyze_menus.py ⭐ AI 메뉴 분석 (메인)
│
├── prompts/
│ ├── analyze_ingredients.txt 📝 재료 분석 프롬프트
│ └── classify_vegetarian_type.txt 📝 채식 범주 분류 프롬프트
│
├── data/
│ ├── menus_*.json 💾 수집된 메뉴 데이터
│ └── analyzed_*.json 💾 분석된 메뉴 데이터
│
# 1. collect_area_menus.py 설정 수정
# QUERY = "별내동 식당"
# MAX_RESTAURANTS = 10
# 2. 메뉴 수집
python collect_area_menus.py
# 출력: data/menus_별내동_식당_20260205_181333.json
# 3. AI 분석
python analyze_menus.py data/menus_별내동_식당_20260205_181333.json
# 출력: data/analyzed_menus_별내동_식당_20260205_184835.json
# 4. 결과 확인
cat data/analyzed_menus_별내동_식당_20260205_184835.json | jq '.metadata'# 1. 강남역 식당 50개 수집
# QUERY = "강남역 식당"
# MAX_RESTAURANTS = 50
python collect_area_menus.py
# 2. AI 분석
python analyze_menus.py data/menus_강남역_식당_최신.json
# 3. CompleteVegan 메뉴만 필터링
cat data/analyzed_menus_강남역_식당_최신.json | \
jq '.restaurants[].menus[] | select(.analysis.vegetarian_type.category == "CompleteVegan")'# 이미지 분석 제외 (2배 빠름)
python analyze_menus.py data/menus_홍대_식당_최신.json --no-image[collect_area_menus.py] env 파일에 추가:
CLIENT_ID = "YOUR_NAVER_CLIENT_ID"
CLIENT_SECRET = "YOUR_NAVER_CLIENT_SECRET"발급 방법:
- https://developers.naver.com/apps/#/register
- 애플리케이션 등록
- "검색" API 선택
[analyze_menus.py] env 파일에 추가:
api_key = "sk-proj-YOUR_OPENAI_API_KEY"| 식당 수 | 소요 시간 | 비용 |
|---|---|---|
| 10개 | 3분 | 무료 (네이버 API 무료) |
| 50개 | 15분 | 무료 |
| 100개 | 30분 | 무료 |
| 메뉴 수 | 이미지 포함 | 소요 시간 | 비용 (GPT-4o-mini) |
|---|---|---|---|
| 10개 | 예 | 2분 | $0.01~0.03 |
| 10개 | 아니오 | 1분 | $0.005~0.01 |
| 100개 | 예 | 20분 | $0.10~0.30 |
| 100개 | 아니오 | 10분 | $0.05~0.10 |
Q: Place ID 추출 실패
- 인터넷 연결 확인
delay_between_requests증가 (3 → 5초)- Playwright 재설치:
playwright install chromium
Q: 이미지 URL 수집 안 됨
- IMAGE_URL_FIX.md 참고
- 코드가 이미 수정되어 있음
Q: OpenAI API 오류
- API 키 확인
- 사용량 제한 확인
- 모델 availability 확인
Q: 분류가 부정확함
- prompts/classify_vegetarian_type.txt 수정
- 분류 기준 명확화
- 예시 추가
이 프로젝트는 VeganScan MVP의 일부입니다.
이 프로젝트는 Lightrain 팀 프로젝트입니다.