TIL no.60 - Back End - Crawling 2

박준규·2019년 10월 24일
0

Crawling 1 에서는 그냥 데이터를 웹에서 긁어내서 프린트까지만 했는데
이번엔 실제로 데이터베이스에 저장해보도록 하겠습니다.

이를 위해서 sqlalchemy라는 DB Toolkit을 사용하겠습니다.

설치법: https://www.pythoncentral.io/how-to-install-sqlalchemy/
Tutorial: https://docs.sqlalchemy.org/en/13/orm/tutorial.html


진행하기 전에 DB에 관한 용어를 좀 정리해보겠습니다.

DBMS는 Database Management System의 줄임말로 말그대로 DB를 관리하는 시스템입니다.

MySQL, PostgreSQL 등등이 이에 속합니다.

database engine 또는 storage engine은 DBMS가 DB에 대해 데이터를 CRUD operation하는 데 사용하는 기본 소프트웨어 컴포넌트입니다.

많은 DBMS가 동일한 DB 내에 다중 저장 엔진을 지원합니다.

예를 들어, MySQL은 MyISAM 뿐만 아니라 InnoDB도 지원합니다.


Crawled Data를 DB에 저장하기


1. 기본 준비

Crawling 1에서 작성한 코드에 이어서 작성해보도록 하겠습니다.

먼저, engine을 생성해야 합니다.

from sqlalchemy import create_engine
engine = create_engine('sqlite:///music.db')

music.db라는 이름의 DB를 만들어줍니다.

ORM에서는 데이터베이스 테이블을 설정한 다음 직접 정의한 클래스에 맵핑을 해야 합니다.

sqlalchemy에서는 두가지가 동시에 이뤄지는데 Declarative 란걸 이용해 클래스를 생성하고 실제 디비 테이블에 연결합니다.

from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()

이제 Base라는 변수를 이용해 클래스에 맵핑하면 그 클래스는 각 테이블에 맵핑되는 것입니다.

예시를 보면 이해가 쉽습니다.

from sqlalchemy import Column, Integer, String

class Music(Base):
    __tablename__ = 'musics'
    id = Column(Integer, primary_key=True)
    rank = Column(String(50))
    song = Column(String(50))
    singer = Column(String(50))

Music이라는 클래스는
__tablename__으로 정의한 테이블에 맵핑됩니다.

아직 위의 클래스는 테이블이 생성이 되지 않은 상태입니다.

테이블을 생성해줍니다.

Music.__table__.create(bind=engine, checkfirst=True)

그리고 session이라는 개념이 있습니다.
session은 ORM에서 DB를 다루기 위해 사용됩니다.
session을 만들어 engine과 묶어줍니다.

from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
session = Session()

이제 기본적인 준비가 완료되었습니다.

2. DB에 저장하기

for element in music_chart:
	result=Music(rank = element['rank'],
				 song=element['song'],
				 singer=element['singer'],
	)
	session.add(result)
	session.commit()

requests = session.query(Music).all()

위와 같이 해주면 python 파일을 실행시킬때마다 빌보드 챠트 hot 100 목록을 DB에 저장합니다.

profile
devzunky@gmail.com

0개의 댓글