<jupyter_start><jupyter_text>네이버 myplace 리뷰 크롤링<jupyter_code>from bs4 import BeautifulSoup
import requests
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.alert import Alert
import time
import random
import re<jupyter_output><empty_output><jupyter_text>실행<jupyter_code># 전버전 백업
# def naver_myplace(url, main_num):
#     driver = webdriver.Chrome('./driver/chromedriver.exe')
#     driver.get(url)
    
#     # 메인페이지에서 설정한 숫자만큼 아래로 스크롤링(음식점 로딩)
#     for i in range(main_num):
#         driver.execute_script(
#             "window.scrollTo(0, document.body.scrollHeight);")
#         time.sleep(0.5)
#     driver.execute_script("window.scrollTo(0, 0);")
    
#     # 메인페이지의 정보 취득
#     time.sleep(0.5)
#     all_link = driver.find_elements_by_xpath(
#         '/html/body/div[3]/div[4]/div/div/div[1]/button/div')
#     all_name = driver.find_elements_by_xpath(
#         '/html/body/div[3]/div[4]/div/div/div[1]/button/div/div[2]')
#     all_loca = driver.find_elements_by_xpath(
#         '/html/body/div[3]/div[4]/div/div/div[1]/button/div/div[1]/div[1]')
    
#     # 프레임으로 내용 빈리스트 생성
#     names = []
#     locas = []
#     points = []
#     reviews = []
#     writers = []
    
#     # 크롤링 시작
#     # 메인페이지의 음식점 리스트에서
#     for i in range(len(all_link)):
#         time.sleep(0.5)
#         # 이름 지역 링크를 가지고옴
#         i = i+1
#         print(i,'of', len(all_link))
#         name = driver.find_element_by_xpath(
#             f'/html/body/div[3]/div[4]/div/div/div[1]/button[{i}]/div/div[2]').text
#         loca = driver.find_element_by_xpath(
#             f'/html/body/div[3]/div[4]/div/div/div[1]/button[{i}]/div/div[1]/div[1]').text
#         link = driver.find_element_by_xpath(
#             f'/html/body/div[3]/div[4]/div/div/div[1]/button[{i}]/div')
#         # 링크에 들어가서
#         link.click()

#         # 리뷰가 모두 보이게 하단으로 스크롤링
#         last_height = driver.execute_script(
#             "return document.body.scrollHeight")

#         while True:
#             driver.execute_script(
#                 "window.scrollTo(0, document.body.scrollHeight);")
#             time.sleep(2)
#             new_height = driver.execute_script(
#                 "return document.body.scrollHeight")
#             if new_height == last_height:
#                 break
#             last_height = new_height
#         time.sleep(1)

#         # 별점 가져오기
#         point = driver.find_element_by_xpath(
#             '/html/body/div[3]/div/div[1]/div[1]/div[2]/div/span[2]').text.replace('별점', '')
#         points.append(point)
#         names.append(name)
#         locas.append(loca)

#         # 그외 다른 별점
#         other_points = driver.find_elements_by_xpath(
#             '/html/body/div[3]/div/div[3]/div/ul/div/li/div[1]/div[2]/div/span[2]')
#         for i in range(len(other_points)):
#             other_point = other_points[i].text.replace('별점', '')
#             points.append(other_point)
#             names.append(name)
#             locas.append(loca)

#         # 리뷰 가져오기
#         # 더보기 클릭
#         time.sleep(0.5)
#         driver.execute_script("window.scrollTo(0, 0);")
#         more = driver.find_elements_by_xpath(
#             '/html/body/div[3]/div/div[3]/div/ul/div/li/div/button/div/div/span/span/span[2]')
#         for i in range(len(more)):
#             more[i].click()
#             driver.execute_script("window.scrollTo(0, 0);")
#             time.sleep(0.5)

#         # 맨위의 메인 리뷰 및 작성자 가져오기
#         main_review = driver.find_element_by_xpath(
#             '/html/body/div[3]/div/div[1]/div[1]/div[3]').text
#         main_review = re.sub('[^ ㄱ-ㅣ가-힣A-Za-z0-9]+', '', str(main_review))
#         reviews.append(main_review)
#         main_writer = driver.find_element_by_xpath(
#             '/html/body/div[3]/div/div[1]/div[1]/div[1]/a/div[2]/div[1]').text
#         writers.append(main_writer)

#         other_writers = driver.find_elements_by_xpath(
#             '/html/body/div[3]/div/div[3]/div/ul/div/li/div[1]/div[1]/a/div[2]/div[1]')
#         other_reviews = driver.find_elements_by_xpath(
#             '/html/body/div[3]/div/div[3]/div/ul/div/li/div[1]')
#         for i in range(len(other_reviews)):
#             other_review = other_reviews[i].text.splitlines()
#             other_writer = other_writers[i].text
#             if len(other_review) == 6:
#                 try:
#                     int(other_review[5])
#                     reviews.append('')
#                 except:
#                     other_review_test = other_review[5:]
#                     other_review_test = re.sub(
#                 '[^ ㄱ-ㅣ가-힣A-Za-z0-9]+', '', str(other_review_test))
#                     reviews.append(other_review_test)

#             elif len(other_review) <= 5:
#                 other_review = other_review[5:]
#                 other_review = re.sub(
#                     '[^ ㄱ-ㅣ가-힣A-Za-z0-9]+', '', str(other_review))
#                 reviews.append(other_review)

#             elif len(other_review) > 6:
#                 try:
#                     int(other_review[5])
#                     other_review_test = other_review[6:]
#                     other_review_test = re.sub(
#                     '[^ ㄱ-ㅣ가-힣A-Za-z0-9]+', '', str(other_review_test))
#                     reviews.append(other_review_test)
#                 except:
#                     other_review_test = other_review[5:]
#                     other_review_test = re.sub(
#                 '[^ ㄱ-ㅣ가-힣A-Za-z0-9]+', '', str(other_review_test))
#                     reviews.append(other_review_test)
#             writers.append(other_writer)
            
#         driver.back()
#         driver.execute_script("window.scrollTo(0, 0);")
#         time.sleep(0.5)
    
#     # 드라이버 종료 및 데이터 프레임으로 저장
#     driver.quit()
#     datas = pd.DataFrame({'name': names,
#                           'loca': locas,
#                           'writer': writers,
#                           'review': reviews,
#                           'point': points,
#                           })
#     return datas
def naver_myplace(url, start_num, stop_num,main_num):
    driver = webdriver.Chrome('./driver/chromedriver.exe')
    driver.get(url)

    # 메인페이지에서 설정한 숫자만큼 아래로 스크롤링(음식점 로딩)
    for i in range(main_num):
        driver.execute_script(
            "window.scrollTo(0, document.body.scrollHeight);")
        time.sleep(1.5)
    driver.execute_script("window.scrollTo(0, 0);")

    # 메인페이지의 정보 취득
    time.sleep(0.5)
    all_link = driver.find_elements_by_xpath(
        '/html/body/div[3]/div[4]/div/div/div[1]/button/div')
    all_name = driver.find_elements_by_xpath(
        '/html/body/div[3]/div[4]/div/div/div[1]/button/div/div[2]')
    all_loca = driver.find_elements_by_xpath(
        '/html/body/div[3]/div[4]/div/div/div[1]/button/div/div[1]/div[1]')

    # 프레임으로 내용 빈리스트 생성
    names = []
    locas = []
    points = []
    reviews = []
    writers = []

    # 크롤링 시작
    # 메인페이지의 음식점 리스트에서
    for i in range(start_num,stop_num):
        time.sleep(0.5)
        # 이름 지역 링크를 가지고옴
        i = i+1
        name = driver.find_element_by_xpath(
            f'/html/body/div[3]/div[4]/div/div/div[1]/button[{i}]/div/div[2]').text
        loca = driver.find_element_by_xpath(
            f'/html/body/div[3]/div[4]/div/div/div[1]/button[{i}]/div/div[1]/div[1]').text
        link = driver.find_element_by_xpath(
            f'/html/body/div[3]/div[4]/div/div/div[1]/button[{i}]/div')
        
        print(f'전체 {len(all_link)}개 음식점 중에 {i}번째 {name} ({i}/{stop_num})')
        # 링크에 들어가서
        link.click()

        # 리뷰가 모두 보이게 하단으로 스크롤링
        last_height = driver.execute_script(
            "return document.body.scrollHeight")

        while True:
            driver.execute_script(
                "window.scrollTo(0, document.body.scrollHeight);")
            time.sleep(1.5)
            new_height = driver.execute_script(
                "return document.body.scrollHeight")
            if new_height == last_height:
                break
            last_height = new_height
        time.sleep(0.5)

        # 별점 가져오기
        point = driver.find_element_by_xpath(
            '/html/body/div[3]/div/div[1]/div[1]/div[2]/div/span[2]').text.replace('별점', '')
        points.append(point)
        names.append(name)
        locas.append(loca)

        # 그외 다른 별점
        other_points = driver.find_elements_by_xpath(
            '/html/body/div[3]/div/div[3]/div/ul/div/li/div[1]/div[2]/div/span[2]')
        for i in range(len(other_points)):
            other_point = other_points[i].text.replace('별점', '')
            points.append(other_point)
            names.append(name)
            locas.append(loca)

        # 리뷰 가져오기
        # 더보기 클릭
        time.sleep(0.5)
        driver.execute_script("window.scrollTo(0, 0);")
        more = driver.find_elements_by_xpath(
            '/html/body/div[3]/div/div[3]/div/ul/div/li/div/button/div/div/span/span/span[2]')
        for i in range(len(more)):
            more[i].click()
            driver.execute_script("window.scrollTo(0, 0);")
            time.sleep(0.5)

        # 맨위의 메인 리뷰 및 작성자 가져오기
        main_review = driver.find_element_by_xpath(
            '/html/body/div[3]/div/div[1]/div[1]/div[3]').text
        main_review = re.sub('[^ ㄱ-ㅣ가-힣A-Za-z0-9]+', '', str(main_review))
        reviews.append(main_review)
        main_writer = driver.find_element_by_xpath(
            '/html/body/div[3]/div/div[1]/div[1]/div[1]/a/div[2]/div[1]').text
        writers.append(main_writer)

        other_writers = driver.find_elements_by_xpath(
            '/html/body/div[3]/div/div[3]/div/ul/div/li/div[1]/div[1]/a/div[2]/div[1]')
        other_reviews = driver.find_elements_by_xpath(
            '/html/body/div[3]/div/div[3]/div/ul/div/li/div[1]')
        for i in range(len(other_reviews)):
            other_review = other_reviews[i].text.splitlines()
            other_writer = other_writers[i].text
            if len(other_review) == 6:
                try:
                    int(other_review[5])
                    reviews.append('')
                except:
                    other_review_test = other_review[5:]
                    other_review_test = re.sub(
                        '[^ ㄱ-ㅣ가-힣A-Za-z0-9]+', '', str(other_review_test))
                    reviews.append(other_review_test)

            elif len(other_review) <= 5:
                other_review = other_review[5:]
                other_review = re.sub(
                    '[^ ㄱ-ㅣ가-힣A-Za-z0-9]+', '', str(other_review))
                reviews.append(other_review)

            elif len(other_review) > 6:
                try:
                    int(other_review[5])
                    other_review_test = other_review[6:]
                    other_review_test = re.sub(
                        '[^ ㄱ-ㅣ가-힣A-Za-z0-9]+', '', str(other_review_test))
                    reviews.append(other_review_test)
                except:
                    other_review_test = other_review[5:]
                    other_review_test = re.sub(
                        '[^ ㄱ-ㅣ가-힣A-Za-z0-9]+', '', str(other_review_test))
                    reviews.append(other_review_test)
            writers.append(other_writer)

        driver.back()
        driver.execute_script("window.scrollTo(0, 0);")
        time.sleep(0.5)

    # 드라이버 종료 및 데이터 프레임으로 저장
    driver.quit()
    datas = pd.DataFrame({'name': names,
                          'loca': locas,
                          'writer': writers,
                          'review': reviews,
                          'point': points,
                          })
    return datas
url = 'https://m.place.naver.com/my/pick'
# 크롤링을 시작할 음식점 위치
start_num = 5

# 크롤링을 끝낼 음식점 위치
stop_num = 1

# 전체 음식점 로딩하는 횟수 (1당 약 20개 정도 가져옴, 기본은 10개)
main_num = 10

datas = naver_myplace(url, start_num, stop_num, main_num)
url = 'https://m.place.naver.com/my/pick'

datas_ls = []

# 크롤링을 시작할 음식점 위치
start_num = 130

# 크롤링을 끝낼 음식점 위치
stop_num = 200

# 전체 음식점 로딩하는 횟수 (1당 약 20개 ~ 30개 정도 가져옴, 기본은 10개)
main_num = 10

# 몇개의 음식점을 크롤링 후 저장할지
term = 5

for i in range(start_num, stop_num, term):
    print(f'{i} of {stop_num}')
    data = naver_myplace(url, i, i+term, main_num)
    datas_ls.append(data)
    print(f'{i+term}번까지 저장 완료')
datas = pd.concat(datas_ls)
datas<jupyter_output><empty_output><jupyter_text>데이터 전처리 및 오류 확인  빈 리뷰 삭제<jupyter_code>datas = datas[datas['review'] != '']
datas<jupyter_output><empty_output><jupyter_text>이름, 장소, 별점, 리뷰 빈 것 확인<jupyter_code>print(len(datas[datas['name'] == '']), len(datas[datas['loca'] == '']), 
len(datas[datas['point'] == '']),len(datas[datas['writer'] == '1']))<jupyter_output>0 0 0 0<jupyter_text>리뷰의 조회수가 리뷰로 저징된 것 삭제<jupyter_code>num_ls =[]
for i in range(0,100):
    num = datas[datas['review'] == str(i+1)]
    num_ls.append(num)
num_df = pd.concat(num_ls)
datas = datas.drop(num_df.index)<jupyter_output><empty_output><jupyter_text>별점 타입 float으로 변경<jupyter_code>datas['point'] = datas['point'].astype('float')<jupyter_output>C:\ProgramData\Anaconda3\lib\site-packages\ipykernel_launcher.py:1: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  """Entry point for launching an IPython kernel.<jupyter_text>감정 컬럼 생성<jupyter_code>datas.loc[datas['point'] > 3, 'emotion'] = 'positive'
# datas.loc[datas['point'] == 3, 'emotion'] = 'neutral'
datas.loc[datas['point'] <= 3, 'emotion'] = 'negative'<jupyter_output>C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\indexing.py:844: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  self.obj[key] = _infer_fill_value(value)
C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\indexing.py:965: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  self.obj[item] = s<jupyter_text>정보 확인<jupyter_code>datas.info()<jupyter_output><class 'pandas.core.frame.DataFrame'>
Int64Index: 776 entries, 0 to 261
Data columns (total 6 columns):
 #   Column   Non-Null Count  Dtype  
---  ------   --------------  -----  
 0   name     776 non-null    object 
 1   loca     776 non-null    object 
 2   writer   776 non-null    object 
 3   review   776 non-null    object 
 4   point    776 non-null    float64
 5   emotion  776 non-null    object 
dtypes: float64(1), object(5)
memory usage: 42.4+ KB<jupyter_text>갯수 확인<jupyter_code>datas['name'].value_counts()
datas['emotion'].value_counts()<jupyter_output><empty_output><jupyter_text>인덱스 정리<jupyter_code>datas.reset_index(drop = True, inplace= True)<jupyter_output><empty_output><jupyter_text>파일 저장<jupyter_code>datas.to_csv('datas/naver_myplace_review.csv',mode='a', index=False, header=False)<jupyter_output><empty_output><jupyter_text>중복저장된 리뷰 확인 및 삭제<jupyter_code>columns = ['name','loca','writer','review','point','emotion']
raw_datas = pd.read_csv('datas/naver_myplace_review.csv',names = columns)
raw_datas
raw_datas[raw_datas.duplicated(['review','writer'])]
raw_datas.drop_duplicates(['review','writer'], keep='first', inplace = True)
raw_datas.reset_index(drop = True, inplace= True)
raw_datas<jupyter_output><empty_output><jupyter_text>중복삭제 시킨 후 다시 저장 후 확인<jupyter_code>raw_datas.to_csv('datas/naver_myplace_review.csv',index=False, header=False)
columns = ['name','loca','writer','review','point','emotion']
raw_datas = pd.read_csv('datas/naver_myplace_review.csv',names = columns)
raw_datas
len(raw_datas)
len(raw_datas['name'].unique())<jupyter_output><empty_output><jupyter_text>아래는 코드작성할때 쓴 내용입니다. 안보셔도됨  드라이버 열기<jupyter_code>url = 'https://m.place.naver.com/my/pick'
driver = webdriver.Chrome('./driver/chromedriver.exe')
driver.get(url)<jupyter_output><empty_output><jupyter_text>링크 가져오기<jupyter_code># 페이지 제일 아래로 내려보내기
def scroll_main(num):
    for i in range(num):
        # Scroll down to bottom                                                     
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        # Wait to load page
        time.sleep(0.5)
    driver.execute_script("window.scrollTo(0, 0);")
all_name = driver.find_elements_by_xpath('/html/body/div[3]/div[4]/div/div/div[1]/button/div/div[2]')
all_link = driver.find_elements_by_xpath('/html/body/div[3]/div[4]/div/div/div[1]/button/div')
all_loca = driver.find_elements_by_xpath('/html/body/div[3]/div[4]/div/div/div[1]/button/div/div[1]/div[1]')
scroll_main(3)
all_link = driver.find_elements_by_xpath('/html/body/div[3]/div[4]/div/div/div[1]/button/div')
all_name = driver.find_elements_by_xpath('/html/body/div[3]/div[4]/div/div/div[1]/button/div/div[2]')
all_loca = driver.find_elements_by_xpath('/html/body/div[3]/div[4]/div/div/div[1]/button/div/div[1]/div[1]')

for i in range(len(all_link)):
    i = i+1
    print(i)
    link = driver.find_element_by_xpath(f'/html/body/div[3]/div[4]/div/div/div[1]/button[{i}]/div')
    name = driver.find_element_by_xpath(f'/html/body/div[3]/div[4]/div/div/div[1]/button[{i}]/div/div[2]')
    loca = driver.find_element_by_xpath(f'/html/body/div[3]/div[4]/div/div/div[1]/button[{i}]/div/div[1]/div[1]')
    link.click()
    time.sleep(0.5)
    print('여기서 부터 상세페이지 크롤링')
    driver.back()
    driver.execute_script("window.scrollTo(0, 0);")
    time.sleep(0.5)
    print(len(all_link))<jupyter_output>1
여기서 부터 상세페이지 크롤링
100
2
여기서 부터 상세페이지 크롤링
100
3
여기서 부터 상세페이지 크롤링
100
4
여기서 부터 상세페이지 크롤링
100
5
여기서 부터 상세페이지 크롤링
100
6
여기서 부터 상세페이지 크롤링
100
7
여기서 부터 상세페이지 크롤링
100
8
여기서 부터 상세페이지 크롤링
100
9
여기서 부터 상세페이지 크롤링
100
10
여기서 부터 상세페이지 크롤링
100
11
여기서 부터 상세페이지 크롤링
100
12
여기서 부터 상세페이지 크롤링
100
13
여기서 부터 상세페이지 크롤링
100
14
여기서 부터 상세페이지 크롤링
100
15
여기서 부터 상세페이지 크롤링
100
16
여기서 부터 상세페이지 크롤링
100
17
여기서 부터 상세페이지 크롤링
100
18
여기서 부터 상세페이지 크롤링
100
19
여기서 부터 상세페이지 크롤링
100
20
여기서 부터 상세페이지 크롤링
100
21
여기서 부터 상세페이지 크롤링
100
22
여기서 부터 상세페이지 크롤링
100
23
여기서 부터 상세페이지 크롤링
100
24
여기서 부터 상세페이지 크롤링
100
25
여기서 부터 상세페이지 크롤링
100
26
여기서 부터 상세페이지 크롤링
100
27
여기서 부터 상세페이지 크롤링
100
28
여기서 부터 상세페이지 크롤링
100
29
여기서 부터 상세페이지 크롤링
100
30
여기서 부터 상세페이지 크롤링
100
31
여기서 부터 상세페이지 크롤링
100
32
여기서 부터 상세페이지 크롤링
100
33
여기서 부터 상세페이지 크롤링
100
34
여기서 부터 상세페이지 크롤링
100
35
여기서 부터 상세페이지 크롤링
100
36
여기서 부터 상세페이지 크롤링
100
37
여기서 부터 상세페이지 크롤링<jupyter_text>전체리뷰 불러오기<jupyter_code># 페이지 제일 아래로 내려보내기
def scroll_detail(num):
    last_height = driver.execute_script("return document.body.scrollHeight") 
    while True:
        for i in range(num):
            # Scroll down to bottom                                                     
            driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
            # Wait to load page
            time.sleep(0.5)
            # Calculate new scroll height and compare with last scroll height
            new_height = driver.execute_script("return document.body.scrollHeight")
        if new_height == last_height:                                               
            break
        last_height = new_height
scroll_detail(5)<jupyter_output><empty_output><jupyter_text>별점 가져오기<jupyter_code># 맨위의 메인 별점
point = driver.find_element_by_xpath('/html/body/div[3]/div/div[1]/div[1]/div[2]/div/span[2]').text
point.replace('별점','')
# 그외 다른 별점
other_points = driver.find_elements_by_xpath('/html/body/div[3]/div/div[3]/div/ul/div/li/div[1]/div[2]/div/span[2]')
other_points[0].text.replace('별점','')
# 맨위의 메인 별점
points = []

point = driver.find_element_by_xpath('/html/body/div[3]/div/div[1]/div[1]/div[2]/div/span[2]').text.replace('별점','')
points.append(point)

# 그외 다른 별점
other_points = driver.find_elements_by_xpath('/html/body/div[3]/div/div[3]/div/ul/div/li/div[1]/div[2]/div/span[2]')
for i in range(len(other_points)):  
    other_point = other_points[i].text.replace('별점','')
    points.append(other_point)<jupyter_output><empty_output><jupyter_text>리뷰 가져오기<jupyter_code># 더보기 클릭
more = driver.find_elements_by_xpath('/html/body/div[3]/div/div[3]/div/ul/div/li/div/button/div/div/span/span/span[2]')
for i in range(len(more)):
    more[i].click()
    driver.execute_script("window.scrollTo(0, 0);")
# 맨위의 메인 리뷰
review = driver.find_element_by_xpath('/html/body/div[3]/div/div[1]/div[1]/div[3]').text
review
# 맨위의 메인 리뷰
reviews = []
main_review = driver.find_element_by_xpath('/html/body/div[3]/div/div[1]/div[1]/div[3]').text
main_review = re.sub('[^ ㄱ-ㅣ가-힣A-Za-z0-9]+', '', str(main_review))
reviews.append(main_review)
# 다른 리뷰 가져오기
other_reviews = driver.find_elements_by_xpath('/html/body/div[3]/div/div[3]/div/ul/div/li')
for i in range(len(other_reviews)):
    other_review = other_reviews[i].text.splitlines()[6:]
    other_review = re.sub('[^ ㄱ-ㅣ가-힣A-Za-z0-9]+', '', str(other_review))
    reviews.append(other_review)
other_reviews = driver.find_elements_by_xpath('/html/body/div[3]/div/div[3]/div/ul/div/li')

other_reviews = driver.find_elements_by_xpath('/html/body/div[3]/div/div[3]/div/ul/div/li')
for i in range(len(other_reviews)):
    other_review = other_reviews[i].text.splitlines()
#     other_writer = other_writers[i].text
    if len(other_review) == 6:
        for i in other_review[5]:
            try:
                type(int(i))
            except:
                other_review = other_review[5:]
    else:
        other_review = other_review[6:]
other_review = other_reviews[0].text.splitlines()
#     other_writer = other_writers[i].text
if len(other_review) == 6:
    for i in other_review[4]:
        try:
            testim= int(i)
        except:
            print('실행')
            other_review_test = other_review[5:]
else:
    other_review = other_review[6:]
for i in int(other_review[5]:
    print(i)
other_review
testim
other_reviews[3].text.splitlines()[5]
other_review[5]
len(other_reviews[0].text.splitlines())
other_reviews[0].text.splitlines()[5:]
len(other_reviews[12].text.splitlines())
other_reviews[1].text.splitlines()[5:]
other_reviews[15].text.splitlines()[5:]
other_reviews[12].text
# 다른 리뷰 가져오기 및 작성자 가져오기
# 리뷰의 조회수가 있고없고, 리뷰가 있고없고의 경우의 수에 따라 다르게 크롤링을 해야함
reviews = []
writers = []

other_writers = driver.find_elements_by_xpath(
    '/html/body/div[3]/div/div[3]/div/ul/div/li/div[1]/div[1]/a/div[2]/div[1]')
other_reviews = driver.find_elements_by_xpath(
    '/html/body/div[3]/div/div[3]/div/ul/div/li/div[1]')
for i in range(len(other_reviews)):
    other_review = other_reviews[i].text.splitlines()
    other_writer = other_writers[i].text
    if len(other_review) == 6:

        try:
            int(other_review[5])
            print('2번',i)
            reviews.append('')
        except:
            print('3번',i)
            other_review_test = other_review[5:]
            other_review_test = re.sub(
        '[^ ㄱ-ㅣ가-힣A-Za-z0-9]+', '', str(other_review_test))
            print(other_review_test)
            reviews.append(other_review_test)

    elif len(other_review) <= 5:
        other_review = other_review[5:]
        other_review = re.sub(
            '[^ ㄱ-ㅣ가-힣A-Za-z0-9]+', '', str(other_review))
        reviews.append(other_review)
        
    elif len(other_review) > 6:
        try:
            int(other_review[5])
            other_review_test = other_review[6:]
            other_review_test = re.sub(
            '[^ ㄱ-ㅣ가-힣A-Za-z0-9]+', '', str(other_review_test))
            reviews.append(other_review_test)
        except:
            print('6번',i)
            other_review_test = other_review[5:]
            other_review_test = re.sub(
        '[^ ㄱ-ㅣ가-힣A-Za-z0-9]+', '', str(other_review_test))
            print(other_review_test)
            reviews.append(other_review_test)

    writers.append(other_writer)<jupyter_output><empty_output><jupyter_text>작성자 가져오기<jupyter_code>other_reviews = driver.find_elements_by_xpath(
            '/html/body/div[3]/div/div[3]/div/ul/div/li/div[1]')
writer = driver.find_element_by_xpath('/html/body/div[3]/div/div[1]/div[1]/div[1]/a/div[2]/div[1]').text
writer
writers = driver.find_elements_by_xpath('/html/body/div[3]/div/div[3]/div/ul/div/li/div[1]/div[1]/a/div[2]/div[1]')
writers[5].text<jupyter_output><empty_output><jupyter_text>리뷰와 평점을 데이터 프레임으로<jupyter_code>datas = pd.DataFrame({'review' : reviews,
                      'point' : points
                     })<jupyter_output><empty_output><jupyter_text>한번에 함수로<jupyter_code># 맨위의 메인 별점
def review_crawling(num):
    scroll_detail(num)
    # 별점 가져오기
    points = []

    point = driver.find_element_by_xpath('/html/body/div[3]/div/div[1]/div[1]/div[2]/div/span[2]').text.replace('별점','')
    points.append(point)

    # 그외 다른 별점
    other_points = driver.find_elements_by_xpath('/html/body/div[3]/div/div[3]/div/ul/div/li/div[1]/div[2]/div/span[2]')
    for i in range(len(other_points)):  
        other_point = other_points[i].text.replace('별점','')
        points.append(other_point)

    # 리뷰 가져오기
    # 더보기 클릭
    more = driver.find_elements_by_xpath('/html/body/div[3]/div/div[3]/div/ul/div/li/div/button/div/div/span/span/span[2]')
    for i in range(len(more)):
        more[i].click()
        driver.execute_script("window.scrollTo(0, 0);")

    # 맨위의 메인 리뷰
    reviews = []
    main_review = driver.find_element_by_xpath('/html/body/div[3]/div/div[1]/div[1]/div[3]').text
    main_review = re.sub('[^ ㄱ-ㅣ가-힣A-Za-z0-9]+', '', str(main_review))
    reviews.append(main_review)
    # 다른 리뷰 가져오기
    other_reviews = driver.find_elements_by_xpath('/html/body/div[3]/div/div[3]/div/ul/div/li')
    for i in range(len(other_reviews)):
        other_review = other_reviews[i].text.splitlines()[6:]
        other_review = re.sub('[^ ㄱ-ㅣ가-힣A-Za-z0-9]+', '', str(other_review))
        reviews.append(other_review)

    datas = pd.DataFrame({'review' : reviews,
                          'point' : points
                         })
    
    
    
    
    return datas<jupyter_output><empty_output><jupyter_text>한번에 실행<jupyter_code>def naver_myplace(url, main_num):
    driver = webdriver.Chrome('./driver/chromedriver.exe')
    driver.get(url)

    for i in range(main_num):
        # Scroll down to bottom
        driver.execute_script(
            "window.scrollTo(0, document.body.scrollHeight);")
        # Wait to load page
        time.sleep(0.5)
    driver.execute_script("window.scrollTo(0, 0);")
    
    time.sleep(0.5)
    all_link = driver.find_elements_by_xpath('/html/body/div[3]/div[4]/div/div/div[1]/button/div')
    all_name = driver.find_elements_by_xpath('/html/body/div[3]/div[4]/div/div/div[1]/button/div/div[2]')
    all_loca = driver.find_elements_by_xpath('/html/body/div[3]/div[4]/div/div/div[1]/button/div/div[1]/div[1]')
    
    names = []
    locas = []
    points = []
    reviews = []
    print(len(all_link),'개의 음식점의 리뷰를 크롤링 합니다.')
    
    for i in range(len(all_link)):
        i = i+1
        print(i,'번째 음식점 크롤링 합니다.')
        name = driver.find_element_by_xpath(f'/html/body/div[3]/div[4]/div/div/div[1]/button[{i}]/div/div[2]').text
        loca = driver.find_element_by_xpath(f'/html/body/div[3]/div[4]/div/div/div[1]/button[{i}]/div/div[1]/div[1]').text    
        link = driver.find_element_by_xpath(f'/html/body/div[3]/div[4]/div/div/div[1]/button[{i}]/div')
        link.click()

        last_height = driver.execute_script("return document.body.scrollHeight")

        while True:
            # Scroll down to bottom                                                     
            driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
            # Wait to load page
            time.sleep(0.5)
            # Calculate new scroll height and compare with last scroll height           
            new_height = driver.execute_script("return document.body.scrollHeight")
            if new_height == last_height:                                               
                break
            last_height = new_height
            
        time.sleep(1)
        
        # 별점 가져오기
        print('별점 가져오는중..')
        point = driver.find_element_by_xpath(
            '/html/body/div[3]/div/div[1]/div[1]/div[2]/div/span[2]').text.replace('별점', '')
        points.append(point)
        names.append(name)
        locas.append(loca)
        
        # 그외 다른 별점
        other_points = driver.find_elements_by_xpath(
            '/html/body/div[3]/div/div[3]/div/ul/div/li/div[1]/div[2]/div/span[2]')
        for i in range(len(other_points)):
            other_point = other_points[i].text.replace('별점', '')
            points.append(other_point)
            names.append(name)
            locas.append(loca)
        
        # 리뷰 가져오기
        # 더보기 클릭
        time.sleep(0.5)
        print('리뷰 가져오는중..')
        driver.execute_script("window.scrollTo(0, 0);")
        more = driver.find_elements_by_xpath(
            '/html/body/div[3]/div/div[3]/div/ul/div/li/div/button/div/div/span/span/span[2]')
        for i in range(len(more)):
            more[i].click()
            driver.execute_script("window.scrollTo(0, 0);")
            time.sleep(0.3)

        # 맨위의 메인 리뷰
        main_review = driver.find_element_by_xpath(
            '/html/body/div[3]/div/div[1]/div[1]/div[3]').text
        main_review = re.sub('[^ ㄱ-ㅣ가-힣A-Za-z0-9]+', '', str(main_review))
        reviews.append(main_review)
        # 다른 리뷰 가져오기
        other_reviews = driver.find_elements_by_xpath(
            '/html/body/div[3]/div/div[3]/div/ul/div/li/div[1]')
        for i in range(len(other_reviews)):
            other_review = other_reviews[i].text.splitlines()
            if len(other_review) ==6:
                for i in other_review[5]:
                    try :
                        type(int(i))
                    except:
                        other_review = other_review[5:]
            else :
                other_review = other_review[6:]
                
            other_review = re.sub(
                '[^ ㄱ-ㅣ가-힣A-Za-z0-9]+', '', str(other_review))
            reviews.append(other_review)
        driver.back()
        driver.execute_script("window.scrollTo(0, 0);")
        time.sleep(0.5)
    
    driver.quit()
    datas = pd.DataFrame({'name': names,
                          'loca': locas,
                          'review': reviews,
                          'point': points,
                          })
    return datas
url = 'https://m.place.naver.com/my/pick'
datas = naver_myplace(url,1)<jupyter_output>10 개의 음식점의 리뷰를 크롤링 합니다.
1 번째 음식점 크롤링 합니다.
별점 가져오는중..
리뷰 가져오는중..
2 번째 음식점 크롤링 합니다.
별점 가져오는중..
리뷰 가져오는중..
3 번째 음식점 크롤링 합니다.
별점 가져오는중..
리뷰 가져오는중..
4 번째 음식점 크롤링 합니다.
별점 가져오는중..
리뷰 가져오는중..
5 번째 음식점 크롤링 합니다.
별점 가져오는중..
리뷰 가져오는중..
6 번째 음식점 크롤링 합니다.
별점 가져오는중..
리뷰 가져오는중..
7 번째 음식점 크롤링 합니다.
별점 가져오는중..
리뷰 가져오는중..
8 번째 음식점 크롤링 합니다.
별점 가져오는중..
리뷰 가져오는중..
9 번째 음식점 크롤링 합니다.
별점 가져오는중..
리뷰 가져오는중..
10 번째 음식점 크롤링 합니다.
별점 가져오는중..
리뷰 가져오는중..<jupyter_text>데이터 전처리<jupyter_code>datas = datas[datas['review'] != '']
datas
datas[datas['name'] =='']
datas[datas['loca'] =='']
datas[datas['point'] =='']
datas[datas['review'] =='1']
datas['point'] = datas['point'].astype('float')
datas.info()
datas.loc[datas['point'] > 3, 'emotion'] = 'positive'
datas.loc[datas['point'] == 3, 'emotion'] = 'neutral'
datas.loc[datas['point'] < 3, 'emotion'] = 'negative'
datas['emotion'].value_counts()
datas.reset_index(drop = True, inplace= True)
datas.to_csv('datas/naver_myplace_review.csv',mode='a', index=False) #
raw_datas = pd.read_csv('datas/naver_myplace_review.csv')
raw_datas
raw_datas.duplicated('review')<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.15331491712707182, 'fraction_numerical': 0.023700401808136616, 'mean_word_length': 2.484304932735426, 'pattern_counts': {'":': 0, '<': 93, '<?xml version=': 0, '>': 93, 'https://': 7, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 10, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '23', 'dir': 'jupyter-structured-clean-dedup', 'id': '225304', 'license': 'MIT', 'n_tokens_mistral': 13523, 'n_tokens_neox': 14371, 'n_words': 1840, 'path': '04_NLP Toyproject/crawling03_naver_myplace_review_crawling.ipynb', 'repo_name': 'hmkim312/project', 'size': '31856'}