티스토리 뷰

10. DB설치 확인

mongodb는 컴퓨터에는 돌아가고 있는데 안보이게 켜진다.

robo3T를 가지고 mongodb의 데이터를 볼수 있게 하는것이다.

 

11. DB개괄

데이터베이스는 왜쓰는가 ?

데이터를 잘 갖다가 쓰기위해서다.

 

Database에는, 크게 두 가지 종류가 있다.

 

SQL는 엑셀과 가깝다.

NoSQL는 정해놓지 않고 한줄 한줄이 딕셔너리 형태이다.

 

RDBMS(SQL)

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

데이터 50만 개가 적재된 상태에서, 갑자기 중간에 열을 하나 더하기는 어렵다.

. 그러나, 정형화되어 있는 만큼, 데이터의 일관성이나 / 분석에 용이 . ex) MS-SQL, My-SQL 등

 

No-SQL(not only SQL)

딕셔너리 형태로 데이터를 저장해두는 DB 고로 데이터 하나 하나 마다 같은 값들을 가질 필요가 없다. 자유로운 형태의 데이터 적재에 유리한 대신, 일관성이 부족 ex) MongoDB

 

서버는 컴퓨터의 역할 

컴퓨터에서 서버라는 프로그램을 돌리자

                DB라는 프로그램을 돌리고 크롤링도 한다.

 

12. pymongo로 DB조작하기

pymongo로 mongoDB 조작하기

pymongo 라이브러리의 역할

mongoDB 라는 프로그램을 조작하려면 라이브러리, pymongo가 필요

 

pymongo 기본코드

 

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

# 코딩 시작

1.insert 데이터를 넣는것 

2.find 찾는 것

3.update 데이터를 업데이트하는 것

4.delete 삭제하는 것

 

insert

from pymongo import MongoClient #pymongo를 쓰겠다.
client = MongoClient('localhost', 27017) #내 컴퓨터에서 지금 돌아가고 있는 mongodb에 접속
db = client.dbsparta #dbsparta라고 하는 db이름으로 접속할거다.

# MongoDB에 insert 하기

# 'users'라는 collection에 {'name':'bobby','age':21}를 넣습니다.
db.users.insert_one({'name':'bobby','age':21}) #딕셔너리를 만듬
db.users.insert_one({'name':'kay','age':27})   #users에 name는 kay,age는27를 넣는다.
db.users.insert_one({'name':'john','age':30})

mongodb는 딕셔너리가 쌓이는 것

mongobb가 아무리 자유롭게 쌓는다고 하더라도 콜렉션이 존재(비슷한 것끼리 묶는것)

db안에 users라는 collection에 insert해라

 

find

from pymongo import MongoClient           # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?)
client = MongoClient('localhost', 27017)  # mongoDB는 27017 포트로 돌아갑니다.
db = client.dbsparta                      # 'dbsparta'라는 이름의 db를 만듭니다.

# MongoDB에서 데이터 모두 보기
all_users = list(db.users.find({}))

# 참고) MongoDB에서 특정 조건의 데이터 모두 보기
same_ages = list(db.users.find({'age':21},{'_id':False}))

print(all_users[0])         # 0번째 결과값을 보기
print(all_users[0]['name']) # 0번째 결과값의 'name'을 보기

for user in all_users:      # 반복문을 돌며 모든 결과값을 보기
    print(user)

결과
find_one,name bobby만 가져와라

여러개 있어도 제 위에 있는 하나만 가져온다.

 

update

# 생김새
db.users.update_many({'name':'bobby'},{'$set':{'age':19}}) #bobby하는 name을 모두 찾아서 age 19로 바꿔라 실수를 안하기 위해 많이는 안쓴다.


db.users.update_one({'name':'bobby'},{'$set':{'age':19}}) #바비라는 name을 찾아서 age 19로 바꿔라


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

 

 

update 결과

delete

 

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

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

 

delete

insert,findupdate,delete 요약

from pymongo import MongoClient           # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?)
client = MongoClient('localhost', 27017)  # mongoDB는 27017 포트로 돌아갑니다.
db = client.dbsparta    

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

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

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

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

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

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

insert 연습하기 - 웹스크래핑 결과를 DB에 저장하기

import requests
from bs4 import BeautifulSoup

from pymongo import MongoClient           # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?)
client = MongoClient('localhost', 27017)  # mongoDB는 27017 포트로 돌아갑니다.
db = client.dbsparta //pymongo 기본 코드 추가 

# 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.nhn?sel=pnt&date=20200303',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 ={ #doc 딕셔너리 만들기
            'rank':rank,
            'title':title,
            'stat' :star,
        }
        db.movies.insert_one(doc) #insert하기

 

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

(1) 영화제목 '매트릭스'의 평점을 가져오기

find

movie['stat'] 평점만 나옴

(2) '매트릭스'의 평점과 같은 평점의 영화 제목들을 가져오기

(3) 매트릭스 영화의 평점을 0으로 만들기

 0 숫자, 문자

 

15. 3주차 끝 & 숙제 설명

 

 

지니뮤직의 1~50위 곡을 스크래핑 해보세요.

검사에서 제목부분 확인하고 copy select

 

#body-content > div.newest-list > div > table > tbody > tr:nth-child(2) > td.info > a.title.ellipsis

#body-content > div.newest-list > div > table > tbody > tr:nth-child(3) > td.info > a.title.ellipsis

=>body-content > div.newest-list > div > table > tbody > tr 공통부분 묶어서 soup.select 안에 넣는다.

 

tilte

> td.info > a.title.ellipsis 공통부분 안넣은 부분

제목은 나오긴 하는데 결과가 뛰어서 나옴
strip()를 넣으니 깔끔해진 제목이 나왔다.

rank

순자 전체 네모부분

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

 

공통부분 빼면 

> td.number 공통부분 안넣은 부분

 

숫자만 안나오는 모습 발견
이부분 결과에 맞게 나온듯하다.

결과가 이거때문인듯하다.

검사에서 2부분을 자세히 살펴보니 "1 "이런식을 으로 되어있고 순위도 두자리도 있어서 

 

 

text[0:2]로 해주니 잘 나온다.

artist

#body-content > div.newest-list > div > table > tbody > tr:nth-child(1) > td.info > a.artist.ellipsis

 

공통적인 부분 빼면

td.info > a.artist.ellipsis로

rank,title,artist 순서대로 출력됨을 확인할수 있다.

 

정답코드

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=D&ymd=20200403&hh=23&rtm=N&pg=1',headers=headers)

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

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

for tr in trs:
    title = tr.select_one('td.info > a.title.ellipsis').text.strip()
    rank = tr.select_one('td.number').text[0:2].strip()
    artist = tr.select_one('td.info > a.artist.ellipsis').text
    
    print(rank, title, artist)

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/12   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함