새로 오픈한 음식점, 미용실 등과 같은 업체의 정보를 가장 빠르게 받고 싶다는 요구사항을 받아서 개발을 시작.
네이버에서는 '새로 오픈했어요' 라는 코너를 네이버 검색 시에 제공하고 있다.
'신현리 맛집' 검색결과
__________________________________________________________________________________________________________________
__________________________________________________________________________________________________________________
이는 검색어 규칙을 '지역명 + 업종' 으로 검색하면 네이버에서 표시해주는 코너로 새로 사업자등록을 한지 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 저장하고, 스케쥴러 돌려가면서 확인해보면 된다!
댓글 ( 4)
댓글 남기기