Today's

길을 나서지 않으면 그 길에서 만날 수 있는 사람을 만날 수 없다

파이썬 스크립트

네이버 맛집 정보 수집 + 소형 AI JSON 변환 기획서

Billcorea 2026. 7. 21. 22:45

네이버 맛집 정보 수집 + 소형 AI JSON 변환 기획서

1. 목표

  • 키워드 성시경 맛집으로 네이버 검색을 수행한다.
  • 검색 결과 목록의 요약문이 아닌, 각 결과의 상세 링크 페이지를 순회한다.
  • 상세 페이지에서 맛집 관련 텍스트를 추출/정제한다.
  • 라즈베리파이에서 구동 가능한 소형 모델(Qwen GGUF)을 사용해 정보를 구조화하고, 최종적으로 JSON 스키마로 출력한다.

2. 현재 문제와 개선 방향

  • 현재 구현은 검색 결과 페이지의 snippet만 읽어서 정보 밀도가 낮다.
  • 개선안은 다음 2단계 수집으로 전환한다.
  1. 검색 결과 페이지에서 상세 링크 목록 수집
  2. 각 상세 링크 페이지 본문에서 텍스트 수집 후 AI 분석

3. 전체 처리 파이프라인

  1. 검색 요청
    • Query: 성시경 맛집
    • User-Agent 포함
  2. 상세 링크 추출
    • 네이버 검색 결과 DOM에서 외부/내부 상세 링크 URL 수집
    • 광고/쇼핑/중복 링크 제거
  3. 상세 페이지 크롤링
    • 링크별 HTML 요청
    • title, 본문 후보(article, main, 블로그 본문 영역 등) 추출
  4. 텍스트 정제
    • 공백/줄바꿈 정규화
    • 메뉴판/가격/주소/전화 패턴 우선 보존
    • 페이지별 길이 제한 (메모리 보호)
  5. AI 구조화
    • 소형 Qwen 모델로 스키마 기반 정보 추출
    • page 단위 1차 JSON 생성
  6. 통합/중복 제거
    • 상호명+주소 기준 유사 항목 병합
  7. 최종 출력
    • restaurants 배열 JSON으로 저장/출력

4. 권장 JSON 스키마

{
  "query": "성시경 맛집",
  "generated_at": "ISO-8601 datetime",
  "restaurants": [
    {
      "name": "상호명",
      "address": "주소",
      "contact": "연락처",
      "menus": ["메뉴1", "메뉴2"],
      "review_summary": "리뷰 요약",
      "source_url": "정보를 추출한 상세 페이지 URL"
    }
  ]
}

5. 라즈베리파이 소형 모델 전략

  • 우선 모델: Qwen/Qwen2.5-0.5B-Instruct-GGUF
  • 권장 파일: qwen2.5-0.5b-instruct-q4_k_m.gguf
  • 이유: 낮은 메모리 사용량, 구조화 추출 작업에 충분한 품질

추론 권장 설정(초안)

  • n_ctx: 1024~2048
  • n_threads: 라즈베리파이 CPU 코어 수 기반(예: 4)
  • temperature: 0.0 (형식 안정성 우선)
  • 출력 실패 시 재시도: 프롬프트에 “JSON만 출력” 강제 후 1회 재시도

6. Hugging Face에서 Qwen 모델 설치/다운로드

6.1 Python 패키지 설치

pip install --upgrade huggingface_hub llama-cpp-python requests beautifulsoup4

6.2 모델 다운로드 코드

from huggingface_hub import hf_hub_download

model_path = hf_hub_download(
    repo_id="Qwen/Qwen2.5-0.5B-Instruct-GGUF",
    filename="qwen2.5-0.5b-instruct-q4_k_m.gguf"
)
print(model_path)

6.3 모델 로드 예시

from llama_cpp import Llama

llm = Llama(
    model_path=model_path,
    n_ctx=1024,
    n_threads=4,
    verbose=False
)

7. 크롤링/분석 구현 포인트

  • 링크 수집 개수 제한: 예) 상위 10~20개 상세 링크
  • 요청 간 지연: 예) 0.5~1.0초(과도 요청 방지)
  • 타임아웃/실패 처리: 실패 링크는 스킵하고 로그 기록
  • 본문 선택자 다중 전략:
    • article, main, .se-main-container, #postViewArea 등 순차 시도
  • 페이지별 추출 결과를 먼저 JSON으로 저장(디버깅 용이)

8. 프롬프트 설계 방향

  • System Prompt:
    • “맛집 정보 추출기”
    • “설명문 금지, JSON만 출력”
    • “스키마 외 키 금지”
  • User Prompt:
    • 페이지 URL + 정제 텍스트 전달
    • 필드별 누락 허용 규칙(null 또는 "") 명시

9. 품질 기준(Definition of Done)

  • 상세 링크 기반으로 최소 N개(예: 5개 이상) 식당 후보가 JSON에 채워짐
  • JSON 파싱 100% 성공(실패 시 재시도 로직으로 보완)
  • 각 항목에 name 또는 address 중 최소 1개 이상 유효값 존재
  • source_url 추적 가능

10. 개발 단계 제안

  1. 링크 수집기 구현/검증
  2. 상세 페이지 본문 추출기 구현/검증
  3. Qwen JSON 추출 파이프라인 연결
  4. 병합/중복 제거 및 최종 JSON 생성
  5. 오류 처리/재시도/로그 보강

11. 주의사항

  • 사이트 이용정책/robots.txt/요청 빈도 제한을 준수한다.
  • 개인 정보 또는 민감 정보는 저장/출력하지 않는다.
  • 모델 출력은 신뢰도 한계가 있으므로 원문 URL 추적 필드를 유지한다.
반응형