Post

카카오 API 사용하여 지하철 역 주변 맛집 스크래이핑

카카오 API 사용하여 지하철 역 주변 맛집 스크래이핑

사전준비

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import numpy as np # 
import matplotlib.pyplot as plt # 시각화를 위해
import seaborn as sns # 시각화를 위해
########## 실행 후

# 한글 폰트 깨짐 방지 (시각화)
!sudo apt-get install -y fonts-nanum
!sudo fc-cache -fv
!rm ~/.cache/matplotlib -rf

############## 실행 후

import matplotlib.pyplot as plt
plt.rc('font', family='NanumBarunGothic')
plt.rcParams['axes.unicode_minus'] = False

kakao Developers > 문서 > 로컬 > 키워드로 장소 검색하기 url 준비

지하철 역 주변 맛집 스크래이핑, 간단한 시각화

스크래이핑

  • 키워드로 장소 검색

    스크래이핑 해서 데이터프레임으로 만들기

    ```python KEYWORLD_LOCAL_URL = “https://dapi.kakao.com/v2/local/search/keyword.json?query={}&page={}” # json : 응답 형식

headers = { “Authorization”: f”KakaoAK {REST_API_KEY}” }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
- requests.get(URL, page(개수), headers)
  - URL이랑 page(개수)같은 걸 params이라고 하는 거 같음. 더 알아보자
  
```python
# 맛집 검색할 역 이름 리스트
stations = ['성수역', '신촌역', '강남역']

# 지역 맛집 스크래이핑 함수
def scrap_staion_local_restaurant(station, page):
  response = requests.get(KEYWORLD_LOCAL_URL.format(station + "근처 맛집",page), headers = headers)
  data = response.json()["documents"]

  df = pd.DataFrame(datas)
  df = df.set_index("id")
  df["station"] = station
  return df

# 리스트 컴프리헨션
# 페이지 마다의 데이터프레임 객체를 리스트에 저장
df_list = [scrap_station_local_restaurant(station, page), for station in stations for page in range(1, 46)]

# 저장한 데이터프레임 리스트를 concat()함수로 병합 
df_total = pd.concat(df_list)
df_total.head()

카테고리 이름에서 내용 빼기

현재의 데이터프레임에서 category_name 내용이 음식점 > 양식 > 이탈리안 처럼 나타나있는데, 여기서 가운데 것만 분리한다.

1
2
# split으로 나눠서 list로 변환되고, lambda 함수를 적용시켜 두번째 값 선택
df_middle = df_total["category_name"].str.split(" > ").apply(lambda x : x[1])

시각화

위에서 나눈 카테고리별 개수 비교

1
2
3
4
5
6
7
import matplotlib.pyplot as plt
import seaborn as sns

plt.figure(figsize=(12, 8))

sns.countplot(data=df_total, x='middle_category', hue='station')
plt.show()
This post is licensed under CC BY 4.0 by the author.