항해 99/사전 기본 스터디

WIL _ mongoDB 기본 시작, 연결, 저장 (pymongo 활용)

U_D 2022. 2. 24. 22:33
드디어 서버를 만들고 저장을 해본다.
정말 기초겠지만.. 설레는 순간이다.

 

1. 데이터 베이스(DB)를 쓰는 이유?

  • 잘 넣고 잘 찾기 위해서
  • 교보문고를 예를 들면 이해하기 쉽다.
    서점은 각 카테고리별로 잘 정리가 되어있고 필요한 책을 뽑을 수 있도록 되어있다.
    ex. 출판사, 제목, 분야 등등

 

2. 데이터 베이스(DB)의 종류

  • 크게 2가지가 있음

👉 RDBMS(SQL)

행/열의 생김새가 정해진 엑셀에 데이터를 저장하는 것과 유사하다. 데이터 50만 개가 적재된 상태에서, 갑자기 중간에 열을 하나 더하기는 어렵지만 정형화되어 있는 만큼, 데이터의 일관성이나 / 분석에 용이

ex) MS-SQL, My-SQL 등

 

👉 No-SQL *초기 서비스나, 스타트업에서 많이 씀 -> 서비스의 변화가 많기 때문에

딕셔너리 형태로 데이터를 저장해두는 DB. 고로 데이터 하나 하나 마다 같은 값들을 가질 필요가 없게 되며 자유로운 형태의 데이터 적재에 유리한 대신, 일관성이 부족할 수 있다.

ex) MongoDB

 

 

3. mongoDB 시작하기

**주의**  지금 mongoDB 가입과 연결은 아래 내용과 조금 상이할 수 있습니다.

 

1) mongoDB - Atlas 가입하기가입하기

 

Cloud: MongoDB Cloud

 

account.mongodb.com

 

2) 다음 화면 체크하고 넘어가기

 

3) Shared를 클릭하고 넘어가기

4) SEOUL로 체크하고, Create Cluster 클릭하기

 

5) 아래와 같은 화면이 잠시 동안 나온 뒤에

 

6) 새로고침 후 최종 아래와 같은 화면을 만나면 끝!

 

7) 연결 준비하기

  1. Allow Access from Anywhere 클릭 → Add IP address 클릭
  2. Username, Password를 아래와 같이 입력 → Create Database User 클릭
  3. Choose a connection method 클릭
  4. Username과 Pasword 설정

 

 

 

4. mongoDB 연결하기

1) 패키지 설치

 

  • mongoDB 가입을 하고 파이참에서 pymongodnspython 패키지를 설치해줘야한다.
    -> monogDB라는 프로그램을 파이썬으로 조작하려면 pymongo 라이브러리가 필요!

 

2) 다시, mongoDB Atlas 화면에서 Connect your application 클릭

connect your application 클릭
2번 부분을 복사한다.

 

3) pymongo로 조작하기

  • 기본 시작 코드가 있고 mongoDB의 연결링크를 넣어주면된 다.

Cluster0 부분이 처음엔 다른 명칭으로 되어있어서 꼭 변경을 해줬어야 한다!

또한 아이디와 비밀번호 부분도 개인이 설정한 것으로 변경 필요!

from pymongo import MongoClient
client = MongoClient('mongodb+srv://ID:PASSWORD@cluster0.1fgo8.mongodb.net/Cluster0?retryWrites=true&w=majority')
db = client.dbsparta

 

 

 

4) 연결 테스트 _ DB에 데이터 넣기

doc = {
    'name':'jinyeol',
    'age':33
}

db.users.insert_one(doc)

입력한 데이터가 저장되었다.

 

 

 

5. pymongo로 DB조작하기

  • 5가지 기본 기능

 

1) 저장하기

doc = {'name':'bobby','age':21}
db.users.insert_one(doc)

 

2) 모든 결과 값 보기

# 모든 데이터 뽑아보기
all_users = list(db.users.find({},{'_id':False}))

print(all_users[0])         # 0번째 결과값을 보기
print(all_users[0]['name']) # 0번째 결과값의 'name'을 보기

for user in all_users:      # 반복문을 돌며 모든 결과값을 보기
    print(user)

 

3) 특정 결과 값 보기

user = db.users.find_one({'name':'bobby'})
print(user)

 

4) 수정하기

# 오타가 많으니 이 줄을 복사해서 씁시다!
db.users.update_one({'name':'bobby'},{'$set':{'age':19}})

user = db.users.find_one({'name':'bobby'})
print(user)

 

5) 삭제하기 (거의 안씀)

db.users.delete_one({'name':'bobby'})

user = db.users.find_one({'name':'bobby'})
print(user)

 

 

6. pymongo로 DB조작하기

1) 네이버 영화 크롤링 내용 mongoDB에 저장하기

import requests
from bs4 import BeautifulSoup

from pymongo import MongoClient
client = MongoClient('mongodb+srv://aaaaaaaa@cluster0.1fgo8.mongodb.net/Cluster0?retryWrites=true&w=majority')
db = client.dbsparta

headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
data = requests.get('https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&date=20210829',headers=headers)

soup = BeautifulSoup(data.text, 'html.parser')

movies = soup.select('#old_content > table > tbody > tr')

for movie in movies:
    a = movie.select_one('td.title > div > a')

    if a is not None:
        title = a.text
        rank = movie.select_one('td:nth-child(1) > img')['alt']
        star = movie.select_one('td.point').text
        doc = {
            'title':title,
            'rank':rank,
            'star':star
        }
        db.movies.insert_one(doc)

 

2) 연습 _ 영화 가버나움의 평점 불러오기

movie = db.movies.find_one({'title':'가버나움'})
print(movie['star'])

 

3) 연습 _ 영화 가버나움과 평점 같은 영화의 제목

movie = db.movies.find_one({'title':'가버나움'})
star = movie['star']

all_movies = list(db.movies.find({'star':star},{'_id':False}))
for m in all_movies:
    print(m['title'])

 

4) 연습 _ 영화 가버나움 영화 평점 0으로 만들기

db.movies.update_one({'title': '가버나움'}, {'$set': {'star': '0'}})

 

5) 연습 _ 지니뮤직 1~50위 곡 스크래핑 하기

  • 앞에서 두 글자만 끊기 = text[0:2]
  • 여백을 없애주기 = strip()
musics = soup.select('#body-content > div.newest-list > div > table > tbody > tr')

for music in musics:
        title = music.select_one('td.info > a.title.ellipsis').text.strip()
        title = title.replace('19금', '').strip()
        rank = music.select_one('td.number').text[0:2].strip()
        artist = music.select_one('td.info > a.artist.ellipsis').text

        print(rank,title,artist)
  • 19금 음악의 딱지도 같이 불러져서 없애줄 필요가 있었다.
    문자를 변경하는 .replace 함수를 이용해서
    '.replace('19금', '')' → '19금'이라는 문자를 ''공백으로 제거해주었다.

 

 

#아직 숙달이 되지 않아.. 많이 헷갈린다! 두번째 들었지만 익숙해지도록 혼자 다양한것을 시도해야할거같다.