import time
import sys
import os
import pandas as pd
import numpy as np
from selenium import webdriver
import chromedriver_autoinstaller
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
import warnings
warnings.filterwarnings('ignore')
# 검색어 입력
# guery = input('검색지역? ')
query = '부산 맛집'
path = chromedriver_autoinstaller.install()
driver = webdriver.Chrome(path)
driver.get(f"https://map.naver.com/v5/search/{query}?c=14203933.7141038,4562681.4505997,10,0,0,0,dh")
# 검색결과 iframe 접근
driver.switch_to.frame("searchIframe")
# 처음 돌릴 땐 자료 60개 수집..
# 1페이지로 돌아간 뒤 한번 더 돌리면 300개 정도 추출됨 (검색 결과 많은 경우)
title_list = []
f_data_list = []
try:
for i in range(1,7):
driver.find_element_by_link_text(str(i)).click()
try:
for j in range(3,70,3):
element = driver.find_elements_by_css_selector('.OXiLu')[j]
ActionChains(driver).move_to_element(element).key_down(Keys.PAGE_DOWN).key_up(Keys.PAGE_DOWN).perform()
except:
pass
title_raw = driver.find_elements_by_css_selector(".OXiLu")
for title in title_raw:
title = title.text
title_list.append(title)
# 평점 등 데이터
data_raw = driver.find_elements_by_css_selector('._17H46')
for data in data_raw:
data = data.text
f_data_list.append(data)
except:
pass
print(len(title_list),len(f_data_list))
304 304
## 데이터 프레임 만들기
df = pd.DataFrame({'title':title_list, 'data':f_data_list})
df
title | data | |
---|---|---|
0 | 카페 린 | 영업 종료\n별점\n4.82방문자리뷰 110블로그리뷰 28 |
1 | 레아파티쓰리 | 영업 종료\n별점\n4.84방문자리뷰 37블로그리뷰 22 |
2 | 해운대암소갈비집 | 별점\n4.22방문자리뷰 3,465블로그리뷰 2,675 |
3 | 해운대 가야밀면 | 영업 종료\n별점\n4.54방문자리뷰 4,366블로그리뷰 5,010 |
4 | 파크하얏트부산호텔 | 별점\n4.67방문자리뷰 807블로그리뷰 4,095 |
... | ... | ... |
299 | 할매집 | 영업 종료\n별점\n4.37방문자리뷰 409블로그리뷰 283 |
300 | 오후의홍차 | 영업 종료\n별점\n4.71방문자리뷰 4,306블로그리뷰 1,185 |
301 | 회전초밥갓파스시 덕천점 | 별점\n4.31방문자리뷰 1,471블로그리뷰 249 |
302 | 할매집 | 영업 종료\n별점\n4.52방문자리뷰 1,055블로그리뷰 459 |
303 | 호찐빵 | 영업 종료\n별점\n4.38방문자리뷰 2,843블로그리뷰 614 |
304 rows × 2 columns
df['data'][0:10]
0 영업 종료\n별점\n4.82방문자리뷰 110블로그리뷰 28
1 영업 종료\n별점\n4.84방문자리뷰 37블로그리뷰 22
2 별점\n4.22방문자리뷰 3,465블로그리뷰 2,675
3 영업 종료\n별점\n4.54방문자리뷰 4,366블로그리뷰 5,010
4 별점\n4.67방문자리뷰 807블로그리뷰 4,095
5 영업 종료\n별점\n4.55방문자리뷰 2,327블로그리뷰 1,335
6 영업 종료\n별점\n4.44방문자리뷰 933블로그리뷰 1,850
7 영업 종료\n별점\n4.5방문자리뷰 2,303블로그리뷰 1,127
8 영업 종료\n별점\n4.3방문자리뷰 3,482블로그리뷰 3,312
9 영업 종료\n별점\n4.4방문자리뷰 3,567블로그리뷰 3,023
Name: data, dtype: object
# 별점 없는 데이터 인덱스 확인
d = df[~df['data'].str.contains('별점')].index
d
Int64Index([ 15, 23, 46, 49, 86, 101, 103, 115, 119, 147, 149, 158, 160,
165, 172, 178, 189, 191, 213, 219, 221, 226, 239, 245, 258, 266,
274, 282],
dtype='int64')
refined_df = df.drop(index=d, axis=0)
refined_df
title | data | |
---|---|---|
0 | 카페 린 | 영업 종료\n별점\n4.82방문자리뷰 110블로그리뷰 28 |
1 | 레아파티쓰리 | 영업 종료\n별점\n4.84방문자리뷰 37블로그리뷰 22 |
2 | 해운대암소갈비집 | 별점\n4.22방문자리뷰 3,465블로그리뷰 2,675 |
3 | 해운대 가야밀면 | 영업 종료\n별점\n4.54방문자리뷰 4,366블로그리뷰 5,010 |
4 | 파크하얏트부산호텔 | 별점\n4.67방문자리뷰 807블로그리뷰 4,095 |
... | ... | ... |
299 | 할매집 | 영업 종료\n별점\n4.37방문자리뷰 409블로그리뷰 283 |
300 | 오후의홍차 | 영업 종료\n별점\n4.71방문자리뷰 4,306블로그리뷰 1,185 |
301 | 회전초밥갓파스시 덕천점 | 별점\n4.31방문자리뷰 1,471블로그리뷰 249 |
302 | 할매집 | 영업 종료\n별점\n4.52방문자리뷰 1,055블로그리뷰 459 |
303 | 호찐빵 | 영업 종료\n별점\n4.38방문자리뷰 2,843블로그리뷰 614 |
276 rows × 2 columns
# # 방문자리뷰 없는 데이터 확인 (보통 다 있음)
# d = df[~df['data'].str.contains('방문자리뷰')].index
# d
# # 블로그리뷰 없는 데이터 있는지 확인 (보통 다 있음)
# d = df[~df['data'].str.contains('블로그리뷰')].index
# d
data_list = refined_df['data'].values.tolist()
data_list[0:5]
['영업 종료\n별점\n4.82방문자리뷰 110블로그리뷰 28',
'영업 종료\n별점\n4.84방문자리뷰 37블로그리뷰 22',
'별점\n4.22방문자리뷰 3,465블로그리뷰 2,675',
'영업 종료\n별점\n4.54방문자리뷰 4,366블로그리뷰 5,010',
'별점\n4.67방문자리뷰 807블로그리뷰 4,095']
for i in range(len(data_list)):
# 별점 숫자 앞 제거
data_list[i] = data_list[i].split('별점')[1]
data_list[i] = data_list[i].split('\n')[1]
# 나머지 한글 제거
data_list[i] = data_list[i].replace('방문자리뷰', '').replace('블로그리뷰','')
# 별점, 방문자리뷰, 저장수 분리
data_list[i] = data_list[i].split(' ')
# 각 요소 리스트로 만들기
rating = []
review = []
save = []
for i in range(len(data_list)):
rating.append(data_list[i][0])
review.append(data_list[i][1])
save.append(data_list[i][2])
# 새로운 df 만듦
naver_df = refined_df
# 컬럼 추가
naver_df['rating'] = rating
naver_df['review'] = review
naver_df['blog'] = save
# data 컬럼 삭제
naver_df = naver_df.drop(['data'], axis=1)
naver_df
title | rating | review | blog | |
---|---|---|---|---|
0 | 카페 린 | 4.82 | 110 | 28 |
1 | 레아파티쓰리 | 4.84 | 37 | 22 |
2 | 해운대암소갈비집 | 4.22 | 3,465 | 2,675 |
3 | 해운대 가야밀면 | 4.54 | 4,366 | 5,010 |
4 | 파크하얏트부산호텔 | 4.67 | 807 | 4,095 |
... | ... | ... | ... | ... |
299 | 할매집 | 4.37 | 409 | 283 |
300 | 오후의홍차 | 4.71 | 4,306 | 1,185 |
301 | 회전초밥갓파스시 덕천점 | 4.31 | 1,471 | 249 |
302 | 할매집 | 4.52 | 1,055 | 459 |
303 | 호찐빵 | 4.38 | 2,843 | 614 |
276 rows × 4 columns
## csv 저장
df.to_csv("naver({}).csv".format(query), encoding='utf-8-sig')