본문 바로가기

카테고리 없음

Python 크롤링 데이터를 구글 스프레드시트에 자동 저장하는 방법

반응형

Python 크롤링 데이터를 구글 스프레드시트에 자동 저장하는 방법

웹 크롤링으로 수집한 데이터를 어디에 저장하시나요? CSV 파일로 저장하는 것도 좋지만, 구글 스프레드시트에 바로 저장하면 실시간으로 데이터를 확인하고 팀원들과 공유하기가 훨씬 편리합니다. 이번 포스트에서는 Python으로 크롤링한 데이터를 구글 스프레드시트에 자동으로 저장하는 방법을 알아보겠습니다.

1. Google Sheets API 사용하기 (가장 안정적인 방법)

구글에서 공식적으로 제공하는 API를 사용하는 방법입니다. 가장 안정적이고 권장되는 방식이에요.

필요한 라이브러리 설치

pip install gspread oauth2client

기본 사용법

import gspread
from oauth2client.service_account import ServiceAccountCredentials

# 인증 설정
scope = ['https://spreadsheets.google.com/feeds',
         'https://www.googleapis.com/auth/drive']
creds = ServiceAccountCredentials.from_json_keyfile_name('credentials.json', scope)
client = gspread.authorize(creds)

# 스프레드시트 열기
sheet = client.open('크롤링 데이터').sheet1

# 데이터 추가
data = [['제목1', '내용1', '날짜1'],
        ['제목2', '내용2', '날짜2']]
sheet.append_rows(data)

# 또는 한 줄씩 추가
sheet.append_row(['제목', '내용', '날짜'])

초기 설정 과정

  1. Google Cloud Console에 접속하여 새 프로젝트 생성
  2. Google Sheets API 활성화
  3. 서비스 계정 만들고 JSON 키 다운로드
  4. 다운로드한 JSON 파일을 프로젝트 폴더에 저장 (예: credentials.json)
  5. 구글 스프레드시트를 서비스 계정 이메일과 공유
💡 Tip: 서비스 계정 이메일은 JSON 파일 안에 있는 "client_email" 값입니다. 이 이메일 주소로 스프레드시트를 공유해야 접근할 수 있어요.

2. Pandas DataFrame과 함께 사용하기

크롤링한 데이터를 DataFrame으로 정리해서 한 번에 저장하는 방법입니다.

필요한 라이브러리 설치

pip install gspread-dataframe pandas

사용 예시

import gspread
from gspread_dataframe import set_with_dataframe
import pandas as pd
from oauth2client.service_account import ServiceAccountCredentials

# 인증
scope = ['https://spreadsheets.google.com/feeds',
         'https://www.googleapis.com/auth/drive']
creds = ServiceAccountCredentials.from_json_keyfile_name('credentials.json', scope)
client = gspread.authorize(creds)

# DataFrame 생성
df = pd.DataFrame({
    '제목': ['제목1', '제목2', '제목3'],
    '내용': ['내용1', '내용2', '내용3'],
    '날짜': ['2024-01-01', '2024-01-02', '2024-01-03']
})

# 스프레드시트에 저장
sheet = client.open('크롤링 데이터').sheet1
set_with_dataframe(sheet, df)

3. 실시간 추가 vs 배치 저장

데이터를 저장하는 방식에는 두 가지가 있습니다. 상황에 맞게 선택하세요.

실시간 추가 방식

# 크롤링하면서 바로바로 추가
for item in crawled_data:
    sheet.append_row([item['title'], item['content'], item['date']])
    # 장점: 중간에 오류가 나도 저장된 데이터는 남음
    # 단점: API 호출이 많아서 느림

배치 저장 방식 (권장)

# 모든 데이터를 수집한 후 한 번에 저장
all_data = []
for item in crawled_data:
    all_data.append([item['title'], item['content'], item['date']])

sheet.append_rows(all_data)
# 장점: 빠름, API 호출 횟수 적음
# 단점: 중간에 오류 나면 모든 데이터 날아감
⚠️ 주의: Google Sheets API는 분당 요청 횟수 제한이 있습니다. 대량의 데이터를 저장할 때는 배치 저장 방식을 사용하세요.

4. 실전 예제: 뉴스 크롤링하여 저장하기

실제로 뉴스를 크롤링해서 구글 스프레드시트에 저장하는 완전한 예제입니다.

import requests
from bs4 import BeautifulSoup
import gspread
from oauth2client.service_account import ServiceAccountCredentials
from datetime import datetime

# 스프레드시트 연결
scope = ['https://spreadsheets.google.com/feeds',
         'https://www.googleapis.com/auth/drive']
creds = ServiceAccountCredentials.from_json_keyfile_name('credentials.json', scope)
client = gspread.authorize(creds)
sheet = client.open('뉴스 크롤링').sheet1

# 헤더가 없으면 추가
if sheet.row_count == 0:
    sheet.append_row(['제목', '링크', '날짜', '수집시간'])

# 크롤링
url = "https://example.com/news"
headers = {'User-Agent': 'Mozilla/5.0'}
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')

# 데이터 수집
news_data = []
for article in soup.select('.article'):
    title = article.select_one('.title').text.strip()
    link = article.select_one('a')['href']
    date = article.select_one('.date').text.strip()
    collected_at = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    
    news_data.append([title, link, date, collected_at])

# 한 번에 저장
if news_data:
    sheet.append_rows(news_data)
    print(f"{len(news_data)}개의 뉴스를 저장했습니다.")
else:
    print("수집된 데이터가 없습니다.")

5. Supabase vs Google Sheets: 언제 무엇을 사용할까?

데이터베이스도 있는데 왜 구글 스프레드시트를 사용할까요? 각각의 장단점을 비교해보겠습니다.

기준 Google Sheets Supabase / DB
속도 느림 (API 제한 있음) 빠름
데이터량 소량 (최대 10만 행 권장) 대량 데이터 OK
협업 매우 쉬움 (공유만 하면 됨) 별도 대시보드 필요
시각화 바로 가능 (차트, 필터 등) 별도 작업 필요
쿼리 제한적 (필터, 정렬 정도) SQL로 자유롭게
비용 무료 (구글 계정만 있으면) 무료~유료 (규모에 따라)
설정 난이도 쉬움 중간

추천 사용 케이스

Google Sheets를 사용하면 좋을 때:

  • 비개발자와 데이터를 공유해야 할 때
  • 실시간으로 데이터를 확인하고 싶을 때
  • 간단한 모니터링 대시보드가 필요할 때
  • 데이터를 수동으로 수정할 일이 있을 때
  • 프로토타입이나 간단한 프로젝트

Supabase/DB를 사용하면 좋을 때:

  • 대량의 데이터를 다룰 때 (10만 행 이상)
  • 복잡한 쿼리가 필요할 때
  • 다른 서비스와 API 연동이 필요할 때
  • 높은 성능이 필요할 때
  • 프로덕션 레벨의 서비스

6. 자주 발생하는 오류와 해결 방법

오류 1: APIError: [403] PERMISSION_DENIED

원인: 서비스 계정에 스프레드시트 접근 권한이 없음

해결: 스프레드시트를 서비스 계정 이메일(JSON 파일의 client_email)과 공유

오류 2: SpreadsheetNotFound

원인: 스프레드시트 이름이 틀렸거나 존재하지 않음

해결: 스프레드시트 이름을 정확히 입력하거나, URL로 열기

sheet = client.open_by_url('https://docs.google.com/spreadsheets/d/스프레드시트ID/edit')

오류 3: Quota exceeded

원인: API 호출 횟수 제한 초과

해결: 배치 저장 방식 사용, time.sleep()으로 딜레이 추가

7. 추가 팁

특정 셀에 데이터 쓰기

# A1 셀에 쓰기
sheet.update('A1', '제목')

# 범위 지정해서 쓰기
sheet.update('A1:C1', [['제목', '내용', '날짜']])

데이터 읽어오기

# 모든 데이터 읽기
all_data = sheet.get_all_records()

# 특정 셀 읽기
value = sheet.acell('A1').value

# 특정 행 읽기
row = sheet.row_values(1)

워크시트 여러 개 사용하기

# 특정 워크시트 선택
worksheet = client.open('크롤링 데이터').worksheet('시트1')

# 새 워크시트 추가
spreadsheet = client.open('크롤링 데이터')
new_sheet = spreadsheet.add_worksheet(title="새시트", rows="100", cols="20")

마치며

구글 스프레드시트는 간단한 크롤링 프로젝트나 데이터 모니터링에 매우 유용한 도구입니다. 특히 비개발자와 협업할 때나 빠르게 프로토타입을 만들 때 큰 장점이 있습니다. 다만 대량의 데이터나 복잡한 처리가 필요하다면 데이터베이스 사용을 고려해보세요.

크롤링한 데이터를 어떻게 활용하고 계신가요? 더 궁금한 점이 있다면 댓글로 남겨주세요!

반응형