Cute Running Puppy
본문 바로가기
개발일기/웹 종합

mongoDB 연결하기

by 징구짱 2023. 1. 19.
728x90

2023.01.19

 

3-9 DB개괄

  • RDBMS(SQL)

행/열의 생김새가 정해진 엑셀에 데이터를 저장하는 것과 유사하다.

데이터의 일관성이나 / 분석에 용이할 수 있다. ex) MS-SQL, My-SQL 등

 

  • No-SQL

딕셔너리 형태로 데이터를 저장해두는 DB이다.

자유로운 형태의 데이터 적재에 유리한 대신, 일관성이 부족할 수 있다. ex) MongoDB

 

최신 클라우드 서비스인 mongoDB Atlas를 사용해 볼것이다.


3-10 mongoDB 시작하기

  • 회원가입하기

https://account.mongodb.com/account/register

 

Cloud: MongoDB Cloud

 

account.mongodb.com

 

  • 프로젝트 생성하기

 

  • 연결하기

사용할 아이디와 비밀번호를 입력

 

3-11 mongoDB 연결하기

  • mongoDB와 연결을 하기 위해 pymongo, dnspython 패키지를 설치한다.

 

  • 현재 버전과 일치하도록 선택

 

  • pymongo 기본 코드
from pymongo import MongoClient
client = MongoClient('여기에 URL 입력')
db = client.dbsparta

복사하여 URL에 붙여넣기 해준다.

 

  • <password>를 아까 설정한 비밀번호로 바꿔준다. ?retry 앞에 Cluster도 추가

 

  • 테스트해보기

users에 insert 해보았다.

 

3-12 pymongo로 DB조작하기

  • 데이터 넣기
db.users.insert_one({'name':'bobby', 'age' : 27})
db.users.insert_one({'name':'john', 'age' : 20})
db.users.insert_one({'name':'ann', 'age' : 20})

refresh 클릭 후 확인

 

  • 결과 값 보기
// 아이디 포함
all_users = list(db.users.find({}))
# {'_id': ObjectId('63c8aab5d90655d1699f18e0'), 'name': 'bob', 'age': 27} 으로 출력

// 아이디 제외
all_users = list(db.users.find({},{'_id':False}))
# {'name': 'bob', 'age': 27}으로 출력

 

  • 특정 결과 값 보기
user = db.users.find_one({'name':'john'})
print(user)
# {'_id': ObjectId('63c8b4596645f283d755b548'), 'name': 'john', 'age': 20}으로 출력

 

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

 

  • 삭제하기
db.users.delete_one({'name':'bobby'})

사라진 bobby

 

  • 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'})


3-13 웹스크래핑 결과 저장하기

저번 시간의 네이버 영화 평점 크롤링 한 것과 연결 해보기

 

파이썬 기초, 웹스크래핑(크롤링) 기초

2023.01.18 3-1 3주차 설치 파이썬(윈도우 다운로드) https://www.python.org/ftp/python/3.8.6/python-3.8.6-amd64.exe (5주차를 위한) gitbash 다운로드 https://git-scm.com/ Git git-scm.com 3-2 연습 겸 복습 - 스파르타피디아에 Op

pingu514.tistory.com

for movie in movies:
    name = movie.select_one('td.title > div > a')
    # print(a) # none 가로선
    if name is not None:
        title = name.text
        rank = movie.select_one('td:nth-child(1) > img')['alt']
        star = movie.select_one('td.point').text
        print(rank, title, star)

        doc = {
            'title':title,
            'rank':rank,
            'star':star
        }
        db.movies.insert_one(doc)

반복문 안에 넣어 하나씩 movies에 저장했다.


3-14 Quiz_웹스크래핑 결과 이용하기

  • 영화 '가버나움' 평점 가져오기 (find_one)
movie = db.movies.find_one({'title':'가버나움'},{'_id':False})
print(movie['star'])

 

  • 영화 '가버나움' 평점과 같은 영화 가져오기 (find)
movie = db.movies.find_one({'title':'가버나움'},{'_id':False})
star = movie['star']

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

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

 

  • 영화 '가버나움' 평점 0으로 수정하기
# 숫자가 아닌 문자로 수정
db.movies.update_one({'title':'가버나움'},{'$set':{'star':'0'}})


3-15 3주차 끝 & 숙제 설명

https://www.genie.co.kr/chart/top200?ditc=M&rtm=N&ymd=20210701

  • 순위 / 곡 제목 / 가수를 스크래핑 해오기

 

숙제 지니뮤직 크롤링하기

import requests
from bs4 import BeautifulSoup

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://www.genie.co.kr/chart/top200?ditc=M&rtm=N&ymd=20210701',headers=headers)

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

 

순위의 위치를 복사해보니

#body-content > div.newest-list > div > table > tbody > tr:nth-child(1) > td.number
#body-content > div.newest-list > div > table > tbody > tr:nth-child(2) > td.number
#body-content > div.newest-list > div > table > tbody > tr:nth-child(3) > td.number

이므로 tr 앞까지 rows에 지정해줬다

rows = soup.select('#body-content > div.newest-list > div > table > tbody > tr')

 

  • 공백 제거 함수 strip()
for row in rows:
    title = row.select_one('td.info > a.title.ellipsis').text
    #공백이 같이 출력
    
    title = row.select_one('td.info > a.title.ellipsis').text.strip()
    #공백을 제거함
    
    print(title)

 

Peaches의 19금 이미지로 인해 공백이 잘 제거되지 않음

  • 문자열 원하는 글자수만큼 자르기
for row in rows:
    title = row.select_one('td.info > a.title.ellipsis').text[4:].strip()
    # 19금 제거 후 공백을 제거함
    print(title)

공백이 잘 제거되었다

순위는 앞의 두 글자만 가져오고 나머지는 공백을 strip()으로 없애주었다.

for row in rows:
    # 앞의 두 글자 자르기
    rank = row.select_one('td.number').text[0:2].strip()
    # 네번째 이후로 자르기
    title = row.select_one('td.info > a.title.ellipsis').text[4:].strip()
    name = row.select_one('td.info > a.artist.ellipsis').text.strip()
    print(rank, title, name)
 

결과

 


3주차 후기


크롤링으로 홈페이지의 정보를 출력하는 부분이 재미있어서
혼자서 여러가지 연습해보다 많이 막혀서 시간을 엄청 썼던 기억이...
No-SQL인 mongoDB를 처음 접해봤는데, 구조가 특이해서 어려운 느낌이 있다.
3주차 공부하다 2주차 복습을 하니 또 까먹은 느낌이 있어서...
얼른 공부하고 복습해야겠다!!

 

728x90

'개발일기 > 웹 종합' 카테고리의 다른 글

팬명록 입력 체크하기  (0) 2023.01.22
Flask 프레임워크  (0) 2023.01.21
크롤링 연습 (기상청 홈페이지)  (0) 2023.01.18
파이썬 기초, 웹스크래핑(크롤링) 기초  (0) 2023.01.18
Ajax  (0) 2023.01.14