Python 찍먹 - mongoDB, Studio 3T, pymongo, BeautifulSoup

조해빈·2023년 1월 19일
0

짧은이론

목록 보기
8/23

mongoDB, mongodb-community

brew tap mongodb/brew
brew install mongodb-community

실행

brew services start mongodb-community

아래와 같이 뜨면 서버가 잘 실행된 상태이다.
네이티브 드라이버로 접근하지 않고 HTTP로 접근했다는 뜻이다.

참고로 회사 컴은 맥, 집 컴은 윈도우이므로 나는 두 가지 방법을 모두 터득해야만 한 환경이었다. 집에서 할 땐 이렇게 했다.

mongod --install --serviceName MongoDB --serviceDisplayName MongoDB --dbpath C:\data\db --logpath C:\data\db\log\mongoservice.log --logappend

경로가 맞는지 잘 보고... 최초 설치 시 말고 이후에 또 작업할 땐 그냥 cmd에 mongod만 치니까 됐다.

Studio 3T

https://robomongo.org/download
참고로 Robomongo 즉 Robo 3T는 서비스가 중단되고 기존의 유료 서비스였던 Studio 3T가 무료로 전환되었다.
Robo 3T는 MongoDB를 그래픽으로 볼 수 있게 도와주는 GUI(Graphic User Interface)이다. 데이터베이스의 연결, 관리라는 것은 시각 요소가 따로 없이 추상적이기 때문에 이를 시각화하여 관리에 용이하게 해주는 프로그램인 듯 하다.

아래는 설치 후 첫 실행 상태다.

여기서부터 삽질을 좀 했다...
결론은 간단했다.

    1. New Connection > Manually를 선택하고,
    1. localhost:27017, 즉 아까 실행시켜서 실행되고 있는 MongoDB 서버를 연결한다. 이때 커넥션의 이름은 자유롭게.
    1. 그럼 이렇게 추가된 커넥션이 리스트에 뜬다~ 와~ 이걸 선택하여 Connect.

pymongo

그리고 이 단계에서 mongoDB 조작을 돕는 pymongo라는 사실상 필수 라이브러리를 깔았는데, ... 여기서 또 삽질을 잠시 했다.
결론은 pycharm이 필요했단 거였다.
https://www.jetbrains.com/ko-kr/pycharm/download/#section=mac
OS에 맞게 설치 후 프로그램 실행, 내가 연습 작업하려는 로컬 폴더를 연결하였다.

아래는 설치 후 첫 실행 상태다.

맥 기준 상단 메뉴바에서 Pycharm > Preferences > 좌측 검색창에 interpreter 를 검색한다. 정상적인 Python 설치 과정을 거쳤다면 Python interpreter가 뜰 터이니...

해당 메뉴를 클릭하면 현재 깔려있는 파이썬 라이브러리가 뜬다. (나는 pymongo를 다 설치한 후 글을 작성하고 있으므로 감안 좀...)
패키지, 버전, 최신 버전을 알려주고 있는 메뉴바의 위에 있는 십자가 아이콘이 install 버튼이다. 눌러서 pymongo 검색 후 package install을 완료한다.

pymongo를 import한 환경에서 데이터 넣기 연습

파이몽고를 import 해온 뒤 client, db를 선언하는 가장 기본적으로 선행되야 하는 코드를 넣는다.

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


여기서 dbjungle는 내가 자유롭게 설정한 DB 이름.
이걸 저장한 뒤 Run Python File 한다. (이걸 몰라 또 잠시 헤메였었다.)
그런 뒤 Studio 3T을 확인, refresh 하면...

위와 같이 내가 선언했던 dbjungle이 보이며,
insert시킨 {'name':'bobby','age':21}가 확인된다. 하하하...

기능 연습.

# 저장 - insert_one({k:v})
db.users.insert_one({'name':'bobby','age':21})
db.users.insert_one({'name':'kay','age':27})
db.users.insert_one({'name':'cane','age':27})
db.users.insert_one({'name':'john','age':30})
doc = {'name':'fret','age':50}
db.users.insert_one(doc)

# 한 개 찾기 - find_one({k:v})
user = db.변수.find_one({'name':'bobby'})

# 여러개 찾기 - list(db.변수.find({k:v},{'_id':False})) --> _id 값은 제외하고 출력
same_ages = list(db.변수.find({'age':21},{'_id':False}))
print(same_ages)

# 바꾸기 - update_one({k:v})
db.변수.update_one({'name':'john'},{'$set':{'age':19}})

# 지우기 - delete_one({k:v})
db.변수.delete_one({'name':'bobby'})

명령 실행시키는 순서는 다음과 같다:

  • db.변수.insert_one() 각 인물의 정보 DB에 추가하기,
  • db.변수.find_one() bobby 찾아서 변수 user에 저장하기,
  • list(db.변수.find({k:v},{'_id':False})) 21살인 인물 모두 찾아 변수 same_ages에 저장 후 same_ages 콘솔에 출력하기,
  • db.변수.update_one() john을 찾아 $set : 나이를 19로 업데이트하기,
  • db.변수.delete_one() bobby를 DB에서 삭제하기.

위 명령에 대한 실행을 모두 마친 내 첫 데이터베이스, dbjungle의 모습은 다음과 같다.

BeautifulSoup까지 같이 import한 환경에서 데이터 넣기 연습

네이버 영화 (https://movie.naver.com/movie/sdb/rank/rmovie.nhn?sel=pnt&date=20200303) 에서부터 웹스크래핑, 그 결과를 내 DB에 저장하도록 한다.

import requests
from bs4 import BeautifulSoup
from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.dbjungle
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') # HTML을 BeautifulSoup이라는 라이브러리를 활용해 검색하기 용이한 상태로 만듦

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

# movies (tr들) 의 반복문을 돌리기
for movie in movies:
    # movie 안에 a 가 있으면,
    a_tag = movie.select_one('td.title > div > a')
    if a_tag is not None:
        rank = movie.select_one('td:nth-child(1) > img')['alt'] # img 태그의 alt 속성값을 가져오기
        title = a_tag.text                                      # a 태그 사이의 텍스트를 가져오기
        star = movie.select_one('td.point').text                # td 태그 사이의 텍스트를 가져오기
        # print(rank,title,star) 를 쓰는 대신, 
        doc = {
            'rank' : rank,
            'title' : title,
            'star' : star
        }
        db.movies.insert_one(doc)


잘 저장되었다. 참고로 Studio 3T 화면의 좌측 어사이드 영역을 보면 아까 연습할 때 썼던 users 공간과 별개인 movies의 공간이 생성됨을 확인할 수 있다.

그렇다면 작업 환경에서 별개의 다른 파일을 만들어, '매트릭스'의 평점과 같은 평점의 영화 제목들만 가져와 본다.

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

## 코딩----------------------------------

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'])


하하하... 신기하다.

profile
JS, CSS, HTML, React etc

0개의 댓글