반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

 

2022.03.11 - [파이썬 패키지/라이브러리&패키지 소개] - 파이썬 주요 라이브러리 정리


업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART) 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

오늘은 코딩유치원에 방문하신 손님께서 문의하셨던 '홈쇼핑모아'라는 사이트의 정보를 크롤링하는 프로젝트를 공유드리겠습니다.

 


1. 프로젝트 목표

 

1) 목표 사이트

https://hsmoa.com/

 

홈쇼핑모아 - 모든 홈쇼핑을 한눈에!

| 5시 14분 ~ 5시 19분 사계절 착용 가능, 클래식 스타일, 트윌 솔리드 셔츠 예작 22FW 최신상 컴포트 셔츠 3종 백화점 매장 동일 정상 제품 109,000원

hsmoa.com

 

2) 목표 데이터

오늘 이후 5일간 편성표의 날짜, 상품명, 방송시간, 가격 (사진도 요청하셨지만 난이도가 확 달라지므로 보류) 

 

 

2. 프로젝트 코드

# step1.필요한 패키지와 모듈 불러오기
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
import time
import pandas as pd

# step2.오늘 이후의 5일만 선택하기 위한 오늘 날짜 파악
info_time = time.localtime()
today = str(info_time.tm_year) + '0' +str(info_time.tm_mon) + str(info_time.tm_mday) #중간에 0은 태그의 속성값과 포맷 일치를 위함
print(today)

# step3.크롬 웹드라이버 실행 & 홈쇼핑 사이트 접속
driver = webdriver.Chrome(r"C:\Users\SANGWOO\Desktop\chromedriver.exe")
url = "https://hsmoa.com/?date="+today+"&site=&cate=식품·건강" #식품건강 카테고리
driver.get(url)
time.sleep(1)

# step4.오늘 이후 날짜 정보 획득 함수 정의
def get_target_date(driver, today):
    
    list_temp = []

    # 날짜 선택
    btn_date = driver.find_elements_by_class_name("date")

    for i in btn_date:
        if int(i.get_attribute("data-date")) > int(today):
            list_temp.append(i.get_attribute("data-date"))

    return(list_temp)


# step5.총 5일동안의 쇼핑몰 편성표 크롤링

# 날짜, 상품명, 방송시간, 가격을 담을 리스트 선언
list_date = []
list_title = []
list_airtime = []
list_price = []

# 날짜 5일이 입력된 리스트
list_five_days = get_target_date(driver, today)
print(list_five_days)

for day in list_five_days:

    url = "https://hsmoa.com/?date="+day+"&site=&cate=식품·건강"
    driver.get(url)
    time.sleep(2)

    #날짜 & 제목
    title = driver.find_elements_by_class_name("font-15")
    for i in title:
        if i.text != "": #공백 제거
            list_date.append(day)
            list_title.append(i.text)
    
    #방송시간
    airtime = driver.find_elements_by_class_name("font-12.c-midgray")
    for i in airtime:
        if i.text != "": #공백 제거
            list_airtime.append(i.text)
    
    # 가격
    price = driver.find_elements_by_class_name("strong.font-17.c-black")
    for i in price:
        if i.text != "": #공백 제거
            list_price.append(i.text)

# step6.zip 모듈을 이용해서 list를 묶어주기        
list_sum = list(zip(list_date, list_title, list_airtime, list_price))

# step7.데이터프레임의 첫행에 들어갈 컬럼명
col = ['날짜','제품명','방송시간','가격']

# step8.pandas 데이터 프레임 형태로 가공
df = pd.DataFrame(list_sum, columns=col)

# step9.엑셀에 저장
df.to_excel('쇼핑몰 편성표_5일.xlsx')

driver.quit()

 

<코드 실행 결과>

 

3. 프로젝트 후기

 

1) 아무 생각없이 동적 웹크롤링 방식을 사용해서 코드 실행 시간이 2분 50초나 걸렸음. (어제는 1분 10초 정도)

    --> 다음엔 requests와 bs4 패키지를 쓰는 정적 웹크롤링 방식을 사용해서 시간을 줄여야겠음.

 

2) 사진을 함께 크롤링해서 엑셀에 차례대로 삽입하는 것은 아직 효율적인 방법을 모르겠음.

    --> 추후에 도전해봐야겠음. 


끝.

반응형

+ Recent posts