뎁스노트 앱으로 보시겠습니까?
뎁스노트 앱을 설치하시면
주문 알림 및 다양한 기능을
편리하게 이용하실 수 있습니다.
뎁스노트 앱으로 보기
아니오, 모바일 웹에서 보겠습니다.
×
뎁스노트
로그인
홈
언어
프레임워크
개발도구
네크워크와 서버
데이터베이스
프로젝트 관리
데이터 사이언스
이야기
사진
모집 · 홍보
로그인
회원가입
글쓰기
글 올리기
개발 노트, 이야기를 작성해보세요.
질문하기
부담없이 무엇이든 질문하세요.
사진 올리기
사진을 올려보세요.
홈
모든 글
모든 질문
팔로잉
언어
프레임워크
개발도구
네크워크와 서버
데이터베이스
프로젝트 관리
데이터 사이언스
이야기
사진
모집 · 홍보
이벤트
Python
네이버 스토어 리뷰 크롤링 오류
52craftgo
6개월 전
팔로우
팔로잉
import re import requests from bs4 import BeautifulSoup import pandas as pd from datetime import datetime import time from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.by import By from datetime import datetime, timedelta from selenium.webdriver.chrome.service import Service from selenium.webdriver.support import expected_conditions as EC from webdriver_manager.chrome import ChromeDriverManager options = webdriver.ChromeOptions() # 크롬 옵션 객체 생성 options.add_argument("window-size=1920x1080") # 화면크기(전체화면) options.add_argument("disable-gpu") options.add_argument("disable-infobars") options.add_argument("--disable-extensions") options.add_argument('--no-sandbox') chrome_driver_path = "C:\\Users\\JH\\Desktop\\스토어 분석\\chromedriver-win64\\chromedriver.exe" service = Service(executable_path=chrome_driver_path) driver = webdriver.Chrome(service = service, options=options) driver.implicitly_wait(3) driver.get('https://brand.naver.com/sempio/products/10003754695') time.sleep(3) driver.find_element(By.CSS_SELECTOR,'#content > div > div.z7cS6-TO7X > div._27jmWaPaKy > ul > li:nth-child(2) > a').click() time.sleep(3) driver.find_element(By.CSS_SELECTOR,'#REVIEW > div > div._2LvIMaBiIO > div._2LAwVxx1Sd > div._1txuie7UTH > ul > li:nth-child(2) > a').click() time.sleep(3) page_num = 1 page_ctl = 2 date_cut = (datetime.now() - timedelta(days = 365)).strftime('%Y%m%d') write_dt_lst = [] item_nm_lst = [] content_lst = [] while True : print(f'start : {page_num} page 수집 중, page_ctl:{page_ctl}') # 1. 셀레니움으로 html가져오기 html_source = driver.page_source # 2. bs4로 html 파싱 soup = BeautifulSoup(html_source, 'html.parser') time.sleep(0.5) # 3. 리뷰 정보 가져오기 reviews = soup.findAll('li', {'class': 'BnwL_cs1av'}) # 4. 한페이지 내에서 수집 가능한 리뷰 리스트에 저장 for review in range(len(reviews)): # 4-1.리뷰작성일자 수집 write_dt_raw = reviews[review].findAll('span' ,{'class' : '_2L3vDiadT9'})[0].get_text() write_dt = datetime.strptime(write_dt_raw, '%y.%m.%d.').strftime('%Y%m%d') # 4-2.상품명 수집 # 4-2-(1) 상품명이 포함된 css 선택자 입력 item_nm_info_raw = reviews[review].findAll('div', {'class' : '_2FXNMst_ak'})[0].get_text() # 4-2-(2) re.sub() 를 활용해 dl class="XbGQRlzveO"부분부터 추출한 문장을 공백으로 대체 item_nm_info_for_del = reviews[review].findAll('div', {'class' : '_2FXNMst_ak'})[0].find('dl', {'class' : 'XbGQRlzveO'}).get_text() # 4-2-(3) re.sub(pattern, replacement, string) : string에서 pattern에 해당하는 부분을 replacement로 모두 대체 item_nm_info= re.sub(item_nm_info_for_del, '', item_nm_info_raw) # 4-2-(4) find() : 문자열 순서 (인덱스) 반환 : find()를 활용해 '제품 선택 : '이 나오는 인덱스 반환 str_start_idx = re.sub(item_nm_info_for_del, '', item_nm_info_raw).find('제품 선택: ') # 4-2-(5) 제품명만 추출. strip(): 공백 제거 item_nm = item_nm_info[str_start_idx + 6:].strip() # 4-3. 리뷰내용 수집 review_content_raw = reviews[review].findAll('div', {'class' : '_1kMfD5ErZ6'})[0].find('span', {'class' : '_2L3vDiadT9'}).get_text() review_content = re.sub(' +', ' ',re.sub('\n',' ',review_content_raw )) # 4-4. 수집데이터 저장 write_dt_lst.append(write_dt) item_nm_lst.append(item_nm) content_lst.append(review_content) # 리뷰 수집일자 기준 데이터 확인(최근 1년치만 수집) if write_dt_lst[-1] < date_cut : break if page_num % 10 == 0: next_button = driver.find_element(By.XPATH, '//a[contains(text(), "다음")]') next_button.click() time.sleep(3) else: page_ctl_str = str(page_ctl) page_button = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH, f'//a[text()="{page_ctl_str}"]')) ) page_button.click() time.sleep(3) html_source = driver.page_source soup = BeautifulSoup(html_source, 'html.parser') time.sleep(0.5) page_num += 1 page_ctl += 1 print('done') result_df = pd.DataFrame({ 'RD_ITEM_NM' : item_nm_lst, 'RD_CONTENT' : content_lst, 'RD_WRITE_DT' : write_dt_lst }) result_df.to_csv('C:/Users/JH/Desktop/스토어 분석/navershopping_review_data.csv', index=None, encoding='utf-8-sig') 페이지가 넘어가면서 리뷰를 잘 수집하고 있는것같은데 마지막페이지가 되면 더 이상 넘어갈 페이지가 없어서 그런지 오류가 납니다. 원래 마지막페이지가 되면 수집을 중단하고 csv파일로 만들어서 지정된경로에 저장해야하는데 안됩니다.
0
0
1
76
신고하기
사용자 차단하기
52craftgo
6개월 전
팔로우
팔로잉
댓글
1
올리기
답변 작성
답변 모드로 쓰기
올리기
닥터핸
마지막 페이지에서 더 이상 페이지가 없을 때 오류가 발생하는 문제를 해결하려면
다음 페이지가 없을 때 수집을 중단하고 데이터를 CSV 파일로 저장하는 로직을 추가해야 할 것 같습니다.
즉, 페이지 이동을 시도하기 전에 다음 페이지 버튼이 존재하는지 확인하는 형태의 코드를 추가해보시기 바랍니다.
6개월 전
∙
0
∙
답글 달기
∙
공유
∙
신고
∙
차단
1
0
0
1
신고하기
사용자 차단하기