본문 바로가기
Python/Python_Crawling

openpyxl을 활용한 데이터 크롤링 및 엑셀저장

by Mr.DonyStark 2023. 12. 27.

※ 해당 크롤링 사이트는 작성자가 수강료를 지불하고 '잔재미코딩 :  파이썬입문과 크롤링기초 부트캠프 [파이썬, 웹, 데이터 이해 기본까지] (2023년까지 업데이트)' 강의에서 제공한 사이트임.
※  수강하면서 별도 코딩하고 녹화하였음.

TMI 지만 잔재미코딩 강의 강추합니다.

 


□ 목적 : 상품명과 등록일에 대한 태그값을 활용하여 크롤링한 데이터를 openpyxl 라이브러로 엑셀로 저장

#관련함수 라이브러리 실행
import requests #크롤링관련 라이브러리
from bs4 import BeautifulSoup #크롤링관련 라이브러리
import openpyxl #엑셀관련 라이브러리 

#★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
#1단계 : 함수정의★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
#★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

def mall_info_get(file_nm, sheet_nm, raw_data):
    new_file = openpyxl.Workbook() #파일생성
    first_sheet = new_file.active #시트선택
    first_sheet.column_dimensions['A'].width = 50 #A열 너비 50지정
    first_sheet.column_dimensions['B'].width = 50 #B열 너비 50지정

    #시트명이 공란이 아니면 sheet_nm이 시트명으로 지정
    if sheet_nm != '':
        first_sheet.title = sheet_nm
    #로우데이터의 데이터가 first_sheet A,B,C열에 적재
    for v in raw_data:
        first_sheet.append(v)
    #파일저장
    new_file.save(f'{file_nm}.xlsx')  #매개변수로 받은 file_nm이 파일명이 되도록 설정
    #저장후 종료
    new_file.close()

#★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
#2단계 : requests 활용 크롤링★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
#★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

target_web = requests.get('https://davelee-fun.github.io/') #해당 링크의 값 가져오기
parser_tool = BeautifulSoup(target_web.content,'html.parser')

base_data_1 = list() #빈 리스트 생성 - 함수호출시 매개변수로 사용예정
base_data_2 = list() #빈 리스트 생성 - 함수호출시 매개변수로 사용예정

prod_nm = parser_tool.select('h4.card-text') #클래스명이 card-text인 h4태그의 모든 값을 가져옴
for v1 in prod_nm:
    base_data_1.append(v1.get_text().strip().split(':')[1])

prod_reg = parser_tool.select('span.post-date') #클래스명이 post-date인 span태그의 모든 값을 가져옴
for v2 in prod_reg:
    base_data_2.append(v2.get_text())

data_form = list()       
for vv1, vv2 in zip(base_data_1,base_data_2):  #zip함수를 활용하여 2개의 값을 묶어서 튜플형태로 저장
    #append([vv1,vv2]) 로 튜플을 리스트화하여 코드작성을 하면 아래 반복문 실행을 안해도됨
    data_form.append(vv1)
    data_form.append(vv2)

raw_data = list()
for v3 in range(0,len(data_form),2):
    raw_data.append(list((data_form[v3],data_form[v3+1])))  #튜플형태의 값을 list화하여 한개의 데이터로 병합 및 저장

#★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
#3단계 : 함수 호출★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
#★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
mall_info_get('shop_prod_data', 'prod_reg', raw_data)