스파르타/웹개발

22.02.02 DB개괄, pymongo로 DB 조작하기, 웹스크래핑 결과 이용하기

h.단디 2022. 2. 2. 10:35

mongoDB는 눈에 보이지 않지만 작동되고 있음

그걸 시각화해서 볼 수 있게 하는 프로그램이 robo3T

 

데이터 베이스의 목적은 단순 보관이 아니라 잘 활용하기 위해서임

 

SQL - 엑셀에 가까움. 열,행을 미리 정해놔야 함. (공란으로라도 채워짐) 중간에 수정하기가 힘들다는 단점이 있으나, 데이터가 일관적이기때문에 분석하기 용이함.

NoSQL(Not only SQL) - 딕셔너리 형태. 데이터 하나하나가 다 다르기 때문에 유연함. 스타트업, 초기 단계에서 많이 채택. 

 

 

 

파이썬으로 DBmongo 사용하려면? 'pymongo' 라이브러리 설치

 

#pymongo 기본코드

from pymongo import MongoClient                #pymongo 쓰겠습니다.
client = MongoClient('localhost', 27017)       #내 컴퓨터에서 돌아가고 있는 mongoDB에 접속할거예요.
db = client.dbsparta                           #dbsparta라고하는 DB이름으로 접속할겁니다.(그 이름이 없으면 자동으로 mongoDB에 생김)

 

 

insert

doc = {'name':'bobby','age':21}                #mongoDB는 NoSQL! 딕셔너리 형태로 데이터 만듬.
db.users.insert_one(doc)                       #users라는 콜렉션에 저 딕셔너리 형태 데이터를 넣을거임

 

find (여러개 찾기)

same_ages = list(db.users.find({'age':21},{'_id':False}))      #21살인 사람 찾아서 _id없이 뽑아줘  / 모든 데이터 가져올 땐 '{}'로!
print(same_ages)

 

find_one (같은 데이터가 여러개 있어도 가장 상단의 하나만 가져옴)

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

 

update

보통 복붙해서 씀. 콜렉션 이름이 맞는지 확인 필!

update_many로 해당하는 전체 데이터를 바꿀 수도 있으나, 위험하기 때문에 비추함. 

db.users.update_one({'name':'bobby'},{'$set':{'age':19}})   #name이 bobby인 애를 찾아서 age를 19로 바꿔라

 

delete

아마도 잘 쓸 일 없을 거임

마찬가지로 delete_many가 있으나 위험하니까 쓰지마

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

 

 

 

앞에서 한 네이버무비 크롤링 서버에 데이터 넣기 

import requests
from bs4 import BeautifulSoup

from pymongo import MongoClient
client = MongoClient('localhost', 27017)
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.nhn?sel=pnt&date=20200303',headers=headers)

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

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

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

 

 

 

quiz1. '매트릭스' 별점 가져오기

from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.dbsparta

movie = db.movies.find_one({'title':'매트릭스'})
print(movie['star'])

 

 

quiz2.'매트릭스'의 평점과 같은 평점 영화 제목들 가져오기

from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.dbsparta

movie = db.movies.find_one({'title':'매트릭스'})
target_star = movie['star']

target_movies = list(db.movies.find({'star':target_star},{'_id':False}))

for target in target_movies:        #그냥 print(target_movies)해도 되지만 결과가 눈에 보기 쉽게 반복문 활용
    print(target['title'])

 

 

quiz3.매트릭스 영화 평점 0점 만들기

from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.dbsparta

db.movies.update_one({'title':'매트릭스'},{'$set':{'star':'0'}})     #robo3T에서 확인해보니 다른 애들은 문자열임. 따라서 문자열 형태로 넣어줌.(나중에 관리 용이하도록)

Robo3T에서 ""은 문자열, #은 숫자