dbmongo 기본 세팅
pip install pymongo, pip install dnspython
from pymongo import MongoClient
client = MongoClient('mongodb+srv://sparta:test@cluster0.szcxpef.mongodb.net/?retryWrites=true&w=majority')
db = client.dbsparta # dbsparta라는 큰 그룹 만들기
데이터 관리
# 저장 - 예시
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'})
웹 크롤링 결과 저장하기
from pymongo import MongoClient
client = MongoClient('mongodb+srv://sparta:test@cluster0.szcxpef.mongodb.net/?retryWrites=true&w=majority')
db = client.dbsparta
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://movie.daum.net/ranking/reservation', headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')
lis = soup.select('#mainContent > div > div.box_ranking > ol > li')
#mainContent > div > div.box_ranking > ol > li:nth-child(1) > div > div.thumb_item > div.poster_info > a
#mainContent > div > div.box_ranking > ol > li:nth-child(1) > div > div.thumb_cont > span.txt_append > span:nth-child(1) > span
#mainContent > div > div.box_ranking > ol > li:nth-child(1) > div > div.thumb_item > div.poster_movie > span.rank_num
for li in lis:
a = li.select_one('div > div.thumb_cont > strong > a')
title = a.text
span = li.select_one('div > div.thumb_cont > span.txt_append > span:nth-child(1) > span')
star = span.text
rank_num = li.select_one('div > div.thumb_item > div.poster_movie > span.rank_num')
rank = rank_num.text
doc = {
'title' : title,
'rank' : rank,
'star' : star
}
db.movies.insert_one(doc) # 새로 movies라는 소그룹 만들고 저장
원하는 데이터 가져오기 (예시 : 제목이 리바운드인 자료의 평점)
user = db.movies.find_one({'title':'리바운드'})
print(user['star'])
원하는 데이터들 가져오기 (예시 : 리바운드와 평점이 같은 영화들의 제목 가져오기)
movie = db.movies.find_one({'title':'리바운드'})
target_star = movie['star']
movies = list(db.users.find({'star':target_star},{'_id':False}))
for a in movies:
print(a['title'])
Flask로 서버 시작하기
통상적으로 flask를 시행할 시작 파일 이름은 app.py로 둔다. (html 시작 파일 이름을 index.html로 두는 것처럼)
터미널 -> python -m venv venv -> pip install 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)
# flask 시작 코드
위 코드의 실행이 안된다면 ctrl+C -> 코드 마지막 줄에서 port=5000을 port=5001로 바꿔서 실행
실행 후 새 탭 -> locolhost:5000
html파일을 서버에 올리기
app.py가 있는 폴더에 templates 폴더 생성 -> index.html 생성
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def home():
return 'This is my Home!'
@app.route('/mypage')
def mypage():
return render_template('index.html')
if __name__ == '__main__':
app.run('0.0.0.0',port=5000,debug=True)
클라이언트 요청 방식
GET 요청 - 통상적으로 데이터를 조회(Read)할 때 사용
→ 데이터 전달 : URL 뒤에 물을표를 붙여 key == value로 전달
from flask import Flask, render_template, request, jsonify
app = Flask(__name__)
@app.route('/')
def home():
return render_template('index.html')
@app.route('/test', methods=['GET'])
def test_get():
title_receive = request.args.get('title_give')
print(title_receive)
return jsonify({'result':'success', 'msg': '이 요청은 GET!!!!'})
if __name__ == '__main__':
app.run('0.0.0.0',port=5000,debug=True)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<title>Document</title>
<script>
function hey() {
fetch("/test").then(res => res.json()).then(data => {
console.log(data)
})
}
</script>
</head>
<body>
<h1>제목을 입력합니다.</h1>
<button onclick="hey()">나는 버튼!</button>
</body>
</html>
html에서 버튼을 클릭하면 hey()함수가 실행되고, 백엔드에서 /test를 요청한다. 그러면 백엔드에서 그에 대응하는 데이터를 보내고, html에서 그 데이터를 console.log()를 통해 읽을 수 있게 된다.
POST 요청 - 통상적으로 데이터를 생성(Create), 변경(Update), 삭제(Delete) 할 때 사용
→ 데이터 전달 : 바로 보이지 않는 HTML
from flask import Flask, render_template, request, jsonify
app = Flask(__name__)
@app.route('/')
def home():
return render_template('index.html')
@app.route('/test', methods=['POST'])
def test_post():
title_receive = request.form['title_give']
print(title_receive)
return jsonify({'result':'success', 'msg': '이 요청은 POST!'})
if __name__ == '__main__':
app.run('0.0.0.0',port=5000,debug=True)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<title>Document</title>
<script>
function hey() {
let formData = new FormData();
formData.append("title_give", "블랙팬서");
fetch("/test", { method: "POST", body: formData }).then(res => res.json()).then(data => {
console.log(data)
})
}
</script>
</head>
<body>
<h1>제목을 입력합니다.</h1>
<button onclick="hey()">나는 버튼!</button>
</body>
</html>
formData라는 형태를 만들어 여기에 데이터를 실어 fetch를 통해 백엔드의 title_give에 보낸다. 그걸 title_recieve로 받아서 블랙팬서가 print()로 출력한다. 그리고 html에는 리턴값의 데이터가 console.log()에 다시 찍힌다.
db + 서버 작업
TIP - 데이터 불러오기와 저장하기 중 저장하기부터 수행하라 (불러오기부터 하면 불러와도 확인이 어렵기 때문)
순서
1. 데이터 명세
2. 클라이언트와 서버 연결 확인하기
3. 서버부터 만들기
4. 클라이언트 만들기
5. 완성 확인하기