데이터 분석/웹 크롤링

[이론] 웹 크롤링2

toraa 2025. 1. 20. 16:45

네이버스토어 리뷰 크롤링

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