매장 기본 정보 파일을 가져옵니다.
매장 태그 → 매장명, 해당 매장의 태그들, 해당 태그에 대한 인원 수, 해당 매장의 리뷰 내용 데이터를 가져옵니다.
매장 리뷰 → 사용자id, 기타 정보(ex.예약없이/대기시간/일상/친구) 리뷰 내용, 날짜, 재방문 횟수, 태그


크롤링 할 데이터의 예시
코드 (매장 태그)
# 빈 리스트 생성
restaurant_name_list = []
category_name_list = []
price_list = []
# 반복해서 태그를 수집하기
for i in tqdm(range(0, len(res_df)), desc='진행 중', position=0, leave=True):
name = res_df['검색어'][i]
driver.get('<https://map.naver.com/p/search/{}>'.format(name))
time.sleep(3)
try :
if driver.find_elements(By.ID,'entryIframe') :
entryIframe = driver.find_element(By.ID,'entryIframe')
driver.switch_to.frame(entryIframe)
except :
pass
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
# 매장 정보에서 '리뷰'를 클릭하기 위해서 리뷰 href 속성을 가져온다.
try :
# '리뷰' 탭의 href 속성 가져오기
review_tab = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.XPATH, '//a[contains(text(), "리뷰")]'))
)
# 리뷰 탭의 a 주소 가져오기
review_url = review_tab.get_attribute('href')
if review_url == '<https://m.place.naver.com/my/policy/visitorReview>' :
continue
else :
driver.get(review_url)
time.sleep(2.2)
except :
continue
# # 리뷰 탭으로 이동합니다.
# driver.get(review_url)
# time.sleep(2.2)
try :
# 리뷰 탭에서 '더보기' 버튼을 클릭합니다.
more_button = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CSS_SELECTOR, 'a.dP0sq'))
)
more_button.click()
except :
pass
# 끝까지 스크롤을 합니다.
for _ in range(4):
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(1.5)
# HTML 추출
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
items = soup.select('ul.K4J9r li.MHaAm, ul.K4J9r li.MHaAm')
# 매장명/태그/인원수를 가져옵니다.
for item in items:
restaurant_name_list.append(name)
try :
category_name_list.append(item.text.split('"')[1])
price_list.append(int(''.join(filter(str.isdigit, item.text))))
except :
category_name_list.append( '리뷰 10개 미만')
price_list.append('')
# 차곡차곡 저장합니다.
data_list = {
'매장명': restaurant_name_list,
'tag': category_name_list,
'인원': price_list }
result_df = pd.DataFrame(data_list)
# 엑셀로 저장합니다.
result_df.to_excel(f'./data/restaurant_tag_data/restaurant_tag_df_{start_num}_{end_num}.xlsx', index=False)
진행 중: 100%|██████████| 300/300 [1:21:25<00:00, 16.29s/it]
# 폴더 안에 있는 엑셀 파일 하나로 합치기
import pandas as pd
import os
# 폴더 경로 설정
folder_path = './Data/restaurant_tag_data'
# 폴더 내의 모든 xlsx 파일 목록 가져오기
file_list = [f for f in os.listdir(folder_path) if f.endswith('.xlsx')]
# 빈 데이터프레임 리스트 생성
df_list = []
# 모든 xlsx 파일 읽어서 데이터프레임 리스트에 추가
for file_name in file_list:
file_path = os.path.join(folder_path, file_name)
xls = pd.ExcelFile(file_path)
for sheet_name in xls.sheet_names:
df = pd.read_excel(file_path, sheet_name=sheet_name)
df_list.append(df)
# 모든 데이터프레임을 하나로 합치기
combined_df = pd.concat(df_list, ignore_index=True)
# 결과를 새로운 xlsx 파일로 저장
output_file = 'combined_restaurant_tags.xlsx'
combined_df.to_excel(output_file, index=False)
print(f'All data has been combined and saved to {output_file}')
코드 (매장 리뷰)
# 빈 리스트 생성
user_id_list = []
content_list = []
date_list = []
revisit_list = []
restaurant_name_list = []
sub_info_list = []
# visit_method_list = []
# wait_time_list = []
# purpose_list = []
# visit_with_list =[]
# 해민
# webdriver_manager를 사용하여 ChromeDriver 다운로드 및 설정
chromedriver_autoinstaller.install()
driver = webdriver.Chrome()
# 지선
# driver = webdriver.Chrome(ChromeDriverManager().install())
scroll_num = 5
total_iterations = len(res_df)
for i in tqdm(range(total_iterations),desc='진행 중',position=0, leave= True):
name = res_df['검색어'][i]
driver.get('<https://map.naver.com/p/search/{}>'.format(name))
time.sleep(3)
try :
if driver.find_elements(By.ID,'entryIframe') :
entryIframe = driver.find_element(By.ID,'entryIframe')
driver.switch_to.frame(entryIframe)
except :
pass
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
try :
# '리뷰' 탭의 href 속성 가져오기
review_tab_href = soup.find('a', {'class': 'tpj9w _tab-menu', 'aria-selected': 'true'}).get('href')
review_url = '<https://pcmap.place.naver.com>'+review_tab_href
driver.get(review_url)
time.sleep(2.2)
except :
print('끝')
# 현재 페이지 URL 가져오기
current_url = driver.current_url
try :
# 리뷰 url로 이동
modified_url = current_url.replace('/home', '/review/visitor')
driver.get(modified_url)
except :
continue
# 리뷰 스크래핑 시작
time.sleep(3)
try:
# ------------ 리뷰, 태그 '내용 더보기' 버튼 클릭 ----------------------
review_buttons = driver.find_elements(By.CLASS_NAME,'xHaT3')
for button1 in review_buttons:
try:
button1.click()
except :
pass
tag_buttons = driver.find_elements(By.CSS_SELECTOR,'.sIv5s.WPk67')
for button2 in tag_buttons:
try:
button2.click()
except :
pass
# 리뷰 크롤링 시작
html = driver.page_source
soup = BeautifulSoup(html, 'lxml')
reviews = soup.select('li.owAeM')
for r in reviews:
user_id = r.select_one('div.qgLL3 span.P9EZi')
content = r.select_one('div.vg7Fp span.zPfVt')
sub_info = r.select_one('div.MnhVd a.SbJ__').text if r.select_one('div.MnhVd a.SbJ__') else ' '
date = r.select_one('div.jxc2b div.D40bm span.CKUdu time')
revisit = r.select_one('div.jxc2b div.D40bm span.CKUdu:nth-of-type(2)')
# 없는 경우
user_id_text = user_id.text if user_id else ''
content_text = content.text if content else ''
date_text = date.text if date else ''
revisit_text = revisit.text.replace('번째 방문', '') if revisit else ''
# 리스트에 합치기
restaurant_name_list.append(name)
user_id_list.append(user_id_text)
sub_info_list.append(sub_info)
date_list.append(date_text)
revisit_list.append(revisit_text)
content_list.append(remove_special_characters(content_text))
except Exception as e:
print(e)
# 데이터프레임 얹히기
review_data_list = {
'검색어': restaurant_name_list,
'user_id': user_id_list,
'review': content_list,
'date': date_list,
'revisit': revisit_list,
'sub_info' : sub_info_list
}
driver.quit()
# 리뷰 데이터 프레임 완성
review_result_df = pd.DataFrame(review_data_list)
review_result_df
매장 태그 크롤링 결과물

매장 리뷰 크롤링 결과물
