11코딩완주챌린지 [3주차] 7일차

1.학습내용

✔ monogodB는 딕셔너리형태로 저장되는 데이터 프로그램.

✔ pymongodB
[기본코드]

from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.dbsparta
# 코딩 시작

Run 실행 후 Robot 3T를 실행하면, mylocalDb Refresh를 클릭한 후, Collection > users 더블클릭!
그리고 'View results in table mode'인 아이콘을 누른다.

-[insert]

from pymongo import MongoClient           -- pymongo를 임포트 하기
client = MongoClient('localhost', 27017)  -- mongoDB는 27017 포트로 돌아갑니다.
db = client.dbsparta                      -- 'dbsparta'라는 이름의 db를 만듭니다.
doc = {'name':'bobby','age':21}
db.users.insert_one(doc)                  -- user라는 컬렉션 안에 insert 해라.

Run 실행 후 Collection > users를 더블클릭!

-[find] (모든 결과값을 가져오기)

from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.dbsparta
same_ages = list(db.users.find({'age':21},{'_id':False}))

[{'name': 'bobby', 'age': 21}, {'name': 'john', 'age': 21}, {'name': 'jane', 'age': 21}]

list안에 딕셔너리형태로 되어있으므로

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

{'name': 'bobby', 'age': 21}
{'name': 'john', 'age': 21}
{'name': 'jane', 'age': 21}

same_ages = list(db.users.find({},{'_id':False}))  
for person in same_ages:
    print(person)

모든 걸 다 갖고 오고 싶으면, 빈괄호를 쓴다. '{}' 자주 쓰일 것이다.

-[find] (특정결과값만 가져오기)

from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.dbsparta
user = db.users.find_one({'name':'bobby'},{'_id':False})
print(user)

{'name': 'bobby', 'age': 21}

-[update]

from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.dbsparta
db.users.update_one({'name':'bobby'},{'$set':{'age':19}})

Run 실행 후 Collection > users를 더블클릭! 그러면 update된 숫자가 바뀔 것이다.

-[delete] 거의안씀

from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.dbsparta
db.users.delete_one({'name':'bobby'})

Run 실행 후 Collection > users를 더블클릭! 그러면 delete된 숫자가 바뀔 것이다.

✅요약

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

✔ 6일차에 했던 movies웹스크래핑 결과 저장하기

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

movies = soup.select('#old_content > table > tbody > tr')

for movie in movies:
    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']
        title = a_tag.text
        star = movie.select_one('td.point').text
        doc = {
            'rank':rank,
            'title':title,
            'star':star
        }
        db.movies.insert_one(doc)

Run 실행 후 Collection을 refresh한 후 > movies를 더블클릭!

✔ 웹스크래핑 결과를 이용하기
[영화제목 '매트릭스'의 평점을 가져오기]

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

movie = db.movies.find_one({'title':'매트릭스'},{'_id':False})
print(movie['star'])

9.39

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

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

target_movie = db.movies.find_one({'title':'매트릭스'},{'_id':False})
target_star = target_movie['star']         ---9.39를 target_star라고 지정한 뒤,

target_movies = list(db.movies.find({'star':target_star},{'_id':False}))   --조건인 'star'가 target_star와 같아져야 한다.

for target in target_movies:   ---리스트안에 딕셔너리형태로 되어있을 경우, 간단히 for문을 이용한다.
    print(target['title'])

[매트릭스 영화의 평점을 0으로 만들기]

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

db.movies.update_one({'title':'매트릭스'},{'$set':{'star':0}})

3주차 과제

✅ 하나하나의 코드별(title,rank,artist)로 하나씩 print(title), print(rank), print(artist)해보면서 결과값을 확인해보면서 부족한 부분을 구글링해서 덧붙이기!

for tr in trs:
	title = tr.select_one('td.info > a.title.ellipsis')
    print(title.text)

결과가 공백들이 많이 보일 것이다. 구글링해서 '파이썬 공백 제거'라고 검색하면, '어떤 부분.strip()'해야한다!

for tr in trs:
    rank = tr.select_one('td.number')
    print(rank.text)

결과가 상승, 하강 등 필요없는 부분이 있을 것이다.
구글링해서 '파이썬 문자열 자르기'라고 검색하면, [첫부분(0):끝부분(숫자)]
숫자가 1~9 에서도 공백이 나타나므로 .strip()도 붙여준다.

-------완성본------

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:
    rank = tr.select_one('td.number').text[0:2].strip()         
    title = tr.select_one('td.info > a.title.ellipsis').text.strip()   
    artist = tr.select_one('td.info > a.artist.ellipsis').text
    print(rank,title,artist)

✔ 서버란?
컴퓨터에 돌아갈 수 있게 하는 프로그램
'로컬 개발환경'이란>> 같은 컴퓨터에다 서버도 만들고, 요청도 할 거예요. 즉, 클라이언트 = 서버가 되는 것!!!

✔ 프레임워크와 라이브러리
프레임워크는 남이 짜둔 규칙이나 틀 안에서 자유롭게 내가 코딩할 수 있다. 그래서 하나의 프레임워크에서만 짤 수 있다!
라이브러리는 내가 내맘대로 짜는데, 남이 만들어둔 것을 중간에 자유롭게 갖다 쓸 수 있다. 100개 등 1000개 등 갖다 쓸 수 있다.

✔ [Flask 시작코드]

from flask import Flask
app = Flask(__name__)
@app.route('/')
def home():
   return 'This is Home!'
if __name__ == '__main__':
   app.run('0.0.0.0',port=5000,debug=True)

Run 실행 후,
http://localhost:5000/ 접속하면, This is Home!

from flask import Flask
app = Flask(__name__)

@app.route('/')
def home():
   return '나의 첫 서버!!!'

@app.route('/mypage')
def mypage():
   return 'mypage 입니다.'

if __name__ == '__main__':
   app.run('0.0.0.0',port=5000,debug=True)

Run 실행 후,
http://localhost:5000/mypage 접속하면, mypage 입니다.

from flask import Flask
app = Flask(__name__)

@app.route('/')
def home():
   return '<button>나는버튼이다</button>'

if __name__ == '__main__':
   app.run('0.0.0.0',port=5000,debug=True)

Run 실행 후,
http://localhost:5000/ 접속하면, 버튼창 이 나올것이다.

2.학습소감

오늘은 크롤링한 결과를 monogoDB를 통해서 작동하는 법을 배웠는데, 남이 짜둔 코드를 바꾸고, 그런방법을 하다보니 재미있다.
이제 컴퓨터에서 돌아가는 서버에 대한 이해를 하면서, 점차 우리가 사용하는 웹페이지에 대해서 점차 이해가기 시작된다.

좋은 웹페이지 즐겨찾기