1. 크롤링 데이터 저장 개요
(1) 크롤링을 통해 수집한 데이터의 저장
💡크롤링을 통해 수집한 데이터는 다양한 형식과 구조를 가질 수 있으며, 이를 효율적으로 저장하고 활용하기 위해서는 적절한 저장 방식을 선택하는 것이 중요하다. 데이터의 특성과 목적에 따라 파일 시스템, 데이터베이스 등 여러 가지 방법을 사용할 수 있다.
(2) 데이터 저장의 필요성
- 수집한 데이터를 안전하게 보관하여 이후 분석이나 활용에 사용하기 위해 데이터의 영속성을 보장해야 한다.
- 적절한 형식으로 데이터를 저장하여 검색 및 처리 효율 향상시킬 수 있도록 데이터를 구조화 해야 한다.
- 팀원 간, 다른 프로젝트 간 데이터 공유 및 재사용을 저장이 필요하다.
(3) 데이터 저장 시 고려사항
- 데이터의 특성을 파악한다.
- 구조화 여부 : 데이터가 표 형태인지, 중첩 구조인지 파악
- 데이터 양 : 데이터의 크기에 따라 적합한 저장소 선택
- 데이터 변경 빈도 : 실시간 데이터인지, 일회성 데이터인지 고려
- 데이터 활용 목적을 명확히 하여 저장 방식을 선정한다.
- 데이터베이스에 저장하여 SQL로 분석하는 데이터 분석에 사용
- 파일 시스템에 저장하여 머신러닝 모델 학습에 사용
- 클라우드 데이터베이스에 저장하여 웹 서비스에서 활용
- 보안 및 개인정보 보호에 유의한다.
- 민감한 정보 암호화 : 개인정보나 민감한 데이터는 암호화하여 저장
- 접근 권한 관리 : 데이터베이스의 접근 권한을 적절히 설정
- 법적 규제 준수 : 개인정보 보호법 등 관련 법규를 준수
- 데이터를 검증 및 정제하여 정확성과 완전성을 확인한 뒤 저장한다.
- 데이터 저장 과정에서 발생하는 에러를 기록하고 모니터링하는 전략을 수립한다.
- 데이터 스키마 변경 시 버전 관리 체계 수립한다.
- 향후 데이터 증가에 대비한 확장성을 고려하여 저장소를 선택 및 설계한다.
(4) 데이터 저장 방식 종류
- 파일 시스템 : CSV, JSON, XML, Excel 등 파일 형식으로 저장한다.
- 관계형 데이터베이스(RDBMS) : MySQL, PostgreSQL 등 스키마 기반의 테이블에 저장한다.
- NoSQL 데이터베이스 : MongoDB, Cassandra 등 유연한 스키마를 가진 데이터베이스에 저장한다.
- 데이터 웨어하우스 및 빅데이터 저장소 : Hadoop HDFS, Amazon S3 등 대용량 데이터 저장에 사용한다.
- 클라우드 스토리지 : Firebase, AWS DynamoDB 등 클라우드 기반 서비스를 활용한다.
2. 파일 시스템에 저장
01. CSV 파일
- 콤마로 구분된 값으로 데이터를 저장하며, 표 형태의 데이터에 적합하다
- 장점 : Excel 등 응용 프로그램을 활용해 열 수 있고, 대부분의 프로그래밍 언어에서 지원하는 라이브러리가 존재
- 단점 : 중첩 구조나 복잡한 데이터 표현에 부적합하다
import csv
data = [
{'name': 'Alice', 'age': 30, 'city': 'Seoul'},
{'name': 'Bob', 'age': 25, 'city': 'Busan'}
]
with open('data.csv', 'w', newline='', encoding='utf-8') as csvfile:
fieldnames = ['name', 'age', 'city']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
for row in data:
writer.writerow(row)
02. JSON 파일
- JavaScript Object Notation의 약자로, 키-값 쌍으로 이루어진 데이터 형식으로 저장하며, 계층 구조 및 복잡한 데이터 표현에 적합하다.
- 장점 : 웹 및 모바일 애플리케이션에서 널리 사용되는 형식이다.
- 단점 : 대용량 데이터의 경우 효율성이 저하된다.
import json
data = [
{'name': 'Alice', 'age': 30, 'city': 'Seoul'},
{'name': 'Bob', 'age': 25, 'city': 'Busan'}
]
with open('data.json', 'w', encoding='utf-8') as jsonfile:
json.dump(data, jsonfile, ensure_ascii=False, indent=4)
03. XML 파일
- eXtensible Markup Language의 약자로, 태그를 사용하여 데이터 구조 표현하며 문서형 데이터에 적합하다.
- 장점 : 데이터의 의미와 구조를 명확하게 표현할 수 있다.
- 단점 : 구문이 복잡하고 파일 크기가 커질 수 있다.
import xml.etree.ElementTree as ET
root = ET.Element('people')
person1 = ET.SubElement(root, 'person')
ET.SubElement(person1, 'name').text = 'Alice'
ET.SubElement(person1, 'age').text = '30'
ET.SubElement(person1, 'city').text = 'Seoul'
person2 = ET.SubElement(root, 'person')
ET.SubElement(person2, 'name').text = 'Bob'
ET.SubElement(person2, 'age').text = '25'
ET.SubElement(person2, 'city').text = 'Busan'
tree = ET.ElementTree(root)
tree.write('data.xml', encoding='utf-8', xml_declaration=True)
04. Excel 파일
- 스프레드시트 형식으로 데이터를 저장하며, 데이터 분석 및 시각화에 편리하다.
- 장점 : 비개발자도 쉽게 접근 가능한 파일 형태이다.
- 단점 : 대용량 데이터 처리에 부적합하다.
import pandas as pd
data = [
{'name': 'Alice', 'age': 30, 'city': 'Seoul'},
{'name': 'Bob', 'age': 25, 'city': 'Busan'}
]
df = pd.DataFrame(data)
df.to_excel('data.xlsx', index=False)
3. 관계형 데이터베이스에 저장
[MySQL]
- 테이블 스키마에 따라 데이터를 저장하고, SQL을 사용하여 데이터 조회 및 조작한다.
- 장점 : 데이터 무결성이 보장되며 복잡한 쿼리 및 조인을 이용해 자유로운 데이터 조작이 가능하다.
- 단점 : 스키마 변경이 어렵고, 유연성이 낮다.
import pymysql
data = [
{'name': 'Alice', 'age': 30, 'city': 'Seoul'},
{'name': 'Bob', 'age': 25, 'city': 'Busan'}
]
connection = pymysql.connect(
host='localhost',
user='user',
password='password',
db='mydatabase',
charset='utf8mb4'
)
try:
with connection.cursor() as cursor:
sql = "INSERT INTO people (name, age, city) VALUES (%s, %s, %s)"
for person in data:
cursor.execute(sql, (person['name'], person['age'], person['city']))
connection.commit()
finally:
connection.close()
4. NoSQL 데이터베이스에 저장
(1) MongoDB
- 도큐먼트 지향 데이터베이스로, BSON(Binary JSON) 형식으로 데이터가 저장된다. 스키마가 유연하여 데이터 구조 변경에 용이하다.
- 장점 : 복잡한 중첩 구조의 데이터 저장에 적합하고, 수평적 확장이 용이하다.
- 단점 : 관계형 데이터베이스에 비해 데이터 무결성 보장이 약하다.
from pymongo import MongoClient
data = [
{'name': 'Alice', 'age': 30, 'city': 'Seoul'},
{'name': 'Bob', 'age': 25, 'city': 'Busan'}
]
client = MongoClient('localhost', 27017)
db = client['mydatabase']
collection = db['people']
collection.insert_many(data)
(2) Redis
- 키-값 저장소로, 인메모리 데이터베이스이며 빠른 속도가 요구되는 캐시 등에 사용된다.
- 장점 : 데이터 읽기/쓰기 속도가 매우 빠르다.
- 단점 : 데이터가 메모리에 저장되므로 대용량 데이터 저장에 부적합하다.
import redis
import json
data = [
{'name': 'Alice', 'age': 30, 'city': 'Seoul'},
{'name': 'Bob', 'age': 25, 'city': 'Busan'}
]
r = redis.Redis(host='localhost', port=6379, db=0)
for idx, person in enumerate(data):
r.set(f'person:{idx}', json.dumps(person))
5. 대용량 데이터 저장소에 저장
(1) Hadoop HDFS
- 분산 파일 시스템으로 대용량 데이터를 분산 저장한다.
- 장점 : 수평적 확장을 통한 대용량 데이터 처리가 가능하다.
- 단점 : 설정 및 관리가 복잡하며, 실시간 처리에 부적합하다.
- 사용 방식 : Hadoop 환경에서 hdfs dfs -put data.csv /user/hadoop/data/ 명령어로 파일을 업로드한다.
(2) Amazon S3
- AWS에서 제공하는 객체 스토리지 서비스로, 인터넷을 통해 어디서든 접근 가능하다.
- 장점 : 무제한에 가까운 스토리지 용량을 가지고 있으며, 높은 내구성과 가용성을 가진다.
- 단점 : 비용이 발생하며, 네트워크 지연이 있을 수 있다.
6. 클라우드 데이터베이스에 저장
(1) Fireblase Realtime Database
- NoSQL 클라우드 데이터베이스로 실시간 데이터 동기화를 지원한다.
- 장점 : 실시간 데이터베이스 기능이 있으며, 손쉬운 백엔드 구축에 유용하다.
- 단점 : 관계형 데이터 구조에는 부적합하다.
import firebase_admin
from firebase_admin import credentials, db
cred = credentials.Certificate('path/to/serviceAccountKey.json')
firebase_admin.initialize_app(cred, {
'databaseURL': '<https://your-database-name.firebaseio.com/>'
})
ref = db.reference('people')
data = {
'Alice': {'age': 30, 'city': 'Seoul'},
'Bob': {'age': 25, 'city': 'Busan'}
}
ref.set(data)
(2) AWS DynamoDB
- AWS에서 제공하는 NoSQL 데이터베이스 서비스
- 장점 : 완전 관리형 서비스로 확장성 및 가용성이 높다.
- 단점 : 데이터 모델링이 복잡할 수 있다
'SKN > 03. Web Crawling' 카테고리의 다른 글
| 06. 크롤링 도구 개요 (0) | 2025.02.25 |
|---|---|
| 05. CSS 선택자 (0) | 2025.02.25 |
| 04. 브라우저 렌더링 동작 구조 (0) | 2025.02.25 |
| 02. WEB의 구조 및 크롤링 (0) | 2025.02.25 |
| 01. 크롤링 개요 (0) | 2025.02.25 |