학습 기록

Python 공부 기록 #8: 크롤링한 데이터를 Excel로 저장하기

  1. 목차

인트로: 데이터는 모았는데, 어디에 저장하지?

openpyxl: Excel 파일 다루는 라이브러리

기본 실습: Excel 파일 만들고 데이터 쓰기

실전: 크롤링 → Excel 자동 저장

서식 꾸미기: 업무용으로 만들기

아웃트로: 드디어 업무 자동화의 시작

  1. 인트로: 데이터는 모았는데, 어디에 저장하지?

지난 포스팅까지 해서 웹에서 데이터를 긁어오는 데 성공했습니다.

근데 터미널에 print()로 찍어서 보는 것만으로는 뭔가 아쉽더라고요.

“이걸 Excel 파일로 저장해서 팀장님께 보고하면 되겠네!” 하는 생각이 들었습니다.

오늘은 openpyxl이라는 라이브러리로 크롤링한 데이터를 Excel 파일로 저장하는 방법을 정리합니다.

  1. openpyxl: Excel 파일 다루는 라이브러리

파이썬에서 Excel 파일을 만들고 수정할 수 있는 라이브러리가 여러 개 있는데, 그중에서 openpyxl이 가장 많이 쓰인다고 합니다.

설치하기

#bash

pip install openpyxl

Excel 용어 정리

처음에 용어가 좀 헷갈렸는데, 이렇게 이해했습니다:

Workbook: Excel 파일 자체 (예: 데이터.xlsx)

Sheet: 파일 안의 시트 (예: Sheet1, Sheet2)

Cell: 각각의 칸 (예: A1, B2)

  1. 기본 실습: Excel 파일 만들고 데이터 쓰기

실습 1: 빈 파일 만들기

#python

from openpyxl import Workbook

새 워크북 만들기

wb = Workbook()

ws = wb.active # 활성화된 시트 (기본: Sheet1)

데이터 쓰기

ws[‘A1’] = ‘이름’

ws[‘B1’] = ‘나이’

ws[‘A2’] = ‘홍길동’

ws[‘B2’] = 25

파일 저장

wb.save(‘테스트.xlsx’)

print(“파일 저장 완료!”)

실행하니까 진짜 테스트.xlsx 파일이 생겼습니다! 엑셀로 열어보니까 데이터가 제대로 들어가 있더라고요.

실습 2: 반복문으로 여러 줄 쓰기

#python

from openpyxl import Workbook

wb = Workbook()

ws = wb.active

헤더 작성

ws.append([‘이름’, ‘나이’, ‘직업’])

데이터 작성

people = [

[‘홍길동’, 25, ‘개발자’],

[‘김철수’, 30, ‘디자이너’],

[‘이영희’, 28, ‘기획자’]

]

for person in people:

ws.append(person)

wb.save(‘사람목록.xlsx’)

print(“저장 완료!”)

핵심 발견: ws.append(리스트)를 쓰면 한 줄씩 자동으로 추가됩니다! A1, B1 이렇게 일일이 지정 안 해도 되더라고요.

  1. 실전: 크롤링 → Excel 자동 저장

이제 지난 시간에 배운 BeautifulSoup 크롤링과 결합해 봤습니다.

예제: 명언 사이트 크롤링 → Excel 저장

#python

from bs4 import BeautifulSoup

import requests

from openpyxl import Workbook

1. 크롤링

url = “http://quotes.toscrape.com/

response = requests.get(url, timeout=5)

if response.status_code == 200:

soup = BeautifulSoup(response.text, ‘lxml’)

quotes = soup.find_all(‘span’, class_=‘text’)

authors = soup.find_all(‘small’, class_=‘author’)

2. Excel 파일 준비

wb = Workbook()

ws = wb.active

ws.title = “명언 모음” # 시트 이름 바꾸기

3. 헤더 작성

ws.append([‘번호’, ‘명언’, ‘작가’])

4. 데이터 작성

for i in range(len(quotes)):

ws.append([

i + 1,

quotes[i].text.strip(‘“’), # 따옴표 제거

authors[i].text

])

5. 파일 저장

wb.save(‘명언모음.xlsx’)

print(f“총 {len(quotes)}개의 명언을 저장했습니다!”)

else:

print(“크롤링 실패…”)


**실행 결과**:

총 10개의 명언을 저장했습니다!

Excel 파일을 열어보니까 이렇게 정리되어 있었습니다:

번호

명언

작가

1

The world as we have created it…

Albert Einstein

2

It is our choices, Harry…

J.K. Rowling

이게 처음 성공했을 때 진짜 뿌듯했어요. “내가 자동화 프로그램을 만들었구나!” 하는 느낌이 들었습니다.

  1. 서식 꾸미기: 업무용으로 만들기

터미널에서 보는 데이터랑 달리, 보고용 Excel은 좀 예쁘게 만들어야 하잖아요. 서식 기능도 찾아봤습니다.

셀 너비 조정하기

#python

from openpyxl import Workbook

wb = Workbook()

ws = wb.active

ws.append([‘번호’, ‘명언’, ‘작가’])

열 너비 설정 (A열: 10, B열: 80, C열: 20)

ws.column_dimensions[‘A’].width = 10

ws.column_dimensions[‘B’].width = 80

ws.column_dimensions[‘C’].width = 20

wb.save(‘너비조정.xlsx’)

명언 텍스트가 길어서 B열을 80으로 늘렸더니 훨씬 보기 좋아졌습니다.

헤더에 색 입히기

#python

from openpyxl import Workbook

from openpyxl.styles import Font, PatternFill

wb = Workbook()

ws = wb.active

헤더 작성

ws.append([‘번호’, ‘명언’, ‘작가’])

헤더 서식 (첫 번째 행)

for cell in ws[1]:

cell.font = Font(bold=True, color=“FFFFFF”) # 흰색 글자

cell.fill = PatternFill(start_color=“4472C4”, end_color=“4472C4”, fill_type=“solid”) # 파란 배경

wb.save(‘서식적용.xlsx’)

회사에서 보고서 만들 때 이런 식으로 헤더 색 넣잖아요. 이거 하니까 좀 더 프로페셔널해 보이더라고요.

모든 기능 결합한 실무 버전

#python

from bs4 import BeautifulSoup

import requests

from openpyxl import Workbook

from openpyxl.styles import Font, PatternFill, Alignment

url = “http://quotes.toscrape.com/

response = requests.get(url, timeout=5)

if response.status_code == 200:

soup = BeautifulSoup(response.text, ‘lxml’)

quotes = soup.find_all(‘span’, class_=‘text’)

authors = soup.find_all(‘small’, class_=‘author’)

wb = Workbook()

ws = wb.active

ws.title = “명언 데이터”

헤더

ws.append([‘번호’, ‘명언’, ‘작가’])

헤더 서식

for cell in ws[1]:

cell.font = Font(bold=True, color=“FFFFFF”)

cell.fill = PatternFill(start_color=“4472C4”, end_color=“4472C4”, fill_type=“solid”)

cell.alignment = Alignment(horizontal=‘center’)

데이터

for i in range(len(quotes)):

ws.append([i + 1, quotes[i].text.strip(‘“’), authors[i].text])

열 너비

ws.column_dimensions[‘A’].width = 8

ws.column_dimensions[‘B’].width = 80

ws.column_dimensions[‘C’].width = 20

wb.save(‘명언_최종본.xlsx’)

print(f“{len(quotes)}개 저장 완료!“)

  1. 기존 파일에 데이터 추가하기

매번 새 파일을 만드는 게 아니라, 기존 파일에 데이터를 추가하고 싶을 때가 있죠.

#python

from openpyxl import load_workbook

기존 파일 열기

wb = load_workbook(‘명언모음.xlsx’)

ws = wb.active

마지막 행 뒤에 추가

ws.append([11, “새로운 명언”, “홍길동”])

wb.save(‘명언모음.xlsx’)

print(“데이터 추가 완료!”)


`Workbook()` 대신 `load_workbook(파일명)`을 쓰면 기존 파일을 열 수 있습니다. 이거 알고 나니까 "매일 자동으로 데이터 누적"도 가능하겠더라고요.

7. 삽질했던 부분들

① 한글 깨짐

처음에 한글이 `???`로 깨져서 당황했는데, 파일 저장할 때 인코딩 문제는 없더라고요.

그냥 Excel 파일 자체는 UTF-8을 잘 지원해서 openpyxl로 저장하면 한글 문제 없습니다.

② 파일이 열려 있으면 저장 안 됨

Excel 파일을 열어놓은 상태에서 `wb.save()`를 실행하면 에러가 납니다.

PermissionError: [Errno 13] Permission denied

# 파일 닫고 다시 실행하니까 해결됐습니다.

③ 숫자가 텍스트로 저장됨

ws.append(['1', '홍길동']) # '1'이 문자열

# 이렇게 하면 Excel에서 "숫자로 저장된 텍스트" 경고가 뜹니다. 숫자는 따옴표 없이 써야 합니다.

ws.append([1, '홍길동']) # 1이 숫자

8. 정리하며

오늘은 크롤링한 데이터를 Excel로 저장하는 방법을 정리했습니다.

핵심 정리:

openpyxl로 Excel 파일 생성 및 수정

ws.append(리스트)로 한 줄씩 추가

load_workbook()으로 기존 파일 열기

서식 꾸미기로 보고서 퀄리티 높이기

이제 다음과 같은 자동화가 가능해졌습니다:

웹에서 데이터 크롤링 (BeautifulSoup)

데이터 가공 (파이썬 기본 문법)

Excel 파일로 저장 (openpyxl)

다음 포스팅에서는:

여러 페이지 자동으로 넘기면서 크롤링

주기적으로 자동 실행하기 (스케줄링)

이런 걸 해보면서 진짜 "업무 자동화"에 가까워지는 느낌이 들 것 같습니다!

혹시 설명 중에 틀린 부분이나 더 좋은 방법 있으면 알려주세요! 😊