Profile picture

[Python] 크롤링한 데이터를 효율적으로 엑셀로 변환하기 - Pandas

JaehyoJJAng2024년 08월 03일

개요

크롤링으로 수집한 데이터를 어떻게 효율적으로 관리하고 활용해야할까?

엑셀 파일로 데이터를 저장하면 공유나 분석에 편리함을 더할 수 있으므로 이번 포스팅에서는 파이썬을 활용하여

크롤링한 데이터를 다양한 방식으로 엑셀로 변환하는 방법에 대해서 기록해보려고 한다.


기본 크롤링 및 데이터 수집

간단한 웹 크롤링 예제를 통해 데이터를 수집함.

추출된 데이터들은 아래 시나리오별 챕터에서 쓰일 것임

import requests
from bs4 import BeautifulSoup

url = 'https://example.com/products'
response = requests.get(url)
soup = BeautifulSoup(response.content, 'html.parser')

products = []
for item in soup.find_all('div', class_='product'):
    name = item.find('h2').text
    price = int(item.find('span', class_='price').text.replace(',', '').replace('원', ''))
    category = item.find('span', class_='category').text
    products.append({'상품명': name, '가격': price, '카테고리': category})

# 데이터프레임 생성
import pandas as pd
df = pd.DataFrame(products)

시나리오별 데이터 처리 및 엑셀 저장 방법

1. 특정 조건에 따라 데이터를 필터링하여 엑셀로 저장

예를 들어, 크롤링한 제품 데이터 중 가격이 10,000원 이상인 상품만을 필터링하여 저장할 때

import pandas as pd

# 크롤링한 데이터 예시 (DataFrame으로 가정)
data = {
    '상품명': ['상품A', '상품B', '상품C', '상품D'],
    '가격': [8000, 12000, 15000, 5000],
    '카테고리': ['전자제품', '전자제품', '가전제품', '생활용품']
}
df = pd.DataFrame(data)

# 가격이 10,000원 이상인 상품만 필터링
filtered_df = df[df['가격'] >= 10000]

# 필터링된 데이터를 엑셀로 저장
filtered_df.to_excel('filtered_products.xlsx', index=False)

2. 카테고리별로 데이터를 분류하여 각 시트에 저장

크롤링한 상품 데이터를 카테고리별로 분류하고, 각 카테고리를 엑셀 파일의 개별 시트에 저장

import pandas as pd

# 크롤링한 데이터 예시
data = {
    '상품명': ['상품A', '상품B', '상품C', '상품D'],
    '가격': [8000, 12000, 15000, 5000],
    '카테고리': ['전자제품', '전자제품', '가전제품', '생활용품']
}
df = pd.DataFrame(data)

# 엑셀 작성자 생성
with pd.ExcelWriter('categorized_products.xlsx') as writer:
    for category, group in df.groupby('카테고리'):
        group.to_excel(writer, sheet_name=category, index=False)

3. 데이터를 취합하여 요약 정보 저장

크롤링한 판매 데이터를 기반으로 각 카테고리별 총 판매량과 평균 가격을 계산하여 저장

import pandas as pd

# 크롤링한 판매 데이터 예시
data = {
    '카테고리': ['전자제품', '전자제품', '가전제품', '생활용품', '전자제품'],
    '판매량': [10, 20, 5, 15, 25],
    '가격': [8000, 12000, 15000, 5000, 10000]
}
df = pd.DataFrame(data)

# 카테고리별 총 판매량과 평균 가격 계산
summary_df = df.groupby('카테고리').agg({
    '판매량': 'sum',
    '가격': 'mean'
}).reset_index()

# 요약 정보를 엑셀로 저장
summary_df.to_excel('sales_summary.xlsx', index=False)

4. 여러 데이터 소스를 병합하고 중복 제거 후 저장하기

여러 웹사이트에서 동일한 상품 데이터를 크롤링하여 하나의 데이터프레임으로 병합하고, 중복된 상품을 제거한 후 저장

import pandas as pd

# 사이트 A에서 크롤링한 데이터
data_a = {
    '상품명': ['상품A', '상품B', '상품C'],
    '가격': [8000, 12000, 15000]
}
df_a = pd.DataFrame(data_a)

# 사이트 B에서 크롤링한 데이터
data_b = {
    '상품명': ['상품B', '상품C', '상품D'],
    '가격': [11500, 14800, 5000]
}
df_b = pd.DataFrame(data_b)

# 데이터 병합
merged_df = pd.concat([df_a, df_b], ignore_index=True)

# 중복 제거 (상품명 기준)
deduplicated_df = merged_df.drop_duplicates(subset='상품명', keep='first')

# 결과를 엑셀로 저장
deduplicated_df.to_excel('merged_products.xlsx', index=False)

5. 여러 개의 엑셀 파일을 하나로 통합

크롤링한 데이터가 여러 엑셀 파일로 저장되어 있을 때, 이를 하나의 엑셀 파일로 통합

import pandas as pd
import glob

# 엑셀 파일 목록 가져오기
excel_files = glob.glob('data_folder/*.xlsx')

# 데이터프레임 리스트 생성
df_list = []
for file in excel_files:
    df = pd.read_excel(file)
    df_list.append(df)

# 데이터프레임 통합
combined_df = pd.concat(df_list, ignore_index=True)

# 통합된 데이터 저장
combined_df.to_excel('combined_data.xlsx', index=False)

6. 특정 열을 기준으로 데이터를 정렬하여 저장

크롤링한 데이터를 특정 열(예: 가격) 기준으로 오름차순 또는 내림차순 정렬하여 저장

import pandas as pd

# 크롤링한 데이터 예시
data = {
    '상품명': ['상품A', '상품B', '상품C', '상품D'],
    '가격': [8000, 12000, 15000, 5000]
}
df = pd.DataFrame(data)

# 가격 기준 내림차순 정렬
sorted_df = df.sort_values(by='가격', ascending=False)

# 정렬된 데이터 저장
sorted_df.to_excel('sorted_data.xlsx', index=False)

Loading script...