모두를 위한 웹 스크래핑(4/5)-가지고 온 데이터를 저장하는 방법

지난 회에는 웹에 있는 데이터를 가져오는 방법을 알아봤습니다. 이번 회에는 가져온 데이터를 저장하는 몇 가지 방법을 알아보겠습니다. 크게 파일에 저장, DB에 저장, NoSQL DB에 저장하는 3가지가 있습니다.

파일 사용하기

데이터의 구조가 간단하고 양이 많지 않은 경우라면 CSV(Comma Separated Values)로 저장할 수 있습니다. 나중에 필요하면 DB에 넣거나 엑셀에서 불러와 사용하기도 쉽겠죠.

  1. 파이썬에서 csv를 읽고 쓸 때에는 csv 패키지를 사용합니다.
  2. 패키지를 가져오고 파일을 열어 csv 패키지의 writer를 만들어 줍니다.
Python
3 lines
1
2
3
import csv
with open('samples.csv', 'w', newline='') as csvfile:
csvwriter = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_ALL) # .
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  • with open 이 부분은 파일을 처리할 때 자주 사용하는 패턴입니다. 블록을 마칠 때 파일 닫기를 자동으로 해줍니다.
  • 필요에 따라 옵션을 사용해서 구분자를 파이프(|)로 지정하는 등 다양한 CSV 파일의 형식에 대응할 수 있습니다.
  1. 내용을 쓰려면 writerow 함수를 사용합니다. 튜플, 리스트, 딕셔너리 등 컨테이너형 데이터를 전달할 수 있습니다.
Python
2 lines
1
2
csvwriter.writerow(('Hello', 'World')) #
csvwriter.writerow(['Spam'] * 5 + ['Baked Beans']) # ()
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  1. CSV 파일 읽기는 csv 패키지의 reader를 사용합니다.
Python
4 lines
1
2
3
4
with open('samples.csv', newline='') as csvfile:
csvreader = csv.reader(csvfile, delimiter=',', quotechar='"')
for row in csvreader:
print(', '.join(row))
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

SQLite 파일 데이터베이스 사용하기

SQLite는 경량 데이터베이스로 모바일, 임베디드, IoT 등 다양한 플랫폼에서 사용되고 있습니다. SQL을 사용하여 데이터를 관리할 수 있고, 파일 형태로 DB 전체가 관리되므로 다른 곳으로 전달하기도 쉽습니다. 또한 많은 OS에서 내장 DB로 사용하고 있기 때문에 기본으로 설치된 경우도 많이 있습니다.

  1. SQLite 패키지를 가져오고 DB에 연결을 해줍니다.
Python
1 lines
1
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  1. 테이블 만들기 : 일반적은 SQL CREATE TABLE 명령으로 만들 수 있습니다.
Python
1 lines
1
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  1. 테이블에 INSERT 하기 : 일반적인 SQL INSERT를 사용할 수 있습니다.
  2. 테이블에서 SELECT 하기
Python
1 lines
1
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  1. 나머지 UPDATE, DELETE 등도 SQL로 할 수 있습니다.

MySQL RDB 사용하기

오픈소스로 널리 사용되고 있는 MySQL DB서버를 사용해 공유 가능한 DB를 사용할 수 있습니다. 몇 가지 패키지의 설치가 필요합니다.

  • 패키지 설치하기
  1. MySQL 커넥터 패키지를 설치합니다. conda 명령어를 사용합니다.
    > conda install mysql-connector-python
  2. 필요한 경우 ORM 라이브러리인 sqlalchemy도 설치합니다.
    > conda install sqlalchemy
  • 사용하기
  1. 필요한 패키지를 가져옵니다.
Python
2 lines
1
2
import mysql.connector
from sqlalchemy import create_engine
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  1. 연결을 구성합니다. 연결이 잘 안될 경우 DB 서버의 방화벽/MySQL 접속 제어를 확인해 봅니다.
Python
6 lines
1
2
3
4
5
6
db_host = 'xxx.xxx.xxx.xxx'
db_name = 'sample_db'
db_id = 'root'
db_pw = 'password'
cnx_str = 'mysql+mysqlconnector://'+db_id+':'+db_pw+'@'+db_host+'/'+db_name+''
engine = create_engine(cnx_str, echo=False)
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  1. 테이블에서 SELECT 하기
Python
5 lines
1
2
3
4
5
with eng.connect() as con:
rs = con.execute('SELECT * FROM EMP')
data = rs.fetchone()[0]
print "Data: %s" % data
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  1. 일반적인 RDB 이므로 INSERT, UPDATE, DELETE 및 CREATE 등 모든 기능을 사용할 수 있습니다.

MongoDB NoSQL 사용하기

MongoDB는 대표적인 NoSQL DB로 문서 지향 데이터베이스 입니다. JSON(JavaScript Object Notation) 형식의 문서를 저장하고 검색할 수 있습니다. JSON은 현재 각종 웹 애플리케이션의 데이터 교환에 사용되는 형식으로서 MongoDB를 사용해 기존 RDB의 부작용을 줄이며 웹 스크래핑에 활용할 수 있습니다. 개인적으로 웹 스크래핑의 데이터 중 로그 성격, 조회용이 아닌 저장용 데이터의 경우 사용하기 좋다고 생각합니다.

  1. 필요한 패키지를 가져옵니다. 보통 pymongo 패키지를 사용합니다.
    > import pymongo
  2. 연결을 구성합니다.
    > client = MongoClient(‘mongodb://localhost:27017/’)
  3. 사용할 데이터베이스를 선택합니다.
    > db = client.stocks # stocks 데이터베이스 선택
  4. 사용할 컬렉션(RDB의 테이블과 유사)
    > coll = db.mystocks
  5. 저장합니다. 가져온 데이터가 JSON이라면 바로 넣을 수 있습니다. JSON 형태가 아니라면 변환해 줍니다.
    > coll.insert_one({“Ticker”: “AAPL”, “Company”:”Apple Inc.”})
  6. 한 건을 조회합니다.
    > appl = coll.find_one({“Ticker”:”AAPL”})
  7. 여러 건을 조회합니다.
Python
2 lines
1
2
for x in coll.find():
print(x)
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

정리

  • 이번에는 가져온 데이터를 저장하는 방법을 알아봤습니다.
  • 데이터의 규모에 따라 파일에 저장하거나 규모가 크고 복잡 데이터라면 모델링을 통해 정규화 하여 RDB에 저장할 수 있습니다. 데이터 형식과 용도에 따라 NoSQL을 사용할 수도 있습니다.
  • 다음번에는 저장한 데이터를 시각화하고 분석하는 방법을 알아보겠습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다