본문 바로가기

자동화/Selenium

핫딜게시판 목록 리스트 자동화하여 추출

728x90

커뮤니티 사이트 중 핫딜 게시판이 있어서 저렴하게 구입하는 경우가 많은데 데이터 목록을 자동화로 추출하는 코드입니다.

 

핫딜 게시판 중 뽐뿌게시판을 선택하여 코드를 작성하였습니다.

뽐뿌게시판에서 종료가 된 목록은 취소선 처리가 되어 있어서 취소선 되어 있는 항목을 제외하고 목록을 추출하였습니다.

 

 

URL내 페이지 번호가 있기 때문에 하단 페이지 번호를 클릭하는것 보다 URL 링크를 변경하는 방법으로 반복문을 작성하였습니다.

10페이지까지 추출하기 위해 11로 작성하였으나 숫자 변경으로 더 적게 혹은 더 많이 데이터를 추출할 수 있습니다.

 

for i in range(1, 11):
    driver.get('https://www.ppomppu.co.kr/zboard/zboard.php?id=ppomppu&page='+str(i)+'&divpage=75')
    driver.implicitly_wait(3) #3초안에 페이지가 로드되거나 3초를 대기

 

데이터를 추출하기 위해 HTML 코드를 보니 어려웠던 점이 id나 class로 추출하기 어려운 형태가 대부분이었습니다.

그로 인해 css_selector를 주로 사용하여 데이터를 추출하였습니다.

 

취소선이 있는 경우 class_name이 없고 취소선이 없는 경우에만 class_name이 있어서 구분하기 위해 조건문을 사용하였습니다.

 

divList = driver.find_elements(By.CSS_SELECTOR,
                               "div[style='display:inline-block;line-height:1.6;vertical-align:middle;']")  # 목록 div css_selector로 추출

for e in divList:
    if len(e.find_element(By.CSS_SELECTOR, 'font').get_attribute('style')) != 0:  # 종료된 핫딜인 경우 데이터 추출할 필요가 없기 때문에 추출하지 않음
        continue
    else:  # 종료된 핫딜이 아닌 경우
        alink = e.find_element(By.TAG_NAME, 'a').get_attribute('href')
        name = e.find_element(By.CLASS_NAME, 'list_title').text

 

URL 중 hotdeal로 되어있는 목록은 카테고리가 없기 때문에 에러가 발생하지 않게 미표시로 구분지어 데이터를 추출하였습니다.

 

if alink.find('hotdeal') == -1:  # 카테고리가 있는 경우
    category = e.find_element(By.CSS_SELECTOR, "span[style='color:#999;font-size:11px;']").text
else:
    category = '미표시'

 

전체 코드입니다. 해당 코드 동작시 핫딜 목록 데이터를 추출하여 엑셀에 저장할 수 있습니다.

 

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains
from webdriver_manager.chrome import ChromeDriverManager
import time
import pyautogui
from openpyxl import Workbook

driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))

wb = Workbook()  # Workbook 생성

ws = wb.active  # 시트 활성화
ws.title = 'hotdeal'  # 시트 타이틀 설정

ws.append(['번호', '카테고리', '제목', '링크'])  # 첫 행에 저장할 데이터 항목 추가

count = 1

for i in range(1, 11):
    driver.get('https://www.ppomppu.co.kr/zboard/zboard.php?id=ppomppu&page=' + str(i) + '&divpage=75')
    driver.implicitly_wait(3)  # 3초안에 페이지가 로드되거나 3초를 대기

    divList = driver.find_elements(By.CSS_SELECTOR,
                                   "div[style='display:inline-block;line-height:1.6;vertical-align:middle;']")  # 목록 div css_selector로 추출

    for e in divList:
        if len(e.find_element(By.CSS_SELECTOR, 'font').get_attribute(
                'style')) != 0:  # 종료된 핫딜인 경우 데이터 추출할 필요가 없기 때문에 추출하지 않음
            continue
        else:  # 종료된 핫딜이 아닌 경우
            alink = e.find_element(By.TAG_NAME, 'a').get_attribute('href')
            name = e.find_element(By.CLASS_NAME, 'list_title').text
            if alink.find('hotdeal') == -1:  # 카테고리가 있는 경우
                category = e.find_element(By.CSS_SELECTOR, "span[style='color:#999;font-size:11px;']").text
            else:
                category = '미표시'

        ws.append([count, category, name, alink])  # 데이터 엑셀에 입력
        count = count + 1

wb.save('/Users/user/Desktop/hot-deal.xlsx')

print('Excel Complete!!!')

driver.quit()

 

저장된 엑셀 파일 실행시 데이터가 잘 입력된 걸 확인할 수 있습니다.

 

 

728x90