Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 25 additions & 3 deletions CHANGELOG.json
Original file line number Diff line number Diff line change
@@ -1,11 +1,33 @@
{
"metadata": {
"lastUpdated": "2026-01-13T15:12:41Z",
"currentVersion": "0.1.2",
"lastUpdated": "2026-01-18T04:58:48Z",
"currentVersion": "0.1.3",
"projectType": "python",
"totalReleases": 3
"totalReleases": 4
},
"releases": [
{
"version": "0.1.3",
"project_type": "python",
"date": "2026-01-18",
"pr_number": 13,
"raw_summary": "## Summary by CodeRabbit\n\n## ์ƒˆ ๊ธฐ๋Šฅ\n\n* Google ์ง€๋„์™€ ๋„ค์ด๋ฒ„ ์ง€๋„์—์„œ ์žฅ์†Œ ์ •๋ณด๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์ˆ˜์ง‘ํ•˜๋Š” ๊ธฐ๋Šฅ ์ถ”๊ฐ€\n* ์ƒˆ๋กœ์šด API ์—”๋“œํฌ์ธํŠธ๋ฅผ ํ†ตํ•ด ๋‘ ์ง€๋„ ์„œ๋น„์Šค์—์„œ ์žฅ์†Œ๋ช… ๊ฒ€์ƒ‰ ์ง€์›\n* ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋กœ๋ถ€ํ„ฐ ์ฃผ์†Œ, ํ‰์ , ์˜์—… ์‹œ๊ฐ„, ์ „ํ™”๋ฒˆํ˜ธ, ์ด๋ฏธ์ง€ ๋“ฑ์˜ ์ƒ์„ธ ์ •๋ณด ์ถ”์ถœ",
"parsed_changes": {
"google_์ง€๋„์™€_๋„ค์ด๋ฒ„_์ง€๋„์—์„œ_์žฅ์†Œ_์ •๋ณด๋ฅผ_๊ฒ€์ƒ‰ํ•˜๊ณ _์ˆ˜์ง‘ํ•˜๋Š”_๊ธฐ๋Šฅ_์ถ”๊ฐ€": {
"title": "Google ์ง€๋„์™€ ๋„ค์ด๋ฒ„ ์ง€๋„์—์„œ ์žฅ์†Œ ์ •๋ณด๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์ˆ˜์ง‘ํ•˜๋Š” ๊ธฐ๋Šฅ ์ถ”๊ฐ€",
"items": []
},
"์ƒˆ๋กœ์šด_api_์—”๋“œํฌ์ธํŠธ๋ฅผ_ํ†ตํ•ด_๋‘_์ง€๋„_์„œ๋น„์Šค์—์„œ_์žฅ์†Œ๋ช…_๊ฒ€์ƒ‰_์ง€์›": {
"title": "์ƒˆ๋กœ์šด API ์—”๋“œํฌ์ธํŠธ๋ฅผ ํ†ตํ•ด ๋‘ ์ง€๋„ ์„œ๋น„์Šค์—์„œ ์žฅ์†Œ๋ช… ๊ฒ€์ƒ‰ ์ง€์›",
"items": []
},
"๊ฒ€์ƒ‰_๊ฒฐ๊ณผ๋กœ๋ถ€ํ„ฐ_์ฃผ์†Œ__ํ‰์ __์˜์—…_์‹œ๊ฐ„__์ „ํ™”๋ฒˆํ˜ธ__์ด๋ฏธ์ง€_๋“ฑ์˜_์ƒ์„ธ_์ •๋ณด_์ถ”์ถœ": {
"title": "๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋กœ๋ถ€ํ„ฐ ์ฃผ์†Œ, ํ‰์ , ์˜์—… ์‹œ๊ฐ„, ์ „ํ™”๋ฒˆํ˜ธ, ์ด๋ฏธ์ง€ ๋“ฑ์˜ ์ƒ์„ธ ์ •๋ณด ์ถ”์ถœ",
"items": []
}
},
"parse_method": "markdown"
},
{
"version": "0.1.2",
"project_type": "python",
Expand Down
16 changes: 14 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,19 @@
# Changelog

**ํ˜„์žฌ ๋ฒ„์ „:** 0.1.2
**๋งˆ์ง€๋ง‰ ์—…๋ฐ์ดํŠธ:** 2026-01-13T15:12:41Z
**ํ˜„์žฌ ๋ฒ„์ „:** 0.1.3
**๋งˆ์ง€๋ง‰ ์—…๋ฐ์ดํŠธ:** 2026-01-18T04:58:48Z

---

## [0.1.3] - 2026-01-18

**PR:** #13

**Google ์ง€๋„์™€ ๋„ค์ด๋ฒ„ ์ง€๋„์—์„œ ์žฅ์†Œ ์ •๋ณด๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์ˆ˜์ง‘ํ•˜๋Š” ๊ธฐ๋Šฅ ์ถ”๊ฐ€**

**์ƒˆ๋กœ์šด API ์—”๋“œํฌ์ธํŠธ๋ฅผ ํ†ตํ•ด ๋‘ ์ง€๋„ ์„œ๋น„์Šค์—์„œ ์žฅ์†Œ๋ช… ๊ฒ€์ƒ‰ ์ง€์›**

**๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋กœ๋ถ€ํ„ฐ ์ฃผ์†Œ, ํ‰์ , ์˜์—… ์‹œ๊ฐ„, ์ „ํ™”๋ฒˆํ˜ธ, ์ด๋ฏธ์ง€ ๋“ฑ์˜ ์ƒ์„ธ ์ •๋ณด ์ถ”์ถœ**

---

Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# MapSee-AI

<!-- ์ˆ˜์ •ํ•˜์ง€๋งˆ์„ธ์š” ์ž๋™์œผ๋กœ ๋™๊ธฐํ™” ๋ฉ๋‹ˆ๋‹ค -->
## ์ตœ์‹  ๋ฒ„์ „ : v0.1.1 (2026-01-11)
## ์ตœ์‹  ๋ฒ„์ „ : v0.1.2 (2026-01-13)

[์ „์ฒด ๋ฒ„์ „ ๊ธฐ๋ก ๋ณด๊ธฐ](CHANGELOG.md)

Expand Down
72 changes: 71 additions & 1 deletion src/apis/test_router.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@
"""
import logging
from fastapi import APIRouter
from pydantic import BaseModel
from pydantic import BaseModel, Field

from src.services.scraper.scrape_router import route_and_scrape
from src.services.scraper.platforms.naver_map_scraper import NaverMapScraper
from src.services.scraper.platforms.google_map_scraper import GoogleMapScraper

logger = logging.getLogger(__name__)
router = APIRouter(prefix="/api/test", tags=["ํ…Œ์ŠคํŠธ API"])
Expand All @@ -15,6 +17,16 @@ class ScrapeRequest(BaseModel):
url: str


class NaverMapSearchRequest(BaseModel):
"""๋„ค์ด๋ฒ„ ์ง€๋„ ๊ฒ€์ƒ‰ ์š”์ฒญ"""
query: str = Field(..., description="๊ฒ€์ƒ‰์–ด (์˜ˆ: ๋Š˜ํ‘ธ๋ฅธ๋ชฉ์žฅ)", min_length=1)


class GoogleMapSearchRequest(BaseModel):
"""๊ตฌ๊ธ€ ์ง€๋„ ๊ฒ€์ƒ‰ ์š”์ฒญ"""
query: str = Field(..., description="๊ฒ€์ƒ‰์–ด (์˜ˆ: ๋Š˜ํ‘ธ๋ฅธ๋ชฉ์žฅ)", min_length=1)


@router.post("/scrape", status_code=200)
async def scrape_url(request: ScrapeRequest):
"""
Expand All @@ -33,3 +45,61 @@ async def scrape_url(request: ScrapeRequest):
async def health_check():
"""์Šคํฌ๋ž˜ํ•‘ ํ…Œ์ŠคํŠธ API ์ƒํƒœ ํ™•์ธ"""
return {"status": "ok"}


@router.post("/naver-map", status_code=200)
async def scrape_naver_map(request: NaverMapSearchRequest):
"""
๋„ค์ด๋ฒ„ ์ง€๋„์—์„œ ์žฅ์†Œ ์ •๋ณด ์Šคํฌ๋ž˜ํ•‘

์žฅ์†Œ๋ช…์„ ๊ฒ€์ƒ‰ํ•˜์—ฌ ์ฒซ ๋ฒˆ์งธ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์˜ ์ƒ์„ธ ์ •๋ณด๋ฅผ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค.

- POST /api/test/naver-map
- Body: {"query": "๋Š˜ํ‘ธ๋ฅธ๋ชฉ์žฅ"}
- ์„ฑ๊ณต: 200 + NaverPlaceInfo
- ์‹คํŒจ: 4xx/5xx + ์—๋Ÿฌ ๋ฉ”์‹œ์ง€

์ถ”์ถœ ์ •๋ณด:
- ์žฅ์†Œ๋ช…, ์นดํ…Œ๊ณ ๋ฆฌ
- ๋ณ„์ , ๋ฆฌ๋ทฐ ์ˆ˜ (๋ฐฉ๋ฌธ์ž/๋ธ”๋กœ๊ทธ)
- ์ฃผ์†Œ, ์ง€ํ•˜์ฒ  ์ •๋ณด
- ์˜์—… ์ƒํƒœ, ์˜์—… ์‹œ๊ฐ„
- ์ „ํ™”๋ฒˆํ˜ธ, ํŽธ์˜์‹œ์„ค
"""
logger.info(f"๋„ค์ด๋ฒ„ ์ง€๋„ ์Šคํฌ๋ž˜ํ•‘ ์š”์ฒญ: query='{request.query}'")

scraper = NaverMapScraper()
result = await scraper.search_and_scrape(request.query)

logger.info(f"์Šคํฌ๋ž˜ํ•‘ ์™„๋ฃŒ: {result.name} ({result.place_id})")
return result


@router.post("/google-map", status_code=200)
async def scrape_google_map(request: GoogleMapSearchRequest):
"""
๊ตฌ๊ธ€ ์ง€๋„์—์„œ ์žฅ์†Œ ์ •๋ณด ์Šคํฌ๋ž˜ํ•‘

์žฅ์†Œ๋ช…์„ ๊ฒ€์ƒ‰ํ•˜์—ฌ ์ฒซ ๋ฒˆ์งธ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์˜ ์ƒ์„ธ ์ •๋ณด๋ฅผ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค.

- POST /api/test/google-map
- Body: {"query": "๋Š˜ํ‘ธ๋ฅธ๋ชฉ์žฅ"}
- ์„ฑ๊ณต: 200 + GooglePlaceInfo
- ์‹คํŒจ: 4xx/5xx + ์—๋Ÿฌ ๋ฉ”์‹œ์ง€

์ถ”์ถœ ์ •๋ณด:
- ์žฅ์†Œ๋ช…, ์นดํ…Œ๊ณ ๋ฆฌ
- ๋ณ„์ , ๋ฆฌ๋ทฐ ์ˆ˜
- ๊ฐ€๊ฒฉ๋Œ€, ์ฃผ์†Œ
- ์˜์—… ์ƒํƒœ, ์š”์ผ๋ณ„ ์˜์—… ์‹œ๊ฐ„
- ์ „ํ™”๋ฒˆํ˜ธ, Plus Code
- ์œ„๋„/๊ฒฝ๋„, ์›น์‚ฌ์ดํŠธ URL
- ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ URL
"""
logger.info(f"๊ตฌ๊ธ€ ์ง€๋„ ์Šคํฌ๋ž˜ํ•‘ ์š”์ฒญ: query='{request.query}'")

scraper = GoogleMapScraper()
result = await scraper.search_and_scrape(request.query)

logger.info(f"์Šคํฌ๋ž˜ํ•‘ ์™„๋ฃŒ: {result.name} ({result.place_id})")
return result
81 changes: 81 additions & 0 deletions src/models/google_place_info.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
"""src.models.google_place_info
๊ตฌ๊ธ€ ์ง€๋„ ์žฅ์†Œ ์ •๋ณด ์Šคํ‚ค๋งˆ
"""
from pydantic import BaseModel, Field


class GooglePlaceInfo(BaseModel):
"""
๊ตฌ๊ธ€ ์ง€๋„ ์žฅ์†Œ ์ƒ์„ธ ์ •๋ณด

๊ตฌ๊ธ€ ์ง€๋„ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์—์„œ ์ถ”์ถœํ•œ ์žฅ์†Œ ์ •๋ณด๋ฅผ ๋‹ด๋Š” ์Šคํ‚ค๋งˆ์ž…๋‹ˆ๋‹ค.
"""
# ๊ธฐ๋ณธ ์ •๋ณด
place_id: str = Field(..., description="๊ตฌ๊ธ€ Place ID (URL์—์„œ ์ถ”์ถœ)")
name: str = Field(..., description="์žฅ์†Œ๋ช…")
category: str | None = Field(default=None, description="์นดํ…Œ๊ณ ๋ฆฌ (์˜ˆ: ์ˆฏ๋ถˆ๊ตฌ์ด/๋ฐ”๋ฒ ํ์ „๋ฌธ์ )")

# URL ์ •๋ณด
google_map_url: str | None = Field(default=None, description="๊ตฌ๊ธ€ ์ง€๋„ ์ƒ์„ธ ํŽ˜์ด์ง€ URL")

# ์œ„์น˜ ์ •๋ณด
latitude: float | None = Field(default=None, description="์œ„๋„")
longitude: float | None = Field(default=None, description="๊ฒฝ๋„")
address: str | None = Field(default=None, description="์ฃผ์†Œ")
plus_code: str | None = Field(default=None, description="Plus Code (์˜ˆ: G35M+R3 ์„œ์šธํŠน๋ณ„์‹œ)")

# ํ‰์ /๋ฆฌ๋ทฐ
rating: float | None = Field(default=None, description="๋ณ„์  (0.0 ~ 5.0)")
review_count: int | None = Field(default=None, description="๋ฆฌ๋ทฐ ์ˆ˜")
price_level: str | None = Field(default=None, description="๊ฐ€๊ฒฉ๋Œ€ (์˜ˆ: โ‚ฉโ‚ฉโ‚ฉ)")

# ์˜์—… ์ •๋ณด
business_status: str | None = Field(default=None, description="์˜์—… ์ƒํƒœ (์˜ˆ: ์˜์—… ์ค‘)")
business_hours: dict[str, str] | None = Field(default=None, description="์š”์ผ๋ณ„ ์˜์—… ์‹œ๊ฐ„")

# ์—ฐ๋ฝ์ฒ˜/๋งํฌ
phone_number: str | None = Field(default=None, description="์ „ํ™”๋ฒˆํ˜ธ")
website_url: str | None = Field(default=None, description="์›น์‚ฌ์ดํŠธ URL")

# ๋ถ€๊ฐ€ ์ •๋ณด
description: str | None = Field(default=None, description="์žฅ์†Œ ์„ค๋ช…/์†Œ๊ฐœ")
amenities: list[str] = Field(default_factory=list, description="ํŽธ์˜์‹œ์„ค/์„œ๋น„์Šค ์˜ต์…˜")
popular_times: str | None = Field(default=None, description="์ธ๊ธฐ ์‹œ๊ฐ„๋Œ€ ์ •๋ณด")

# ์ด๋ฏธ์ง€
image_url: str | None = Field(default=None, description="๋Œ€ํ‘œ ์ด๋ฏธ์ง€ URL")
image_urls: list[str] = Field(default_factory=list, description="์ด๋ฏธ์ง€ URL ๋ชฉ๋ก (์ตœ๋Œ€ 10๊ฐœ)")

class Config:
json_schema_extra = {
"example": {
"place_id": "0x357ca44d6e36590b:0xc0019dfb09b9a4e2",
"name": "๋Š˜ํ‘ธ๋ฅธ๋ชฉ์žฅ ์ž ์‹ค๋ณธ์ ",
"category": "์ˆฏ๋ถˆ๊ตฌ์ด/๋ฐ”๋ฒ ํ์ „๋ฌธ์ ",
"google_map_url": "https://www.google.com/maps/place/...",
"latitude": 37.509573,
"longitude": 127.0826454,
"address": "์„œ์šธํŠน๋ณ„์‹œ ์†กํŒŒ๊ตฌ ๋ฐฑ์ œ๊ณ ๋ถ„๋กœ9๊ธธ 34",
"plus_code": "G35M+R3 ์„œ์šธํŠน๋ณ„์‹œ",
"rating": 4.2,
"review_count": 753,
"price_level": "โ‚ฉโ‚ฉโ‚ฉ",
"business_status": "์˜์—… ์ค‘",
"business_hours": {
"์ผ์š”์ผ": "24์‹œ๊ฐ„ ์˜์—…",
"์›”์š”์ผ": "PM 12:00~AM 12:00",
"ํ™”์š”์ผ": "PM 12:00~AM 12:00",
"์ˆ˜์š”์ผ": "PM 12:00~AM 12:00",
"๋ชฉ์š”์ผ": "PM 12:00~AM 12:00",
"๊ธˆ์š”์ผ": "PM 12:00~AM 12:00",
"ํ† ์š”์ผ": "PM 12:00~AM 12:00"
},
"phone_number": "02-3431-4520",
"website_url": "https://example.com",
"description": "๋œ์žฅ์ฐŒ๊ฐœ์™€ ๋ƒ‰๋ฉด์œผ๋กœ ์™„์„ฑํ•˜๋Š” ํ•œ์ƒ์ฐจ๋ฆผ",
"amenities": ["๋งค์žฅ ๋‚ด ์‹์‚ฌ", "ํ…Œ์ดํฌ์•„์›ƒ", "๋ฐฐ๋‹ฌ"],
"popular_times": "์˜คํ›„ 7์‹œ~9์‹œ ๊ฐ€์žฅ ๋ถ๋น”",
"image_url": "https://lh5.googleusercontent.com/...",
"image_urls": ["https://...", "https://..."]
}
}
87 changes: 87 additions & 0 deletions src/models/naver_place_info.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
"""src.models.naver_place_info
๋„ค์ด๋ฒ„ ์ง€๋„ ์žฅ์†Œ ์ •๋ณด ์Šคํ‚ค๋งˆ
"""
from pydantic import BaseModel, Field


class NaverPlaceInfo(BaseModel):
"""
๋„ค์ด๋ฒ„ ์ง€๋„ ์žฅ์†Œ ์ƒ์„ธ ์ •๋ณด

๋„ค์ด๋ฒ„ ์ง€๋„ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์—์„œ ์ถ”์ถœํ•œ ์žฅ์†Œ ์ •๋ณด๋ฅผ ๋‹ด๋Š” ์Šคํ‚ค๋งˆ์ž…๋‹ˆ๋‹ค.
"""
# ๊ธฐ๋ณธ ์ •๋ณด
place_id: str = Field(..., description="๋„ค์ด๋ฒ„ Place ID")
name: str = Field(..., description="์žฅ์†Œ๋ช…")
category: str | None = Field(default=None, description="์นดํ…Œ๊ณ ๋ฆฌ (์˜ˆ: ์†Œ๊ณ ๊ธฐ๊ตฌ์ด)")

# URL ์ •๋ณด (๋ผ์šฐํŒ…์šฉ)
naver_map_url: str | None = Field(default=None, description="๋„ค์ด๋ฒ„ ์ง€๋„ ์ƒ์„ธ ํŽ˜์ด์ง€ URL")

# ์œ„์น˜ ์ •๋ณด
latitude: float | None = Field(default=None, description="์œ„๋„")
longitude: float | None = Field(default=None, description="๊ฒฝ๋„")
address: str | None = Field(default=None, description="์ฃผ์†Œ")
road_address: str | None = Field(default=None, description="๋„๋กœ๋ช… ์ฃผ์†Œ")
subway_info: str | None = Field(default=None, description="์ง€ํ•˜์ฒ  ์ •๋ณด (์˜ˆ: ์ž ์‹ค์ƒˆ๋‚ด์—ญ 4๋ฒˆ ์ถœ๊ตฌ์—์„œ 412m)")
directions_text: str | None = Field(default=None, description="์ฐพ์•„๊ฐ€๋Š” ๊ธธ ์„ค๋ช…")

# ํ‰์ /๋ฆฌ๋ทฐ
rating: float | None = Field(default=None, description="๋ณ„์  (0.0 ~ 5.0)")
visitor_review_count: int | None = Field(default=None, description="๋ฐฉ๋ฌธ์ž ๋ฆฌ๋ทฐ ์ˆ˜")
blog_review_count: int | None = Field(default=None, description="๋ธ”๋กœ๊ทธ ๋ฆฌ๋ทฐ ์ˆ˜")

# ์˜์—… ์ •๋ณด
business_status: str | None = Field(default=None, description="์˜์—… ์ƒํƒœ (์˜ˆ: ์˜์—… ์ค‘)")
business_hours: str | None = Field(default=None, description="์˜์—… ์‹œ๊ฐ„ ์š”์•ฝ")
open_hours_detail: list[str] = Field(default_factory=list, description="์š”์ผ๋ณ„ ์ƒ์„ธ ์˜์—…์‹œ๊ฐ„")
holiday_info: str | None = Field(default=None, description="ํœด๋ฌด์ผ ์ •๋ณด")

# ์—ฐ๋ฝ์ฒ˜/๋งํฌ
phone_number: str | None = Field(default=None, description="์ „ํ™”๋ฒˆํ˜ธ")
homepage_url: str | None = Field(default=None, description="ํ™ˆํŽ˜์ด์ง€ URL")
reservation_available: bool = Field(default=False, description="์˜ˆ์•ฝ ๊ฐ€๋Šฅ ์—ฌ๋ถ€")

# ๋ถ€๊ฐ€ ์ •๋ณด
description: str | None = Field(default=None, description="ํ•œ์ค„ ์„ค๋ช…")
amenities: list[str] = Field(default_factory=list, description="ํŽธ์˜์‹œ์„ค ๋ชฉ๋ก")
keywords: list[str] = Field(default_factory=list, description="ํ‚ค์›Œ๋“œ/ํƒœ๊ทธ")
tv_appearances: list[str] = Field(default_factory=list, description="TV ๋ฐฉ์†ก ์ถœ์—ฐ ์ •๋ณด")
menu_info: list[str] = Field(default_factory=list, description="๋Œ€ํ‘œ ๋ฉ”๋‰ด")

# ์ด๋ฏธ์ง€
image_url: str | None = Field(default=None, description="๋Œ€ํ‘œ ์ด๋ฏธ์ง€ URL")
image_urls: list[str] = Field(default_factory=list, description="์ด๋ฏธ์ง€ URL ๋ชฉ๋ก (์ตœ๋Œ€ 10๊ฐœ)")

class Config:
json_schema_extra = {
"example": {
"place_id": "11679241",
"name": "๋Š˜ํ‘ธ๋ฅธ๋ชฉ์žฅ ์ž ์‹ค๋ณธ์ ",
"category": "์†Œ๊ณ ๊ธฐ๊ตฌ์ด",
"naver_map_url": "https://map.naver.com/p/search/๋Š˜ํ‘ธ๋ฅธ๋ชฉ์žฅ/place/11679241",
"latitude": 37.5112,
"longitude": 127.0867,
"address": "์„œ์šธ ์†กํŒŒ๊ตฌ ๋ฐฑ์ œ๊ณ ๋ถ„๋กœ9๊ธธ 34 1F",
"road_address": "์„œ์šธ ์†กํŒŒ๊ตฌ ๋ฐฑ์ œ๊ณ ๋ถ„๋กœ9๊ธธ 34 1F",
"subway_info": "์ž ์‹ค์ƒˆ๋‚ด์—ญ 4๋ฒˆ ์ถœ๊ตฌ์—์„œ 412m",
"directions_text": "์ž ์‹ค์ƒˆ๋‚ด์—ญ 4๋ฒˆ ์ถœ๊ตฌ์—์„œ ๋งฅ๋„๋„๋“œ ๊ณจ๋ชฉ ๋ผ๊ณ ...",
"rating": 4.42,
"visitor_review_count": 1510,
"blog_review_count": 1173,
"business_status": "์˜์—… ์ค‘",
"business_hours": "24:00์— ์˜์—… ์ข…๋ฃŒ",
"open_hours_detail": ["์›” 11:30 - 24:00", "ํ™” 11:30 - 24:00"],
"holiday_info": "์—ฐ์ค‘๋ฌดํœด",
"phone_number": "02-3431-4520",
"homepage_url": "http://example.com",
"reservation_available": True,
"description": "๋œ์žฅ์ฐŒ๊ฐœ์™€ ๋ƒ‰๋ฉด์œผ๋กœ ์™„์„ฑํ•˜๋Š” ํ•œ์ƒ์ฐจ๋ฆผ",
"amenities": ["๋‹จ์ฒด ์ด์šฉ ๊ฐ€๋Šฅ", "์ฃผ์ฐจ", "๋ฐœ๋ ›ํŒŒํ‚น"],
"keywords": ["์†Œ๊ณ ๊ธฐ", "ํ•œ์šฐ", "ํšŒ์‹"],
"tv_appearances": ["์ค„์„œ๋Š”์‹๋‹น 14ํšŒ (24.05.13)"],
"menu_info": ["๊ฒฝ์ฃผ๊ฐˆ๋น„์‚ด", "ํ•œ์šฐ๋œ์žฅ๋ฐฅ"],
"image_url": "https://...",
"image_urls": ["https://...", "https://..."]
}
}
Loading