Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 26 |
27 | 28 | 29 | 30 |
Tags
- 네이버 완결 웹툰
- 산책
- 영화
- 커피
- 제임스 클리어
- 사랑
- 습관
- 제주도
- 네이버
- 완결
- python
- geopandas
- 아주 작은 습관의 힘
- 네이버 웹툰
- 진심
- 완결 웹툰
- 가족
- 이기적 출판사
- QGIS
- 만화 영화
- 웹툰
- pandas
- 넷플릭스
- 이범선
- 빅데이터 분석기사 필기
- 애니메이션
- 빅데이터 분석기사
- 액션
- 로맨스
- 서귀포
Archives
- Today
- Total
JuJuKwakKwak
[3] 사용한 코드 : 트립어드바이저 사이트 크롤링 본문
1페이지 크롤링¶
In [1]:
# 필요한 라이브러리를 임포트하기
import sys # 시스템
import os # 시스템
# 데이터 다루기
import pandas as pd
import numpy as np
# selenium 크롤링
from selenium import webdriver
from selenium.webdriver import ActionChains as AC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
# 크롬 드라이버
import chromedriver_autoinstaller
# beautifulsoup 크롤링
import requests
from bs4 import BeautifulSoup
# lxml 크롤링
import lxml.html
# 시간 조절
import time
# 시간 측정
from tqdm import notebook
# 정규표현식
import re
# 경고 무시
import warnings
warnings.filterwarnings('ignore')
In [44]:
# 지역 키워드를 입력하기
keyword = '부산맛집'
In [45]:
# 크롬창 띄우기
chrome_path = chromedriver_autoinstaller.install()
driver = webdriver.Chrome(chrome_path)
driver.maximize_window() # 창 최대화
# 키워드가 입력된 트립어드바이저 사이트에 들어가기
driver.get('https://www.tripadvisor.co.kr/')
time.sleep(2)
In [46]:
# 검색창에 "검색어" 검색
element = driver.find_element_by_css_selector('#lithium-root > main > div.dqRmR.dcDXR.dJjeH > div > div > div.weiIG.Z0.Wh.fRhqZ > form > input.fhEMT._G.B-.z._J.Cj.R0')
element.send_keys(keyword)
element.submit()
time.sleep(1)
In [47]:
# '음식점' 카테고리 클릭하기
element = '#search-filters > ul > li:nth-child(3) > a'
driver.find_element_by_css_selector(element).click()
In [48]:
# 스크롤을 밑으로 내려주는 함수
def scroll_down(driver):
driver.execute_script("window.scrollTo(0, 8000)")
time.sleep(1)
# 맨 끝까지 내려가기
n = 2 # n: 스크롤할 횟수 설정
i = 0
while i < n: # 이 조건이 만족되는 동안 반복 실행
scroll_down(driver) # 스크롤 다운
i = i+1
In [49]:
# 가게 이름 뭉치 크롤링
names = ".result-title"
name_raw = driver.find_elements_by_css_selector(names)
In [50]:
len(name_raw)
Out[50]:
30
In [51]:
name_raw[0].text
Out[51]:
'본전돼지국밥'
In [52]:
# 가게 이름 각각 리스트에 담기
title_list = []
for name in name_raw:
title = name.text
title_list.append(title)
print(title_list, end=' ')
['본전돼지국밥', '개미집', '초량밀면', '쌍둥이돼지국밥', '미조횟집', '맛찬들왕소금구이 서면점', '영진돼지국밥 본점', '백구당양과점', '부산명물횟집', '개미집 서면점', '부산족발', '가야밀면', '갈메기 브루어리', '우럭남녀', '장수삼', '더파티 해운대점', '할매 가야 밀면', '옵스 베이커리 해운대', '고릴라브루잉', '상국이네', '삼진어묵 부산역점', '속씨원한대구탕', '홍가네양곱창', '개미집', '발리우드', '윤식당 차돌박이', '국제밀면', '뉴숯불통닭', '다리집', '부산밀면']
In [53]:
# 리뷰 개수 뭉치 크롤링
responsediv = driver.find_elements_by_class_name('rating-review-count')
In [54]:
len(responsediv)
Out[54]:
30
In [55]:
responsediv[0].text
Out[55]:
'140건의 리뷰'
In [56]:
# 리뷰 개수 각각 리스트에 담기
review_list = []
for response in responsediv:
review = response.text
review_list.append(review)
print(review_list, end=' ')
['140건의 리뷰', '261건의 리뷰', '103건의 리뷰', '181건의 리뷰', '1건의 리뷰', '81건의 리뷰', '12건의 리뷰', '13건의 리뷰', '17건의 리뷰', '109건의 리뷰', '81건의 리뷰', '38건의 리뷰', '197건의 리뷰', '29건의 리뷰', '184건의 리뷰', '266건의 리뷰', '110건의 리뷰', '209건의 리뷰', '108건의 리뷰', '48건의 리뷰', '31건의 리뷰', '70건의 리뷰', '13건의 리뷰', '39건의 리뷰', '202건의 리뷰', '5건의 리뷰', '11건의 리뷰', '10건의 리뷰', '19건의 리뷰', '6건의 리뷰']
In [81]:
# 가게 전체 평점 점수 크롤링
# element = '#BODY_BLOCK_JQUERY_REFLOW > div.page > div > div.ui_container.main_wrap > div > div > div > div > div.content_column.ui_column.is-9-desktop.is-12-tablet.is-12-mobile > div > div.ui_columns.sections_wrapper > div > div.prw_rup.prw_search_search_results.ajax-content > div > div.main_content.ui_column.is-12 > div > div:nth-child(2) > div > div > div:nth-child(3) > div > div > div > div.ui_column.is-9-desktop.is-8-mobile.is-9-tablet.content-block-column > div > div.rating-review-count > div'
element = '#BODY_BLOCK_JQUERY_REFLOW > div.page > div > div.ui_container.main_wrap > div > div > div > div > div.content_column.ui_column.is-9-desktop.is-12-tablet.is-12-mobile > div > div.ui_columns.sections_wrapper > div > div.prw_rup.prw_search_search_results.ajax-content > div > div.main_content.ui_column.is-12 > div > div:nth-child(2) div.ui_column.is-9-desktop.is-8-mobile.is-9-tablet.content-block-column > div > div.rating-review-count > div >span'
rate_class = driver.find_elements_by_css_selector(element)
alt_list = []
for alt in rate_class:
alt_list.append(alt.get_attribute('alt'))
print(alt_list, end=' ')
['풍선 5개 중 4', '풍선 5개 중 4', '풍선 5개 중 4', '풍선 5개 중 4', '풍선 5개 중 5', '풍선 5개 중 4.5', '풍선 5개 중 5', '풍선 5개 중 4.5', '풍선 5개 중 4', '풍선 5개 중 4.5', '풍선 5개 중 4', '풍선 5개 중 4', '풍선 5개 중 4.5', '풍선 5개 중 5', '풍선 5개 중 5', '풍선 5개 중 4.5', '풍선 5개 중 4', '풍선 5개 중 4', '풍선 5개 중 5', '풍선 5개 중 3.5', '풍선 5개 중 4', '풍선 5개 중 4.5', '풍선 5개 중 4.5', '풍선 5개 중 3.5', '풍선 5개 중 4.5', '풍선 5개 중 5', '풍선 5개 중 4.5', '풍선 5개 중 4.5', '풍선 5개 중 3.5', '풍선 5개 중 5']
In [82]:
len(alt_list)
Out[82]:
30
In [85]:
a = {'Title':title_list, 'Review':review_list, 'Rate':alt_list}
df = pd.DataFrame.from_dict(a, orient='index')
df1 = df.transpose()
display(df.head())
display(df1.head())
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ... | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Title | 본전돼지국밥 | 개미집 | 초량밀면 | 쌍둥이돼지국밥 | 미조횟집 | 맛찬들왕소금구이 서면점 | 영진돼지국밥 본점 | 백구당양과점 | 부산명물횟집 | 개미집 서면점 | ... | 삼진어묵 부산역점 | 속씨원한대구탕 | 홍가네양곱창 | 개미집 | 발리우드 | 윤식당 차돌박이 | 국제밀면 | 뉴숯불통닭 | 다리집 | 부산밀면 |
Review | 140건의 리뷰 | 261건의 리뷰 | 103건의 리뷰 | 181건의 리뷰 | 1건의 리뷰 | 81건의 리뷰 | 12건의 리뷰 | 13건의 리뷰 | 17건의 리뷰 | 109건의 리뷰 | ... | 31건의 리뷰 | 70건의 리뷰 | 13건의 리뷰 | 39건의 리뷰 | 202건의 리뷰 | 5건의 리뷰 | 11건의 리뷰 | 10건의 리뷰 | 19건의 리뷰 | 6건의 리뷰 |
Rate | 풍선 5개 중 4 | 풍선 5개 중 4 | 풍선 5개 중 4 | 풍선 5개 중 4 | 풍선 5개 중 5 | 풍선 5개 중 4.5 | 풍선 5개 중 5 | 풍선 5개 중 4.5 | 풍선 5개 중 4 | 풍선 5개 중 4.5 | ... | 풍선 5개 중 4 | 풍선 5개 중 4.5 | 풍선 5개 중 4.5 | 풍선 5개 중 3.5 | 풍선 5개 중 4.5 | 풍선 5개 중 5 | 풍선 5개 중 4.5 | 풍선 5개 중 4.5 | 풍선 5개 중 3.5 | 풍선 5개 중 5 |
3 rows × 30 columns
Title | Review | Rate | |
---|---|---|---|
0 | 본전돼지국밥 | 140건의 리뷰 | 풍선 5개 중 4 |
1 | 개미집 | 261건의 리뷰 | 풍선 5개 중 4 |
2 | 초량밀면 | 103건의 리뷰 | 풍선 5개 중 4 |
3 | 쌍둥이돼지국밥 | 181건의 리뷰 | 풍선 5개 중 4 |
4 | 미조횟집 | 1건의 리뷰 | 풍선 5개 중 5 |
for 문 크롤링¶
In [96]:
# '다음' 버튼 클릭
element = '#BODY_BLOCK_JQUERY_REFLOW > div.page > div > div.ui_container.main_wrap > div > div > div > div > div.content_column.ui_column.is-9-desktop.is-12-tablet.is-12-mobile > div > div.ui_columns.sections_wrapper > div > div.prw_rup.prw_search_search_results.ajax-content > div > div.ui_column.is-12.result-section-footer-columns > div > div > div > a.ui_button.nav.next.primary'
driver.find_element_by_css_selector(element).click()
In [88]:
# 크롤링 함수
def tripadvisor():
driver.execute_script("window.scrollTo(0, 6000)")
time.sleep(1)
# 가게 이름 뭉치 크롤링
names = ".result-title"
name_raw = driver.find_elements_by_css_selector(names)
# 가게 이름 각각 리스트에 담기
title_list = []
for name in name_raw:
title = name.text
title_list.append(title)
time.sleep(0.5)
# 리뷰 개수 뭉치 크롤링
responsediv = driver.find_elements_by_class_name('rating-review-count')
# 리뷰 개수 각각 리스트에 담기
review_list = []
for response in responsediv:
review = response.text
review_list.append(review)
time.sleep(0.5)
# 평점 점수 뭉치 크롤링
element = '#BODY_BLOCK_JQUERY_REFLOW > div.page > div > div.ui_container.main_wrap > div > div > div > div > div.content_column.ui_column.is-9-desktop.is-12-tablet.is-12-mobile > div > div.ui_columns.sections_wrapper > div > div.prw_rup.prw_search_search_results.ajax-content > div > div.main_content.ui_column.is-12 > div > div:nth-child(2) div.ui_column.is-9-desktop.is-8-mobile.is-9-tablet.content-block-column > div > div.rating-review-count > div >span'
rate_class = driver.find_elements_by_css_selector(element)
alt_list = []
for alt in rate_class:
alt_list.append(alt.get_attribute('alt'))
time.sleep(0.5)
# 데이터 프레임
a = {'Title':title_list, 'Review':review_list, 'Rate':alt_list}
df = pd.DataFrame.from_dict(a, orient='index')
df = df.transpose()
return df
In [90]:
total_dict = {}
total_dict[0] = df1
total_dict
Out[90]:
{0: Title Review Rate 0 본전돼지국밥 140건의 리뷰 풍선 5개 중 4 1 개미집 261건의 리뷰 풍선 5개 중 4 2 초량밀면 103건의 리뷰 풍선 5개 중 4 3 쌍둥이돼지국밥 181건의 리뷰 풍선 5개 중 4 4 미조횟집 1건의 리뷰 풍선 5개 중 5 5 맛찬들왕소금구이 서면점 81건의 리뷰 풍선 5개 중 4.5 6 영진돼지국밥 본점 12건의 리뷰 풍선 5개 중 5 7 백구당양과점 13건의 리뷰 풍선 5개 중 4.5 8 부산명물횟집 17건의 리뷰 풍선 5개 중 4 9 개미집 서면점 109건의 리뷰 풍선 5개 중 4.5 10 부산족발 81건의 리뷰 풍선 5개 중 4 11 가야밀면 38건의 리뷰 풍선 5개 중 4 12 갈메기 브루어리 197건의 리뷰 풍선 5개 중 4.5 13 우럭남녀 29건의 리뷰 풍선 5개 중 5 14 장수삼 184건의 리뷰 풍선 5개 중 5 15 더파티 해운대점 266건의 리뷰 풍선 5개 중 4.5 16 할매 가야 밀면 110건의 리뷰 풍선 5개 중 4 17 옵스 베이커리 해운대 209건의 리뷰 풍선 5개 중 4 18 고릴라브루잉 108건의 리뷰 풍선 5개 중 5 19 상국이네 48건의 리뷰 풍선 5개 중 3.5 20 삼진어묵 부산역점 31건의 리뷰 풍선 5개 중 4 21 속씨원한대구탕 70건의 리뷰 풍선 5개 중 4.5 22 홍가네양곱창 13건의 리뷰 풍선 5개 중 4.5 23 개미집 39건의 리뷰 풍선 5개 중 3.5 24 발리우드 202건의 리뷰 풍선 5개 중 4.5 25 윤식당 차돌박이 5건의 리뷰 풍선 5개 중 5 26 국제밀면 11건의 리뷰 풍선 5개 중 4.5 27 뉴숯불통닭 10건의 리뷰 풍선 5개 중 4.5 28 다리집 19건의 리뷰 풍선 5개 중 3.5 29 부산밀면 6건의 리뷰 풍선 5개 중 5}
In [98]:
for i in range(6):
driver.execute_script("window.scrollTo(0, 6000)")
time.sleep(1)
element = '#BODY_BLOCK_JQUERY_REFLOW > div.page > div > div.ui_container.main_wrap > div > div > div > div > div.content_column.ui_column.is-9-desktop.is-12-tablet.is-12-mobile > div > div.ui_columns.sections_wrapper > div > div.prw_rup.prw_search_search_results.ajax-content > div > div.ui_column.is-12.result-section-footer-columns > div > div > div > a.ui_button.nav.next.primary'
driver.find_element_by_css_selector(element).click()
time.sleep(1)
# 크롤링 한 것을 total_dict에 저장
total_dict[i+1] = tripadvisor()
In [99]:
# 창 닫기
driver.close()
In [100]:
# 크롤링한 페이지 개수 파악
len(total_dict)
Out[100]:
7
In [106]:
# csv 파일로 저장
df1 = total_dict[0]
df2 = total_dict[1]
df3 = total_dict[2]
df4 = total_dict[3]
df5 = total_dict[4]
df6 = total_dict[5]
df7 = total_dict[6]
df1.to_csv('Busan1_tripadvisor.csv', encoding='utf-8-sig', index=False)
df2.to_csv('Busan2_tripadvisor.csv', encoding='utf-8-sig', index=False)
df3.to_csv('Busan3_tripadvisor.csv', encoding='utf-8-sig', index=False)
df4.to_csv('Busan4_tripadvisor.csv', encoding='utf-8-sig', index=False)
df5.to_csv('Busan5_tripadvisor.csv', encoding='utf-8-sig', index=False)
df6.to_csv('Busan6_tripadvisor.csv', encoding='utf-8-sig', index=False)
df7.to_csv('Busan7_tripadvisor.csv', encoding='utf-8-sig', index=False)
데이터 정제¶
In [107]:
# 저장한 csv 불러오기
df1 = pd.read_csv('Busan1_tripadvisor.csv')
df2 = pd.read_csv('Busan2_tripadvisor.csv')
df3 = pd.read_csv('Busan3_tripadvisor.csv')
df4 = pd.read_csv('Busan4_tripadvisor.csv')
df5 = pd.read_csv('Busan5_tripadvisor.csv')
df6 = pd.read_csv('Busan6_tripadvisor.csv')
df7 = pd.read_csv('Busan7_tripadvisor.csv')
In [108]:
df_list = [df1, df2, df3, df4, df5, df6, df7]
df_all = pd.concat(df_list, ignore_index=True)
df_all
Out[108]:
Title | Review | Rate | |
---|---|---|---|
0 | 본전돼지국밥 | 140건의 리뷰 | 풍선 5개 중 4 |
1 | 개미집 | 261건의 리뷰 | 풍선 5개 중 4 |
2 | 초량밀면 | 103건의 리뷰 | 풍선 5개 중 4 |
3 | 쌍둥이돼지국밥 | 181건의 리뷰 | 풍선 5개 중 4 |
4 | 미조횟집 | 1건의 리뷰 | 풍선 5개 중 5 |
... | ... | ... | ... |
205 | 해운대 소문난암소갈비집 | 14건의 리뷰 | 풍선 5개 중 4 |
206 | 풍원장시골밥상집 | 5건의 리뷰 | 풍선 5개 중 3 |
207 | 남포삼계탕 | 84건의 리뷰 | 풍선 5개 중 4 |
208 | Menza | 7,164건의 리뷰 | 풍선 5개 중 4.5 |
209 | Dal Moro's Fresh Pasta to Go | 11,831건의 리뷰 | 풍선 5개 중 4.5 |
210 rows × 3 columns
In [109]:
# csv 파일 저장
df_all.to_csv('Busan_Tripadvisor.csv', encoding='utf-8-sig', index=False)
In [19]:
# 합친 파일로 불러오기
df_all = pd.read_csv('CsvFile/Busan_Tripadvisor.csv')
In [20]:
df_all.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 210 entries, 0 to 209 Data columns (total 4 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Title 210 non-null object 1 Review 210 non-null object 2 Rate 210 non-null object 3 site 210 non-null object dtypes: object(4) memory usage: 6.7+ KB
Rate 열 정제¶
In [21]:
df_all['Rate'].values
Out[21]:
array(['풍선 5개 중 4', '풍선 5개 중 4', '풍선 5개 중 4', '풍선 5개 중 4', '풍선 5개 중 5', '풍선 5개 중 4.5', '풍선 5개 중 5', '풍선 5개 중 4.5', '풍선 5개 중 4', '풍선 5개 중 4.5', '풍선 5개 중 4', '풍선 5개 중 4', '풍선 5개 중 4.5', '풍선 5개 중 5', '풍선 5개 중 5', '풍선 5개 중 4.5', '풍선 5개 중 4', '풍선 5개 중 4', '풍선 5개 중 5', '풍선 5개 중 3.5', '풍선 5개 중 4', '풍선 5개 중 4.5', '풍선 5개 중 4.5', '풍선 5개 중 3.5', '풍선 5개 중 4.5', '풍선 5개 중 5', '풍선 5개 중 4.5', '풍선 5개 중 4.5', '풍선 5개 중 3.5', '풍선 5개 중 5', '풍선 5개 중 4.5', '풍선 5개 중 4.5', '풍선 5개 중 4.5', '풍선 5개 중 4.5', '풍선 5개 중 4.5', '풍선 5개 중 4', '풍선 5개 중 5', '풍선 5개 중 5', '풍선 5개 중 4.5', '풍선 5개 중 4.5', '풍선 5개 중 4.5', '풍선 5개 중 4.5', '풍선 5개 중 4.5', '풍선 5개 중 4.5', '풍선 5개 중 4.5', '풍선 5개 중 4', '풍선 5개 중 4', '풍선 5개 중 5', '풍선 5개 중 5', '풍선 5개 중 4.5', '풍선 5개 중 4.5', '풍선 5개 중 4.5', '풍선 5개 중 4', '풍선 5개 중 4.5', '풍선 5개 중 4', '풍선 5개 중 4', '풍선 5개 중 4.5', '풍선 5개 중 4', '풍선 5개 중 4', '풍선 5개 중 4', '풍선 5개 중 4', '풍선 5개 중 4', '풍선 5개 중 4', '풍선 5개 중 4', '풍선 5개 중 4', '풍선 5개 중 4', '풍선 5개 중 4.5', '풍선 5개 중 4.5', '풍선 5개 중 3.5', '풍선 5개 중 4', '풍선 5개 중 4', '풍선 5개 중 4.5', '풍선 5개 중 5', '풍선 5개 중 4.5', '풍선 5개 중 4.5', '풍선 5개 중 3.5', '풍선 5개 중 4.5', '풍선 5개 중 4.5', '풍선 5개 중 4.5', '풍선 5개 중 5', '풍선 5개 중 4', '풍선 5개 중 4', '풍선 5개 중 4', '풍선 5개 중 4.5', '풍선 5개 중 4', '풍선 5개 중 4.5', '풍선 5개 중 4.5', '풍선 5개 중 5', '풍선 5개 중 3.5', '풍선 5개 중 4.5', '풍선 5개 중 4.5', '풍선 5개 중 4', '풍선 5개 중 4.5', '풍선 5개 중 3', '풍선 5개 중 3', '풍선 5개 중 4', '풍선 5개 중 4', '풍선 5개 중 3.5', '풍선 5개 중 3.5', '풍선 5개 중 4', '풍선 5개 중 4', '풍선 5개 중 4.5', '풍선 5개 중 4.5', '풍선 5개 중 5', '풍선 5개 중 4', '풍선 5개 중 4.5', '풍선 5개 중 4', '풍선 5개 중 4.5', '풍선 5개 중 5', '풍선 5개 중 5', '풍선 5개 중 5', '풍선 5개 중 4.5', '풍선 5개 중 4.5', '풍선 5개 중 4', '풍선 5개 중 4.5', '풍선 5개 중 4.5', '풍선 5개 중 4', '풍선 5개 중 4', '풍선 5개 중 4', '풍선 5개 중 5', '풍선 5개 중 4.5', '풍선 5개 중 4', '풍선 5개 중 4.5', '풍선 5개 중 4', '풍선 5개 중 3.5', '풍선 5개 중 4', '풍선 5개 중 4', '풍선 5개 중 4', '풍선 5개 중 3', '풍선 5개 중 4', '풍선 5개 중 4', '풍선 5개 중 4', '풍선 5개 중 5', '풍선 5개 중 3', '풍선 5개 중 4', '풍선 5개 중 4.5', '풍선 5개 중 4.5', '풍선 5개 중 4.5', '풍선 5개 중 4', '풍선 5개 중 4.5', '풍선 5개 중 4', '풍선 5개 중 4', '풍선 5개 중 4.5', '풍선 5개 중 3', '풍선 5개 중 3.5', '풍선 5개 중 4', '풍선 5개 중 4.5', '풍선 5개 중 4.5', '풍선 5개 중 4.5', '풍선 5개 중 3.5', '풍선 5개 중 4.5', '풍선 5개 중 4', '풍선 5개 중 4.5', '풍선 5개 중 4', '풍선 5개 중 3.5', '풍선 5개 중 5', '풍선 5개 중 4.5', '풍선 5개 중 4', '풍선 5개 중 4.5', '풍선 5개 중 4.5', '풍선 5개 중 5', '풍선 5개 중 4.5', '풍선 5개 중 5', '풍선 5개 중 1', '풍선 5개 중 4.5', '풍선 5개 중 4', '풍선 5개 중 3.5', '풍선 5개 중 4', '풍선 5개 중 4', '풍선 5개 중 4', '풍선 5개 중 5', '풍선 5개 중 4', '풍선 5개 중 3', '풍선 5개 중 3.5', '풍선 5개 중 4', '풍선 5개 중 5', '풍선 5개 중 5', '풍선 5개 중 4.5', '풍선 5개 중 4.5', '풍선 5개 중 4.5', '풍선 5개 중 4.5', '풍선 5개 중 4.5', '풍선 5개 중 4', '풍선 5개 중 4', '풍선 5개 중 3.5', '풍선 5개 중 4', '풍선 5개 중 4', '풍선 5개 중 3.5', '풍선 5개 중 4', '풍선 5개 중 4', '풍선 5개 중 4', '풍선 5개 중 4.5', '풍선 5개 중 4.5', '풍선 5개 중 4.5', '풍선 5개 중 4.5', '풍선 5개 중 4.5', '풍선 5개 중 5', '풍선 5개 중 4.5', '풍선 5개 중 5', '풍선 5개 중 4', '풍선 5개 중 4', '풍선 5개 중 4', '풍선 5개 중 4.5', '풍선 5개 중 3', '풍선 5개 중 3.5', '풍선 5개 중 4', '풍선 5개 중 3', '풍선 5개 중 4', '풍선 5개 중 4.5', '풍선 5개 중 4.5'], dtype=object)
In [22]:
rate_list = []
for x in df_all['Rate']:
y = x[8:]
rate_list.append(y)
df_all['Rate'] = rate_list
df_all['Rate'].values
Out[22]:
array(['4', '4', '4', '4', '5', '4.5', '5', '4.5', '4', '4.5', '4', '4', '4.5', '5', '5', '4.5', '4', '4', '5', '3.5', '4', '4.5', '4.5', '3.5', '4.5', '5', '4.5', '4.5', '3.5', '5', '4.5', '4.5', '4.5', '4.5', '4.5', '4', '5', '5', '4.5', '4.5', '4.5', '4.5', '4.5', '4.5', '4.5', '4', '4', '5', '5', '4.5', '4.5', '4.5', '4', '4.5', '4', '4', '4.5', '4', '4', '4', '4', '4', '4', '4', '4', '4', '4.5', '4.5', '3.5', '4', '4', '4.5', '5', '4.5', '4.5', '3.5', '4.5', '4.5', '4.5', '5', '4', '4', '4', '4.5', '4', '4.5', '4.5', '5', '3.5', '4.5', '4.5', '4', '4.5', '3', '3', '4', '4', '3.5', '3.5', '4', '4', '4.5', '4.5', '5', '4', '4.5', '4', '4.5', '5', '5', '5', '4.5', '4.5', '4', '4.5', '4.5', '4', '4', '4', '5', '4.5', '4', '4.5', '4', '3.5', '4', '4', '4', '3', '4', '4', '4', '5', '3', '4', '4.5', '4.5', '4.5', '4', '4.5', '4', '4', '4.5', '3', '3.5', '4', '4.5', '4.5', '4.5', '3.5', '4.5', '4', '4.5', '4', '3.5', '5', '4.5', '4', '4.5', '4.5', '5', '4.5', '5', '1', '4.5', '4', '3.5', '4', '4', '4', '5', '4', '3', '3.5', '4', '5', '5', '4.5', '4.5', '4.5', '4.5', '4.5', '4', '4', '3.5', '4', '4', '3.5', '4', '4', '4', '4.5', '4.5', '4.5', '4.5', '4.5', '5', '4.5', '5', '4', '4', '4', '4.5', '3', '3.5', '4', '3', '4', '4.5', '4.5'], dtype=object)
In [23]:
len(df_all['Rate'])
Out[23]:
210
In [24]:
df_all
Out[24]:
Title | Review | Rate | site | |
---|---|---|---|---|
0 | 본전돼지국밥 | 140건의 리뷰 | 4 | tripadvisor |
1 | 개미집 | 261건의 리뷰 | 4 | tripadvisor |
2 | 초량밀면 | 103건의 리뷰 | 4 | tripadvisor |
3 | 쌍둥이돼지국밥 | 181건의 리뷰 | 4 | tripadvisor |
4 | 미조횟집 | 1건의 리뷰 | 5 | tripadvisor |
... | ... | ... | ... | ... |
205 | 해운대 소문난암소갈비집 | 14건의 리뷰 | 4 | tripadvisor |
206 | 풍원장시골밥상집 | 5건의 리뷰 | 3 | tripadvisor |
207 | 남포삼계탕 | 84건의 리뷰 | 4 | tripadvisor |
208 | Menza | 7,164건의 리뷰 | 4.5 | tripadvisor |
209 | Dal Moro's Fresh Pasta to Go | 11,831건의 리뷰 | 4.5 | tripadvisor |
210 rows × 4 columns
Review 열 정제¶
In [25]:
review_list = []
for x in df_all['Review']:
y = x[:-5]
review_list.append(y)
df_all['Review'] = review_list
In [26]:
print(len(df_all['Review']))
print(df_all['Review'].values)
210 ['140' '261' '103' '181' '1' '81' '12' '13' '17' '109' '81' '38' '197' '29' '184' '266' '110' '209' '108' '48' '31' '70' '13' '39' '202' '5' '11' '10' '19' '6' '43' '10' '71' '67' '57' '303' '9' '10' '21' '27' '33' '15' '7' '25' '100' '179' '44' '5' '8' '38' '19' '15' '7' '11' '26' '60' '3,631' '26' '58' '17' '23' '47' '65' '126' '13' '62' '3' '15' '2' '7' '43' '7' '8' '3' '4' '3' '15' '11' '5' '11' '5,324' '15' '66' '12' '8' '5' '12' '29' '2' '20' '15' '47' '7' '1' '3' '1' '20' '42' '25' '46' '38' '5' '13' '5' '5' '6' '35' '2' '1' '1' '2' '4' '3' '22' '84' '24' '1' '76' '93' '1' '6' '14' '4' '24' '9' '41' '35' '16' '6' '43' '7' '14' '1' '10' '33' '3' '2' '10' '55' '6' '9' '4' '4' '8' '9' '7' '312' '3' '3' '4' '144' '2' '117' '1' '12' '9' '76' '26' '19' '27' '28' '10' '9' '1' '131' '11' '56' '25' '8' '10' '6' '16' '2' '2' '6' '1' '35' '201' '49' '35' '6' '6' '48' '59' '7' '28' '2,669' '11' '3' '12' '162' '8' '11' '16' '11' '5' '1' '4' '1' '588' '257' '3,362' '4' '7' '6' '14' '5' '84' '7,164' '11,831']
In [27]:
df_all
Out[27]:
Title | Review | Rate | site | |
---|---|---|---|---|
0 | 본전돼지국밥 | 140 | 4 | tripadvisor |
1 | 개미집 | 261 | 4 | tripadvisor |
2 | 초량밀면 | 103 | 4 | tripadvisor |
3 | 쌍둥이돼지국밥 | 181 | 4 | tripadvisor |
4 | 미조횟집 | 1 | 5 | tripadvisor |
... | ... | ... | ... | ... |
205 | 해운대 소문난암소갈비집 | 14 | 4 | tripadvisor |
206 | 풍원장시골밥상집 | 5 | 3 | tripadvisor |
207 | 남포삼계탕 | 84 | 4 | tripadvisor |
208 | Menza | 7,164 | 4.5 | tripadvisor |
209 | Dal Moro's Fresh Pasta to Go | 11,831 | 4.5 | tripadvisor |
210 rows × 4 columns
In [28]:
# 정제한 데이터 csv로 저장
df_all.to_csv('Tripadvisor_cleaned.csv', encoding='utf-8-sig', index=False)
'Data Science > 여행 종합 추천 시스템 : 이지트립' 카테고리의 다른 글
[4] 프로젝트 후기 (0) | 2022.05.27 |
---|---|
[3] 사용한 코드 : CF-MF 추천시스템 (0) | 2022.05.27 |
[3] 사용한 코드 : 망고플레이트 사이트 크롤링, CBF 추천시스템 (0) | 2022.05.27 |
[2] 데이터 수집, 정제, 모델링 (0) | 2022.05.27 |
[1] 주제 선정 (0) | 2022.05.27 |