SW/MongoDB

MongoDB 기초

ahhyeon 2023. 3. 14. 18:15

1. pymongo로 DB조작하기

1-1. pymongo로 mongoDB 조작

  • DB 연결 & 데이터 넣기
db.users.insert_one({'name':'bobby','age':21})
db.users.insert_one({'name':'kay','age':27})
db.users.insert_one({'name':'john','age':30})

  • 모든 결과 값을 보기
    • pymongo(find)
# 모든 데이터 뽑아보기
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)

  • 특정 결과 값을 뽑아 보기
    • pymongo(find_one)
user = db.users.find_one({'name':'bobby'})
print(user)

  •  수정하기
    • ✔️pymongo(update_one)
db.users.update_one({'name':'bobby'},{'$set':{'age':19}})

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

  • 삭제하기(거의 사용x)
    • ✔️pymongo(delete_one)
db.users.delete_one({'name':'bobby'})

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

1-2. pymongo 코드 요약

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

# 한 개 찾기
user = db.users.find_one({'name':'bobby'})

# 여러개 찾기( _id 값은 제외하고 출력)
all_users = list(db.users.find({},{'_id':False}))

# 바꾸기
db.users.update_one({'name':'bobby'},{'$set':{'age':19}})

# 지우기
db.users.delete_one({'name':'bobby'})

 

2. 웹크롤링 결과 저장

✏️ insert 사용 →  웹크롤링 결과를 DB에 저장하기!

  • pymongo 기본 세팅
import requests
from bs4 import BeautifulSoup

from pymongo import MongoClient
client = MongoClient('mongodb://test:ahhyeon@ac-n9ccs4r-shard-00-00.arcitzi.mongodb.net:27017,ac-n9ccs4r-shard-00-01.arcitzi.mongodb.net:27017,ac-n9ccs4r-shard-00-02.arcitzi.mongodb.net:27017/?ssl=true&replicaSet=atlas-8qe01r-shard-0&authSource=admin&retryWrites=true&w=majority')
db = client.dbtest

# URL을 읽어서 HTML를 받아오기
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=20230312',headers=headers)

# 웹페이지 파싱하기
soup = BeautifulSoup(data.text, 'html.parser')

# select 이용, tr들 불러오기
movies = soup.select('#old_content > table > tbody > tr')

# movies(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
        print(rank, title, star)
  • 도큐먼트 만들어 하나씩 insert 하기
import requests
from bs4 import BeautifulSoup

from pymongo import MongoClient
client = MongoClient('mongodb://test:ahhyeon@ac-n9ccs4r-shard-00-00.arcitzi.mongodb.net:27017,ac-n9ccs4r-shard-00-01.arcitzi.mongodb.net:27017,ac-n9ccs4r-shard-00-02.arcitzi.mongodb.net:27017/?ssl=true&replicaSet=atlas-8qe01r-shard-0&authSource=admin&retryWrites=true&w=majority')
db = client.dbtest

# URL을 읽어서 HTML를 받아오기
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=20230312',headers=headers)

# 웹페이지 파싱하기
soup = BeautifulSoup(data.text, 'html.parser')

# select 이용, tr들 불러오기
movies = soup.select('#old_content > table > tbody > tr')

# movies(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 = {
            'rank': rank,
            'title' : title,
            'star' : star
        }
        db.movies.insert_one(doc)

3. 웹크롤링 결과 이용하기

✏️ find, update 사용

3-1. 영화제목 '아바타 리마스터링'의 평점을 가져오기

target_movie = db.movies.find_one({'title':'아바타 리마스터링'})
print(target_movie['star'])

3-2. '아바타 리마스터링'의 평점과 같은 평점의 영화 제목들 가져오기

target_movie = db.movies.find_one({'title':'아바타 리마스터링'})
target_star = target_movie['star']

movies = list(db.movies.find({'star':target_star}))

for movie in movies:
    print(movie['title'])

3-3. '아바타 리마스터링' 영화의 평점을 0으로 만들기

db.movies.update_one({'title':'아바타 리마스터링'},{'$set':{'star':'0'}})