네이버스토어 리뷰 크롤링
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
import random
import pandas as pd
driver = webdriver.Chrome()
url = 'https://search.shopping.naver.com/catalog/36469633619?&NaPm=ct%3Dm5dgs6pk%7Cci%3D015aafa6380fee91492086d7c024ada7555e941d%7Ctr%3Dslcc%7Csn%3D95694%7Chk%3D9bd7db85c193e4cf84550e4f83d011516d101f48'
driver.get(url)
리뷰 가져오기
상위요소 목록 찾기
# CSS_SELECTOR
cs = 'ul.reviewItems_list_review__q726A li'
#띄어쓰기 기준 앞이 상위요소, 뒤를 하위요소로 가져올수 있음
#참조로 정석방법 이런식으로 사용할 수도 있음
#ul = driver.find_elements(By.CSS_SELECTOR, 'ul.reviewItems_list_review__q726A')
reviews = driver.find_elements(By.CSS_SELECTOR, cs)
print(len(reviews))
20
20개의 리뷰를 가져올 수 있다는 의미
하위요소 가져오기
한페이지 (20개의 리뷰) 기준 모든 리뷰 가져오는 반복문
def get_content():
reviews = driver.find_elements(By.XPATH, '//*[@id="section_review"]/ul/li')
craw = []
for rv in reviews:
content = {}
info = rv.find_elements(By.CSS_SELECTOR, 'span.reviewItems_etc__9ej69')
content['id'] = info[1].get_attribute('innerText')
content['date'] = info[2].get_attribute('innerText')
content['text'] = rv.find_element(By.CSS_SELECTOR, 'p.reviewItems_text__XrSSf').get_attribute('innerText')
content['rat'] = rv.find_element(By.CSS_SELECTOR, 'span.reviewItems_average__0kLWX').get_attribute('innerText')
craw.append(content)
return craw
get_content()
순번으로 인덱싱을 통해 1번은 id, 2번은 date,.. 이런식으로 데이터 접근
find_elements 결과에서 순서 활용하여 요소 찾는 방법도 유용
페이지 변경, 리뷰 노출
페이지 변경하는 방법 2가지
1. url와 포맷팅 활용 : 클릭시 url이 바뀌어야 유효
하나의 페이지에 데이터만 바뀌는 구조에서는 사용못함
2. xpath를 주로 사용해서 특정 버튼을 클릭하도록 접근
(xpath패턴을 파악해야함)
번호목록 요소 구성 파악
pag = driver.find_elements(By.XPATH, '//*[@id="section_review"]/div[3]/a')
print(len(pag))
pag[10].get_attribute('innerText')
#//*[@id="section_review"]/div[3]/a[3]
#//*[@id="section_review"]/div[3]/a[4]
#//*[@id="section_review"]/div[3]/a[5]
#//*[@id="section_review"]/div[3]/a[11]
#for i in range(3):
#for i in range(2,12):
# pag = driver.find_elements(By.XPATH, f'//*[@id="section_review"]/div[3]/a[i]')
#pag.click()
#sleep(1)
#3번 반복했으니 21로 넘어가야하는데 다시 11번부터 반복하게 됨
#이전 버튼이 새로 생기면서 숫자배열이 달라졌기 때문
#다음 버튼이 13번이 클릭되어야 넘어가게됨
#두번쨰 페이지부턴 //*[@id="section_review"]/div[3]/a[12]가 생김
#두번째 페이지부터는 3에서 13으로 인덱싱 필요
반복문 : 번호 클릭하여 수집
driver.get(url)
i = 1
result = []
while True:
try:
pag = driver.find_element(By.XPATH, f'//*[@id="section_review"]/div[3]/a[{i}]')
pt = pag.get_attribute('innerText')
print(pt)
pag.click()
if pt == '다음':
i = 2
else:
i += 1
sleep(1)
result.extend(get_content())
except:
break
i를 처음부터 끝까지 가져와서 누르게 시킴
다음이라는 글자가 생기면 i가 2부터 진행되게끔 초기화시킴
리뷰 20개가 리스트로 나옴
리스트를 extend함수를 통해서 그대로 리스트를 연결시켜줌
error발생시 반복 멈추게끔
프린트해서 잘 진행되고 있는지 확인
df = pd.DataFrame(result)
df
'데이터 분석 > 웹 크롤링' 카테고리의 다른 글
[실습] 웹 크롤링 (4) | 2025.01.21 |
---|---|
[이론] sellenium을 활용한 크롤링 (2) | 2025.01.20 |
[이론] 웹 크롤링 (3) | 2025.01.20 |