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

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

파일 사용하기

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

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

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

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

  1. SQLite 패키지를 가져오고 DB에 연결을 해줍니다.

  1. 테이블 만들기 : 일반적은 SQL CREATE TABLE 명령으로 만들 수 있습니다.

  1. 테이블에 INSERT 하기 : 일반적인 SQL INSERT를 사용할 수 있습니다.
  2. 테이블에서 SELECT 하기

  1. 나머지 UPDATE, DELETE 등도 SQL로 할 수 있습니다.

MySQL RDB 사용하기

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

  • 패키지 설치하기
  1. MySQL 커넥터 패키지를 설치합니다. conda 명령어를 사용합니다.
    > conda install mysql-connector-python
  2. 필요한 경우 ORM 라이브러리인 sqlalchemy도 설치합니다.
    > conda install sqlalchemy
  • 사용하기
  1. 필요한 패키지를 가져옵니다.
import mysql.connector
from sqlalchemy import create_engine
  1. 연결을 구성합니다. 연결이 잘 안될 경우 DB 서버의 방화벽/MySQL 접속 제어를 확인해 봅니다.
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)
  1. 테이블에서 SELECT 하기
with eng.connect() as con:
        rs = con.execute('SELECT * FROM EMP')
        data = rs.fetchone()[0]
        print "Data: %s" % data
  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. 여러 건을 조회합니다.
for x in coll.find():
        print(x)

정리

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

답글 남기기

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