본문 바로가기
TIL/웹 초보

23.04.13

by J1-H00N 2023. 4. 13.

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. 완성 확인하기

'TIL > 웹 초보' 카테고리의 다른 글

23.04.14  (0) 2023.04.14
챗GPT로 웹사이트 만들기  (0) 2023.04.13
23.04.12  (0) 2023.04.12
23.04.07  (0) 2023.04.07
23.04.06  (0) 2023.04.06