인공지능 AI/머신러닝 Machine Learning

파이썬 셀레늄selenium을 활용한 웹크롤링 예

Tap to restart 2021. 2. 5. 01:00

셀레늄은 시간이 오래 걸린다.

브라우저를 띄워서 버튼을 눌러가면서 진행하기 때문이다. 만약 인터넷 환경이 느려서 버튼 이미지가 늦게 뜰 경우에는 너무 빨리 버튼을 누르면 에러가 난다. 이 경우 좀 간격을 두고 진행해야 해서 많은 시간이 필요하다.

 

웹크롤링 코드 예

쿠팡에서 어떤 한 상품의 리뷰를 쓴 사용자명과 그들이 쓴 평점을 수집하는 코드 예

크롬드라이버 내려 받기

 

아래 코드는 맥 기준이다.

윈도우의 경우 파일 경로 설정을 다르게 해줘야 할 수 있다.

# 라이브러리 불러오기
import pandas as pd
from selenium import webdriver
import time
import math

# 초기 설정

# 블루베리 시나몬 플렉스 시리얼
url = "https://www.coupang.com/vp/products/29528864?vendorItemId=3222696681&sourceType=SDP_ALSO_VIEWED&rmdId=e4655b075bca4d43a084d2fc95cb46d8&eventLabel=recommendation_widget_pc_sdp_001&platform=web&rmdABTestInfo=9266:C,10242:C,8534:A,8088:A,8091:A,9437:A&rmdValue=p1421463742:vt-1.0.0:p29528864&isAddedCart="

# 페이지 넘길 경우 이미지 등 화면 불러오기 기다리는 시간 단위:초
# 컴퓨터나 네트워크 상황에 따라 너무 빨리 데이터를 가져오면 에러가 발생함. 이런 경우 시간을 늘려야 함.
interval = 2 

# 데이터를 담을 리스트
data_list = []

# 크롬 웹드라이버
driver = webdriver.Chrome("./chromedriver")  
driver.get(url)   
time.sleep(interval)

# 상품평 클릭 상품상세에서 상품평으로 이동함. 
driver.find_element_by_css_selector('.count').click()
time.sleep(interval)

# 총 리뷰수 확인
review_total = driver.find_element_by_css_selector('.sdp-review__average__total-star__info-count').text
review_total = review_total.replace(",", "")
print(review_total)

#페이지별 리뷰 개수
review_per_page = 5

# 전체 페이지 수 계산 리뷰가 9개 일 경우 페이지수는 9 / 5 = 1.8이 나옴
total_page = int(review_total) / review_per_page

# 리뷰가 9개 일 경우 페이지수는 9 / 5 = 1.8 -> 2페이지 올림해야 함. 올림은 ceil
total_page = math.ceil(total_page)
print(total_page)

# 상품명 확인
product = driver.find_element_by_css_selector('.prod-buy-header__title').text
print(product)

# 사용자명과 평점 수집 함수 정의
def get_page_data():

    # 사용자명 수집
    users = driver.find_elements_by_css_selector('.sdp-review__article__list__info__user__name.js_reviewUserProfileImage')
    
    # 평점 수집
    ratings = driver.find_elements_by_css_selector('.sdp-review__article__list__info__product-info__star-orange.js_reviewArticleRatingValue')
        
    # 사용자명수와 평점수가 같을 경우만 수집
    if len(users) == len(ratings):            
        for index in range(len(users)):
            data = {}
            data['username'] = users[index].text
            data['rating'] = int(ratings[index].get_attribute('data-rating'))
            print(data)
            data_list.append(data)
            
print("수집 시작")

# 첫 페이지 수집하고 시작
get_page_data() 

# 버튼을 눌러서 페이지를 이동해 가면서 계속 수집.
# 예외처리를 해줘야 함. 하지 않으면 중지됨.
for page in range(1, total_page):
    try:
        print(str(page) + " page 수집 끝")

        button_index = page % 10 + 2

        # 데이터 수집이 끝난 뒤 다음 페이지 버튼을 클릭
        driver.find_element_by_xpath('//*[@id="btfTab"]/ul[2]/li[2]/div/div[5]/section[4]/div[3]/button[' + str(button_index) +']').click()
        time.sleep(interval)

        #1 0page 수집이 끝나서 11로 넘어가기 위해서는 > 버튼을 눌러야 함.
        if(page % 10 == 0):
            driver.find_element_by_xpath('//*[@id="btfTab"]/ul[2]/li[2]/div/div[5]/section[4]/div[3]/button[12]').click()
            time.sleep(interval)

        # 해당 페이지 데이터 수집 
        get_page_data()
    except:
        print("수집 에러")

print(str(page) + " page 수집 끝")
print("수집 종료")
    
df = pd.DataFrame(data_list)
print(df)

# 엑셀로 저장
df.to_excel("coupang-crawling-example.xlsx")

 

주피터 노트북 파일

web-crawling-example.ipynb
0.04MB