Showing
1 changed file
with
153 additions
and
0 deletions
search_restaurant.py
0 → 100644
1 | +# kakao local api 컨트롤러 참고자료: https://wooiljeong.github.io/python/kakao_local_api/ | ||
2 | +# 파이썬 json 특정값 추출 참고자료: https://hashcode.co.kr/questions/8852/%ED%8C%8C%EC%9D%B4%EC%8D%AC-json-%ED%8A%B9%EC%A0%95%EA%B0%92-%EC%B6%94%EC%B6%9C | ||
3 | +import json | ||
4 | +import requests | ||
5 | +from pprint import pprint | ||
6 | +from io import StringIO #return_print 하기 위해 | ||
7 | + | ||
8 | +class KakaoLocalAPI: | ||
9 | + """ | ||
10 | + Kakao Local API 컨트롤러 | ||
11 | + """ | ||
12 | + | ||
13 | + def __init__(self, rest_api_key): | ||
14 | + """ | ||
15 | + Rest API키 초기화 및 기능 별 URL 설정 | ||
16 | + """ | ||
17 | + | ||
18 | + | ||
19 | + # REST API 키 설정 | ||
20 | + self.rest_api_key = "1c74642c092d28c438467486c366c6cf" | ||
21 | + self.headers = {"Authorization": "KakaoAK {}".format(rest_api_key)} | ||
22 | + | ||
23 | + # 서비스 URL 설정 | ||
24 | + | ||
25 | + | ||
26 | + # 05 키워드 검색 | ||
27 | + self.URL_05 = "https://dapi.kakao.com/v2/local/search/keyword.json" | ||
28 | + | ||
29 | + | ||
30 | + def search_keyword(self,query,category_group_code=None,x=None,y=None,radius=None,rect=None,page=None,size=None,sort=None): | ||
31 | + """ | ||
32 | + 05 키워드 검색 | ||
33 | + """ | ||
34 | + #params = {'query': f"{query}", | ||
35 | + # 'x': f"{x}", | ||
36 | + # 'y': f"{y}"} | ||
37 | + | ||
38 | + params = {'query': f"{query}", | ||
39 | + 'x': f"{x}", | ||
40 | + 'y': f"{y}",} | ||
41 | + | ||
42 | + if radius != None: | ||
43 | + params['radius'] = f"{radius}" | ||
44 | + if rect != None: | ||
45 | + params['rect'] = f"{rect}" | ||
46 | + if page != None: | ||
47 | + params['page'] = f"{page}" | ||
48 | + if size != None: | ||
49 | + params['size'] = f"{params}" | ||
50 | + if sort != None: | ||
51 | + params['sort'] = f"{sort}" | ||
52 | + | ||
53 | + res = requests.get(self.URL_05, headers=self.headers, params=params) | ||
54 | + document = json.loads(res.text) | ||
55 | + return document | ||
56 | + | ||
57 | + | ||
58 | +# REST API 키 | ||
59 | +rest_api_key = "1c74642c092d28c438467486c366c6cf" | ||
60 | +kakao = KakaoLocalAPI(rest_api_key) | ||
61 | + | ||
62 | +## Set params | ||
63 | +query = "인덕원 닭갈비" #검색 키워드 | ||
64 | +x = 126.98083352703802 #내 위치 위도와 경도 | ||
65 | +y = 37.39403042340368 | ||
66 | +radius = 1 #반경 km 검색 | ||
67 | + | ||
68 | + | ||
69 | +## Request | ||
70 | +result_5 = kakao.search_keyword(query,x,y,radius) | ||
71 | + | ||
72 | + | ||
73 | + | ||
74 | + | ||
75 | + | ||
76 | + | ||
77 | + | ||
78 | +# + json파일 확인해보기 이후 데이터를 추출해야함 | ||
79 | +#json_string = json.dumps(result_5, indent=2) | ||
80 | +#print(json_string) | ||
81 | + | ||
82 | + | ||
83 | + | ||
84 | + | ||
85 | +#json파일 특정 키워드 추출 | ||
86 | +#추출할 리스트 place_name, place_url, x, y (x y는 위치임), 검색키워드, 선택 지역(위치) | ||
87 | +#from pprint import pprint | ||
88 | + | ||
89 | +same_name_list = [ x_ for x_ in result_5['meta']['same_name'].values()] | ||
90 | +keyword = "검색 키워드: " + same_name_list[0] | ||
91 | +selected_region= "검색 위치: " +same_name_list[2] | ||
92 | + | ||
93 | +total_count = {result_5['meta']['total_count']} #set은 파싱이 불가능하기 때문에 list나 튜플로 바꿔야함, list로 바꾼 후 인덱스를 활용하여 int로 바꾼 후 문자열과 더하기 위해 str로 형변환 | ||
94 | +total_count_list=list(total_count) | ||
95 | +total_count = "총 검색 개수: " + str(total_count_list[0]) | ||
96 | +#print(keyword) #메제지들은 텔레그렘 봇으로 보내기!! | ||
97 | +#print(selected_region) | ||
98 | +#print(total_count) | ||
99 | + | ||
100 | +#print("----------") | ||
101 | + | ||
102 | +place_name_list = [ x_['place_name'] for x_ in result_5['documents']] | ||
103 | +#print(place_name_list) | ||
104 | + | ||
105 | +#print('------') | ||
106 | + | ||
107 | +phone_list = [ x_['phone'] for x_ in result_5['documents']] | ||
108 | +#print(phone_list) | ||
109 | + | ||
110 | +#print('------') | ||
111 | + | ||
112 | +place_url_list = [ x_['place_url'] for x_ in result_5['documents']] | ||
113 | +#print(place_url_list) | ||
114 | + | ||
115 | +#print('------') | ||
116 | + | ||
117 | +#print(x_list) 위치 시각화 할때 사용 | ||
118 | +x_list = [ x_['x'] for x_ in result_5['documents']] | ||
119 | +y_list = [ x_['y'] for x_ in result_5['documents']] | ||
120 | +#print(y_list) | ||
121 | +#print(x_list) | ||
122 | + | ||
123 | +#print('------') | ||
124 | + | ||
125 | +road_address_name_list = [ x_['road_address_name'] for x_ in result_5['documents']] | ||
126 | +#print(road_address_name_list) | ||
127 | + | ||
128 | +#print('------') | ||
129 | + | ||
130 | + | ||
131 | +resturant_info_list = [] | ||
132 | +total_count_num = str(total_count_list[0]) | ||
133 | +total_count_num = int(total_count_num) | ||
134 | +resturant_info = "[ 맛집 정보 ]" | ||
135 | + | ||
136 | +#프린트 결과를 리턴받기 위한 함수 | ||
137 | +#from io import StringIO | ||
138 | +def return_print(*message): | ||
139 | + io = StringIO() | ||
140 | + print(*message, file=io, end="") | ||
141 | + return io.getvalue() | ||
142 | + | ||
143 | +print(resturant_info) # 봇 메세지 ㄱㄱ | ||
144 | + | ||
145 | +for i in range(0,10): #total_count_num가 너무 크면 인덱스 범위가 벗어나서 실행이 안됨, 임시로 5개까지만 | ||
146 | + resturant_info_print = print([place_name_list[i] + " " +phone_list[i] + " " + road_address_name_list[i] + " " + place_url_list[i]]) | ||
147 | + #resturant_info_list = [place_name_list[i] + " " +phone_list[i] + " " + road_address_name_list[i] + " " + place_url_list[i]] | ||
148 | + #resturant_info += return_print(resturant_info_list) | ||
149 | + | ||
150 | + | ||
151 | + | ||
152 | + | ||
153 | + |
-
Please register or login to post a comment