본문 바로가기

15. pymongo로 DB조작하기

by Rudy 2021. 9. 3.

File->Setting->Python interpreter->+클릭->pymongo 패키지 설치

 

-pymongo 기본코드와 insert 코드

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

# 코딩 시작
doc = {'name':'bobby','age':21}
db.users.insert_one(doc)

 

작성한 뒤에 robo3T를 실행시켜서, myLocalDB라는 새로운 db를 생성해서 connect해주면

폴더가 생성되는데

dbsparta를 클릭, collections클릭한 후, view results in table mode를 클릭하면

파이썬 코드로 작성한 이름 바비, 나이 21의 정보가 나타나게 된다.

 

여기서 collections는 비슷한 애들끼리 묶은 것이라고 생각하면 된다.

* mongodB는 NOSQL이어서 자유롭게 데이터를 쌓는다고 하더라도 collection이라는 개념이 존재한다.

 

위에서 파이썬 코드로 db.users.어쩌고로 doc을 만들었기 때문에 users라는 collection이 만들어진 것이다.

 

파이썬 insert 코드에서 doc에 계속 정보를 바꿔가면서 넣으면 그 정보들이 mongodb에 적용되어 추가가 된다.

 

- find 코드

same_ages = list(db.users.find({'age':21},{'_id':False}))

fine()안에서 age에 해당하는 부분은 조건이고, _id:False는 _id 값을 가지고 오지 말라는 뜻이다. 만약 _id:False가 없다면

에 해당하는 _id 값도 같이 출력될 것이다.

 

- 하나만 찾는 코드(find_one)

user = db.users.find_one({'name':'bobby'},{'_id':False})

 

-update_one

db.users.update_one({'name':'bobby'},{'$set':{'age':25}})

name이 bobby인 정보에서 age를 25로 바꾸는 코드이다.

해당 코드를 적용한 뒤에 robo3T에 가서 확인해보면 제대로 bobby의 나이가 25로 바뀐 것을 확인할 수 있다.

 

참고로 하나의 정보만 바꾸는 것이 아니고 전부 다 바꾸고자 할 때는 update_many()를 사용한다. 하지만 정보가 전부 바뀌어 버린다는 것은 굉장히 위험하기 때문에 잘 쓰지는 않는다.

 

- 정보를 삭제시키는 코드(delete_one)

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

delete에도 delete_many로 정보를 전부 삭제시킬 수 있는 코드가 있지만, 위험하기 때문에 잘 쓰지는 않는다.

delete_one 역시도 잘 쓰지는 않는 코드이다.

 

- mongoDB를 이용해서 웹스크래핑 결과를 저장하기

 

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)

 

 

 

'' 카테고리의 다른 글

17. flask  (0) 2021.09.05
16. 웹스크래핑 연습  (0) 2021.09.04
14. 웹스크래핑 연습  (0) 2021.09.02
13. 웹 크롤링  (0) 2021.09.01
11. 원페이지 쇼핑페이지에 환율 api 적용  (0) 2021.08.27

댓글