티스토리 뷰
새로 오픈한 음식점, 미용실 등과 같은 업체의 정보를 가장 빠르게 받고 싶다는 요구사항을 받아서 개발을 시작.
네이버에서는 '새로 오픈했어요' 라는 코너를 네이버 검색 시에 제공하고 있다.
'신현리 맛집' 검색결과
__________________________________________________________________________________________________________________
__________________________________________________________________________________________________________________
이는 검색어 규칙을 '지역명 + 업종' 으로 검색하면 네이버에서 표시해주는 코너로 새로 사업자등록을 한지 90일이 지나지 않은 사업자만 표시해주는 곳이다.
__________________________________________________________________________________________________________________
https://help.naver.com/support/contents/contents.nhn?serviceNo=607&categoryNo=16664
(네이버 스마트플레이스 고객센터)
__________________________________________________________________________________________________________________
이를 이용하면 편하게 새로 생긴 업체를 찾을 수 있을 것 같다.
본격적으로 API를 찾기 시작!
처음에는 데스크탑용 페이지를 찾아가면서 API 를 찾아보려 했지만, 역시 데스크톱페이지는 API 를 쓰고있지 않았다.
HTML 파싱을 해야하나.. 그럼 속도가 느릴텐데 라고 생각했다가 모바일에서는 뭔가 다르지 않을까 싶어서 한번 해봤는데 대박! 찾았다.
크롬의 개발자도구에서 모바일 모드를 통해서 진입한 후 목록에서 '더보기' 를 눌러보면!!
__________________________________________________________________________________________________________________
빙고! json 수신 완료
------------------ 요청 URL ------------------------------------------
https://m.store.naver.com/sogum/api/businesses?filterId=s11556055&filterOpening=true&query=%EC%8B%A0%ED%98%84%EB%A6%AC%20%EB%A7%9B%EC%A7%91&start=1&display=1000
------------------ 응답 JSON (너무 길어서 중간 생략함) ---------------------
{
"query": {
"select": "1",
"item": [
{
"rank": "1",
"region_keyword": "홍대",
"region_type": "favor",
"region_info": {
"name": "홍익대학교",
"fkey": "2880",
"x": "1269255395",
"y": "375512063",
"spot_id": "11556055",
"bmap": "0",
"coordinates": {
"coordinate": [
{
"x": "126.9157455",
"y": "37.5484201"
},
{
"x": "126.9276845",
"y": "37.5475051"
},
{
"x": "126.9309495",
"y": "37.5558133"
},
{
"x": "126.9239635",
"y": "37.5602861"
},
{
"x": "126.9140217",
"y": "37.5545948"
},
{
"x": "126.9140217",
"y": "37.5545948"
}
]
}
},
"biz_type": "category",
"biz": "맛집",
"coordinate_mode": "0"
},
{
"rank": "2",
"region_keyword": "",
"region_type": "none",
"region_info": "",
"biz_type": "unknown",
"biz": "홍대 맛집",
"coordinate_mode": "0"
}
],
"type": "local",
"petrol": "0",
"global_menu": "0"
},
"total": 130,
"items": [
{
"id": "1502423166",
"name": "서교 스테이크",
"businessCategory": "restaurant",
"dbType": "drt",
"category": "스테이크,립",
"desc": "",
"hasBooking": false,
"x": "126.9212626",
"y": "37.5499536",
"distance": "5369.93",
"imageSrc": "http://ldb.phinf.naver.net/20180322_179/1521695761033kKIJh_JPEG/fQynU9LFJN48GcSgnS_0T7Rt.JPG.jpg",
"imageCount": 9,
"virtualPhone": "0507-1324-7222",
"phone": "02-3144-7222",
"routeUrl": "http://m.map.naver.com/viewer/route.nhn?ename=%EC%84%9C%EA%B5%90%20%EC%8A%A4%ED%85%8C%EC%9D%B4%ED%81%AC&ex=126.9212626&ey=37.5499536&edid=1502423166",
"streetViewUrl": "http://m.map.naver.com/viewer/panorama.nhn?street=on&pinType=site&pinId=1502423166",
"street_panorama": "tSqDUipWSxYt00UA8GSHDg==,83.61,0.00,126.9211295,37.5499386,120",
"roadAddr": "서울 마포구 어울마당로 56",
"commonAddr": "서울 마포구",
"addr": "서교동 408-8",
"blogCafeReviewCount": "2",
"bookingReviewCount": "0",
"moreUGCReviewsPath": "/restaurants/fsasReviews?id=1502423166&name=%EC%84%9C%EA%B5%90%20%EC%8A%A4%ED%85%8C%EC%9D%B4%ED%81%AC&category=restaurant",
"moreFsasReviewsPath": "/restaurants/fsasReviews?id=1502423166&name=%EC%84%9C%EA%B5%90%20%EC%8A%A4%ED%85%8C%EC%9D%B4%ED%81%AC&category=restaurant",
"priceCategory": "2만원 대"
},
{
"id": "1015799929",
"name": "신봉자 푸드스테이션",
"businessCategory": "restaurant",
"dbType": "drt",
"category": "종합분식",
"desc": "",
"hasBooking": false,
"x": "126.9214822",
"y": "37.5530217",
"distance": "5243.18",
"imageSrc": "http://ldb.phinf.naver.net/20180112_5/1515763454068cFyK9_JPEG/Lwn1D0hx7I6BHYRJENrvwsAN.jpg",
"imageCount": 2,
"phone": "02-451-8615",
"routeUrl": "http://m.map.naver.com/viewer/route.nhn?ename=%EC%8B%A0%EB%B4%89%EC%9E%90%20%ED%91%B8%EB%93%9C%EC%8A%A4%ED%85%8C%EC%9D%B4%EC%85%98&ex=126.9214822&ey=37.5530217&edid=1015799929",
"streetViewUrl": "http://m.map.naver.com/viewer/panorama.nhn?street=on&pinType=site&pinId=1015799929",
"street_panorama": "9WeVDpcjgJ66WbETrwScqQ==,34.39,0.00,126.9214391,37.5529587,120",
"roadAddr": "서울 마포구 양화로16길 33 나동",
"commonAddr": "서울 마포구",
"addr": "서교동 357-3",
"blogCafeReviewCount": "9",
"bookingReviewCount": "0",
"moreUGCReviewsPath": "/restaurants/fsasReviews?id=1015799929&name=%EC%8B%A0%EB%B4%89%EC%9E%90%20%ED%91%B8%EB%93%9C%EC%8A%A4%ED%85%8C%EC%9D%B4%EC%85%98&category=restaurant",
"moreFsasReviewsPath": "/restaurants/fsasReviews?id=1015799929&name=%EC%8B%A0%EB%B4%89%EC%9E%90%20%ED%91%B8%EB%93%9C%EC%8A%A4%ED%85%8C%EC%9D%B4%EC%85%98&category=restaurant"
}
],
"nlu": {
"queryType": "restaurant",
"queryResult": {
"type": "맛집",
"spot": "홍익대학교:2880:1269157455^375484201^1269276845^375475051^1269309495^375558133^1269239635^375602861^1269140217^375545948^1269140217^375545948:0:09440115:1269255395^375512063:09440115:11556055",
"q": "홍대 맛집",
"keyword": "홍대 맛집",
"showLocationBarFlag": false,
"spotQuery": "홍대",
"ptn0": "맛집",
"queryType": "restaurant",
"priority": "high",
"repSpot": "홍익대학교",
"spotId": "11556055",
"selectedSpotIndex": 0,
"selectedSpot": {
"name": "홍익대학교",
"index": 0
},
"otherSpots": [],
"location": {
"x": "126.9783880",
"y": "37.5666100",
"default": false,
"longitude": "126.9783880",
"latitude": "37.5666100"
},
"dbKeyword": {
"isDefault": true,
"name": "홍대맛집",
"type": "restaurant",
"getType": "search",
"viewType": "1col",
"useFilter": true,
"hasComponents": false
},
"dbQuery": {
"isDefault": true,
"name": "홍대맛집",
"type": "restaurant",
"getType": "search",
"viewType": "1col",
"useFilter": true,
"hasComponents": false
}
},
"user": {},
"deviceInfo": {
"os": "pc",
"ie": "0",
"version": 0
}
}
}
__________________________________________________________________________________________________________________
숨겨진 URL의 규칙은 간단했다
- host URL
https://m.store.naver.com/sogum/api/businesses
- request field
filterOpening : true
query : %EC%8B%A0%ED%98%84%EB%A6%AC%20%EB%A7%9B%EC%A7%91
start : 1
display : 1000
- request field 설명
filterOpening : 이게 true 로 설정되어야 '새로 오픈했어요' 카테고리가 적용된다!
query : 지역명 + 업종이다. 위 예제에서는 '신현리 맛집' 이다.
https://meyerweb.com/eric/tools/dencoder/
위 사이트를 통해서 원하는 검색어를 입력 후 'encode' 버튼을 누르면 인코딩 된 값이 나온다.
start : 표시할 리스트의 첫시작 인덱스이다. 간단하게 말해서 전체 업체가 20개가 있는데 이 start가 5라고 하면 5번째업체부터 리스트를 보여준다. 즉 앞에 1부터 4까지의 4개 업체가 생략된다.
display : 표시할 전체 갯수이다. 네이버 api 에서는 이 값의 리미트가 1000으로 셋팅되어있어서 최대 1000개로 적으면 된다.
이걸 postman 을 통해서 조회해보자
__________________________________________________________________________________________________________________
__________________________________________________________________________________________________________________
나이스하다!
이제 이걸 토대로 DB 저장하고, 스케쥴러 돌려가면서 확인해보면 된다!