학습 기록
Python 공부 기록 #8: 크롤링한 데이터를 Excel로 저장하기
- 목차
인트로: 데이터는 모았는데, 어디에 저장하지?
openpyxl: Excel 파일 다루는 라이브러리
기본 실습: Excel 파일 만들고 데이터 쓰기
실전: 크롤링 → Excel 자동 저장
서식 꾸미기: 업무용으로 만들기
아웃트로: 드디어 업무 자동화의 시작
- 인트로: 데이터는 모았는데, 어디에 저장하지?
지난 포스팅까지 해서 웹에서 데이터를 긁어오는 데 성공했습니다.
근데 터미널에 print()로 찍어서 보는 것만으로는 뭔가 아쉽더라고요.
“이걸 Excel 파일로 저장해서 팀장님께 보고하면 되겠네!” 하는 생각이 들었습니다.
오늘은 openpyxl이라는 라이브러리로 크롤링한 데이터를 Excel 파일로 저장하는 방법을 정리합니다.
- openpyxl: Excel 파일 다루는 라이브러리
파이썬에서 Excel 파일을 만들고 수정할 수 있는 라이브러리가 여러 개 있는데, 그중에서 openpyxl이 가장 많이 쓰인다고 합니다.
설치하기
#bash
pip install openpyxl
Excel 용어 정리
처음에 용어가 좀 헷갈렸는데, 이렇게 이해했습니다:
Workbook: Excel 파일 자체 (예: 데이터.xlsx)
Sheet: 파일 안의 시트 (예: Sheet1, Sheet2)
Cell: 각각의 칸 (예: A1, B2)
- 기본 실습: 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 이렇게 일일이 지정 안 해도 되더라고요.
- 실전: 크롤링 → 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
…
…
…
이게 처음 성공했을 때 진짜 뿌듯했어요. “내가 자동화 프로그램을 만들었구나!” 하는 느낌이 들었습니다.
- 서식 꾸미기: 업무용으로 만들기
터미널에서 보는 데이터랑 달리, 보고용 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)}개 저장 완료!“)
- 기존 파일에 데이터 추가하기
매번 새 파일을 만드는 게 아니라, 기존 파일에 데이터를 추가하고 싶을 때가 있죠.
#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)
다음 포스팅에서는:
여러 페이지 자동으로 넘기면서 크롤링
주기적으로 자동 실행하기 (스케줄링)
이런 걸 해보면서 진짜 "업무 자동화"에 가까워지는 느낌이 들 것 같습니다!
혹시 설명 중에 틀린 부분이나 더 좋은 방법 있으면 알려주세요! 😊