본문 바로가기

과거공부모음

웹개발 종합반 3주차 개발일지3

3주차 목표

1. 파이썬 기초 문법을 안다.

2. 원하는 페이지를 크롤링 할 수 있다.

3. pymongo를 통해 mongoDB를 제어할 수 있다.

 

데이터베이스는 왜 쓸까?

2가지의 이유이다 잘 넣어두기 위해, 잘 찾기 위해

나는 잘 찾는게 더 중요하다고 생각한다

데이터베이스는 2가지가 있다

RDBMS(SQL)

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

많은양의 데이터에서 중간에 데이터를 더하기는 어렵지만

정형호가 되어있어 데이터의 일관성이나 분석에 좋다

 

No-SQL

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

데이터 하나하나 마다 같은 값들을 가질 필요가 없다

자유롭게 데이터를 적재할때 유리하지만 일관성이 부족하다

 

서로 다른 장점을 가지고 있으니 뭐가 좋냐 보다는 필요에 따라 선택하자

 

mongoDB를 파이썬과 연결해보자

pymongo, dnspython의 패키지가 필요하다 설치하자

pymongo의 기본 세팅

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

연결하기 매우 쉽다

이번엔는 DB를 조작해보자

# 저장 - 예시
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'})

DB를 연결하고 조작할 수 있으니 이제 웹스크래핑한 정보를 DB에 저장해보자

import requests
from bs4 import BeautifulSoup

from pymongo import MongoClient
client = MongoClient('mongodb+srv://test:sparta@cluster0.55vah.mongodb.net/Cluster0?retryWrites=true&w=majority')
db = client.dbsparta

# 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=20210829',headers=headers)

# HTML을 BeautifulSoup이라는 라이브러리를 활용해 검색하기 용이한 상태로 만듦
soup = BeautifulSoup(data.text, 'html.parser')

# 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 태그 사이의 텍스트를 가져오기
        doc = {
            'rank': rank,
            'title': title,
            'star': star
        }
        db.movies.insert_one(doc)