파이썬 프로그래밍

파이썬 웹 스크래핑 크롤링 후 엑셀 데이터 저장 샘플 프로그래밍

코니코니 2022. 10. 31. 12:00
반응형

파이썬 웹 스크래핑 크롤링 후 엑셀 데이터 저장 샘플 프로그래밍


파이썬을 사용하여 웹에서 특정 데이터를 추출 및 가공 후 엑셀에 저장하는 방법에 대해서 알아보도록 하겠습니다. 먼저 웹데이터 크롤링을 위한 라이브러리로 requests, BeautifulSoup 두가지를 사용했고 엑셀 데이터 저장에는 openpyxl을 사용했습니다.

import requests
from bs4 import BeautifulSoup
from openpyxl import Workbook

data_box = []

# 유저 에이전트
h = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 '
                   'Safari/537.36'} 
# 무신사 상품 리스트 주소
url = 'https://www.musinsa.com/search/musinsa/goods?q=%EB%8B%88%ED%8A%B8&list_kind=small&sortCode=pop&sub_sort=&page=1'

get_musinsa = requests.get(url, headers=h)
soup = BeautifulSoup(get_musinsa.text, 'html.parser')
site_data = soup.find(id='searchList').find_all(class_='article_info')
for c in site_data:
    item_title = str(c.find(class_='item_title').text).replace(' ', '').replace('\n', '')
    list_info = str(c.find(class_='list_info').text).replace(' ', '').replace('\n', '')
    price_ck = str(c.find(class_='price').text).replace(' ', '').replace('\n', '').split('원')
    price = ''
    if price_ck[1]:
        price = price_ck[1] + '원'
    else:
        price = price_ck[0] + '원'
    try:
        count_view = str(c.find(class_='count').text).replace(' ', '').replace('\n', '') + '개'
    except AttributeError:
        count_view = 'None'
    item_url = str(c.find(class_='list_info').find('a')['href'])
    data_box.append([item_title, list_info, price, count_view, item_url])

# 엑셀파일 쓰기
write_wb = Workbook()
write_ws = write_wb.active
write_ws.column_dimensions['A'].width = 20
write_ws.column_dimensions['B'].width = 60
write_ws.column_dimensions['C'].width = 20
write_ws.column_dimensions['D'].width = 20
write_ws.column_dimensions['E'].width = 20
write_ws['A1'] = '브랜드'
write_ws['B1'] = '상품명'
write_ws['C1'] = '가격'
write_ws['D1'] = '리뷰 개수'
write_ws['E1'] = '링크'

sell_count = 2
# 행 단위로 추가
for z in data_box:
    write_ws[f'A{sell_count}'].value = z[0]
    write_ws[f'B{sell_count}'].value = z[1]
    write_ws[f'C{sell_count}'].value = z[2]
    write_ws[f'D{sell_count}'].value = z[3]

    # 하이퍼링크 추가
    write_ws[f'E{sell_count}'].hyperlink = z[4]
    write_ws[f'E{sell_count}'].value = z[4]
    write_ws[f'E{sell_count}'].style = "Hyperlink"
    sell_count += 1

write_wb.save(fr"무신사 상품 리스트.xlsx")
write_wb.close()

input('작업 완료')

먼저 requests, BeautifulSoup 두가지를 사용해서 웹에서 데이터를 추출 후 리스트에 저장을 합니다. 그리고 리스트를 for문에 대입을 시켜서 순서대로 엑셀에 입력을 하고 xlsx 파일로 저장을 하는 것입니다.

data_box = []

# 유저 에이전트
h = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 '
                   'Safari/537.36'} 
# 무신사 상품 리스트 주소
url = 'https://www.musinsa.com/search/musinsa/goods?q=%EB%8B%88%ED%8A%B8&list_kind=small&sortCode=pop&sub_sort=&page=1'

get_musinsa = requests.get(url, headers=h)
soup = BeautifulSoup(get_musinsa.text, 'html.parser')
site_data = soup.find(id='searchList').find_all(class_='article_info')
for c in site_data:
    item_title = str(c.find(class_='item_title').text).replace(' ', '').replace('\n', '')
    list_info = str(c.find(class_='list_info').text).replace(' ', '').replace('\n', '')
    price_ck = str(c.find(class_='price').text).replace(' ', '').replace('\n', '').split('원')
    price = ''
    if price_ck[1]:
        price = price_ck[1] + '원'
    else:
        price = price_ck[0] + '원'
    try:
        count_view = str(c.find(class_='count').text).replace(' ', '').replace('\n', '') + '개'
    except AttributeError:
        count_view = 'None'
    item_url = str(c.find(class_='list_info').find('a')['href'])
    data_box.append([item_title, list_info, price, count_view, item_url])

requests, BeautifulSoup을 사용하여 데이터를 추출하는 과정입니다. 데이터 추출 과정에서 텍스트의 불필요한 띄어쓰기와 줄바꿈 등을 replace로 제거한 뒤 data_box 리스트에 넣어줬습니다. 페이지의 데이터를 다 추출 한 뒤 openpyxl 코드로 넘어갑니다.

# 엑셀파일 쓰기
write_wb = Workbook()
write_ws = write_wb.active
write_ws.column_dimensions['A'].width = 20
write_ws.column_dimensions['B'].width = 60
write_ws.column_dimensions['C'].width = 20
write_ws.column_dimensions['D'].width = 20
write_ws.column_dimensions['E'].width = 20
write_ws['A1'] = '브랜드'
write_ws['B1'] = '상품명'
write_ws['C1'] = '가격'
write_ws['D1'] = '리뷰 개수'
write_ws['E1'] = '링크'

sell_count = 2
# 행 단위로 추가
for z in data_box:
    write_ws[f'A{sell_count}'].value = z[0]
    write_ws[f'B{sell_count}'].value = z[1]
    write_ws[f'C{sell_count}'].value = z[2]
    write_ws[f'D{sell_count}'].value = z[3]

    # 하이퍼링크 추가
    write_ws[f'E{sell_count}'].hyperlink = z[4]
    write_ws[f'E{sell_count}'].value = z[4]
    write_ws[f'E{sell_count}'].style = "Hyperlink"
    sell_count += 1

write_wb.save(fr"무신사 상품 리스트.xlsx")
write_wb.close()

openpyxl에서 행과 열에 데이터를 넣는 과정은 어렵지 않기 때문에 특별하게 설명할 기능들은 없는 것 같습니다. openpyxl 자체적으로 엑셀 대부분의 기능을 사용할 수 있고 하이퍼링크를 추가하는 것 또한 간단한 코드 몇 줄로 작업이 가능합니다.

코드의 끝에 도달하면 디렉토리에 무신사 상품 리스트.xlsx 파일이 저장됩니다.

requests, BeautifulSoup을 활용해 데이터를 가공한 브랜드, 상품명, 가격, 리뷰 개수, url 등 문제없이 엑셀 파일에 저장된 것을 볼 수 있습니다. (중간에 브랜드 명 주말특가 옥에 티 하나 발견!!)

반응형