ใ ์คํ๋ฅดํ์ฝ๋ฉํด๋ฝ ์น๊ฐ๋ฐ ์ข ํฉ โ1์ฃผ์ฐจโ ใ
ใ ์คํ๋ฅดํ์ฝ๋ฉํด๋ฝ ์น๊ฐ๋ฐ ์ข ํฉ โ2์ฃผ์ฐจโ ใ
ใ ์คํ๋ฅดํ์ฝ๋ฉํด๋ฝ ์น๊ฐ๋ฐ ์ข ํฉ โ3์ฃผ์ฐจโ ใ
ใ ์คํ๋ฅดํ์ฝ๋ฉํด๋ฝ ์น๊ฐ๋ฐ ์ข ํฉ โ4์ฃผ์ฐจโ ใ
- ํด๋ผ์ด์ธํธ ๋ฐ ์๋ฒ ๋์ ๊ตฌ์กฐ -
ใ ๋ง์ดํ์ด๋ณด๋ฆฟ ๋ฌด๋น์คํ ํ๋ก์ ํธ ์์ ใ
[ ํด๋๊ตฌ์กฐ ]
- movieStar
โ static
โ templates
โ index.html
โ app.py
โ init_db.py
[ init_db.py ]
- ์ด๊ธฐ index.html ๋ผ๋์ ๋ถ์ผ ์ํ์ธ ์ ๋ณด DB๊ฐ ํ์ํจ
- ์ด๋ฅผ ๋ค์ด๋ฒ ์ํ์ธ ๋ญํน ํ์ด์ง์์ ์ํ์ธ ์ ๋ณด๋ฅผ ํฌ๋กค๋งํด์ DB์ ์ ์ฅํ ์ ์ฒ๋ฆฌ ํ์ผ
# DB Setting
import requests
from bs4 import BeautifulSoup
from pymongo import MongoClient
# -- pyMongo Settings --
client = MongoClient('localhost', 27017)
db = client.dbsparta
# ๋ค์ด๋ฒ ์ํ์ธ ๋ญํน ํ์ด์ง์์ ๊ฐ ์ํ์ธ์ ์ ๋ณด๋ฅผ ์๊ฐํ๋ ๋งํฌ๋ฅผ ์ถ์ถํ์ฌ urls ๋ฆฌ์คํธ์ ์ ์ฅํ ๋ฐํ
def get_urls():
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/rpeople.nhn', headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')
trs = soup.select('#old_content > table > tbody > tr')
urls = []
for tr in trs:
a = tr.select_one('td.title > a')
if a is not None:
base_url = 'https://movie.naver.com/'
url = base_url + a['href']
urls.append(url)
return urls
# ์ํ์ธ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ ํ์ด์ง url์ ์ ๋ฌ๋ฐ์ ์ํ์ธ์ ์ด๋ฆ, ํ๋กํ์ฌ์ง ๋งํฌ, ์ต๊ทผ์ํ๋ฑ์ ์ ๋ณด๋ฅผ ์ถ์ถํ์ฌ DB์ ์ ์ฅ
def insert_star(url):
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(url, headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')
name = soup.select_one('#content > div.article > div.mv_info_area > div.mv_info.character > h3 > a').text
img_url = soup.select_one('#content > div.article > div.mv_info_area > div.poster > img')['src']
recent_work = soup.select_one(
'#content > div.article > div.mv_info_area > div.mv_info.character > dl > dd > a:nth-child(1)').text
doc = {
'name': name,
'img_url': img_url,
'recent': recent_work,
'url': url,
'like': 0
}
db.mystar.insert_one(doc)
print('์๋ฃ!', name)
# ๊ธฐ์กด ์ฝ๋ ์
์ ์ด๊ธฐํํ ํ get_urls() ํจ์๋ฅผ ํตํด ์ ๋ฌ๋ฐ์ url ๋ฆฌ์คํธ๋ฅผ ๋ฐ๋ณต๋ฌธ์ ํตํด insert_star() ํจ์๋ก ์ ๋ฌ
def insert_all():
db.mystar.drop() # mystar ์ฝ๋ ์
์ ๋ชจ๋ ์ญ์
urls = get_urls()
for url in urls:
insert_star(url)
### ์คํํ๊ธฐ
insert_all()
[ ์ํ์ธ ์ ๋ณด ์นด๋ ๋์ํ ]
- (์๋ฒ) DB๋ก๋ถํฐ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ํด๋ผ๋ฆฌ์ธํธ๋ก ์ ๋ฌ
- (ํด๋ผ์ด์ธํธ) ์๋ฒ๋ก๋ถํฐ GET ์์ฒญ๋ฐฉ์์ ํตํด ์ ๋ฌ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ธ๋ผ์ฐ์ ์ ํํ
[ ์ํ์ธ ์นด๋์ ์ข์์ ๊ธฐ๋ฅ ]
- (ํด๋ผ์ด์ธํธ) POST ์์ฒญ ๋ฐฉ์์ ํตํด ์๋ฒ๋ก '์๋ก!๐' ๋ฒํผ์ด ํด๋ฆญ๋ ์ํ์ธ ์ ๋ณด๋ฅผ ์ ๋ฌ
- (์๋ฒ) ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์ ๋ฌ๋ฐ์ ์ํ์ธ ์ ๋ณด๋ฅผ ํตํด ํด๋น ๋ฐ์ดํฐ์ 'like' ํ๋๊ฐ์ 1๋งํผ ์์น
[ ์ํ์ธ ์นด๋ ์ญ์ ]
- (ํด๋ผ์ด์ธํธ) POST ์์ฒญ ๋ฐฉ์์ ํตํด ์๋ฒ๋ก '์ญ์ ๐ซ' ๋ฒํผ์ด ํด๋ฆญ๋ ์ํ์ธ ์ ๋ณด๋ฅผ ์ ๋ฌ
- (์๋ฒ) ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์ ๋ฌ๋ฐ์ ์ํ์ธ ์ ๋ณด๋ฅผ ํตํด ํด๋น ๋ฐ์ดํฐ ์ญ์
[ ํด๋ผ์ด์ธํธ ํ์ผ (index.html) JavaScript ์ฝ๋ ]
- $(document).ready(function( ) ) { } : ๋ธ๋ผ์ฐ์ ๊ฐ ๋ถ๋ ค์ค๋ ์ฆ์ ์คํ ๋๋ ํจ์(์ต์ด ์คํ ํจ์)
$(document).ready(function () {
showStar(); // ์๋ฒ๋ก๋ถํฐ ์ ๋ฌ๋ฐ์ DB๋ฅผ ํตํด ์ํ์ธ ์ ๋ณด ์นด๋๋ฅผ ๋์ํ ํ๋ ํจ์
});
- showStar( ) : GET์์ฒญ ๋ฐฉ์์ ํตํด ์๋ฒ๋ก๋ถํฐ ์ํ์ธ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ DB๋ฅผ ์ ๋ฌ๋ฐ์ HTML ์์์ ์ฝ์ ํจ์
function showStar() {
$.ajax({
type: "GET",
url: "/api/list?movie_stars=movie_star",
data: {},
success: function (response) {
let mystars = response["movie_stars"];
for (let i = 0; i < mystars.length; i++) {
name = mystars[i]["name"]; // ์ํ์ธ ์ด๋ฆ
url = mystars[i]["url"]; // ์ํ์ธ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ ๋ค์ด๋ฒ ๋งํฌ URL
like = mystars[i]["like"]; // ์ํ์ธ ์นด๋ ์ข์์ ์
image_url = mystars[i]["img_url"]; // ์ํ์ธ ํ๋กํ ์ฌ์ง ๋งํฌ URL
recent = mystars[i]["recent"]; // ์ํ์ธ์ ์ต๊ทผ ์ํ
temp_html = `<div class="card">
<div class="card-content">
<div class="media">
<div class="media-left">
<figure class="image is-48x48">
<img src="${image_url}" alt="Placeholder image"/>
</figure>
</div>
<div class="media-content">
<a href="${url}" target="_blank" class="star-name title is-4">${name} (์ข์์: ${like})</a>
<p class="subtitle is-6">${recent}</p>
</div>
</div>
</div>
<footer class="card-footer">
<a href="#"
onclick="likeStar('${name}')"
class="card-footer-item has-text-info">์๋ก!
<span class="icon">
<i class="fas fa-thumbs-up"></i>
</span>
</a>
<a href="#"
onclick="deleteStar('${name}')"
class="card-footer-item has-text-danger">์ญ์
<span class="icon">
<i class="fas fa-ban"></i>
</span>
</a>
</footer>
</div>`;
$(".star-list").append(temp_html);
}
},
});
}
- likeStar( ) : ์ํ์ธ ์นด๋์ '์๋ก!๐' ๋ฒํผ ํด๋ฆญ์ ํด๋น ์ํ์ธ ์ ๋ณด๋ฅผ POST ์์ฒญ๋ฐฉ์์ ํตํด ์๋ฒ๋ก ์ ๋ฌํ๋ ํจ์
function likeStar(name) {
$.ajax({
type: "POST",
url: "/api/like",
data: { name_give: name },
success: function (response) {
alert(response["msg"]);
window.location.reload();
},
});
}
- deleteStar( ) : ์ํ์ธ ์นด๋์ '์ญ์ ๐ซ' ๋ฒํผ ํด๋ฆญ์ ํด๋น ์ํ์ธ ์ ๋ณด๋ฅผ POST ์์ฒญ๋ฐฉ์์ ํตํด ์๋ฒ๋ก ์ ๋ฌํ๋ ํจ์
function deleteStar(name) {
$.ajax({
type: "POST",
url: "/api/delete",
data: { name_give: name },
success: function (response) {
alert(response["msg"]);
window.location.reload();
},
});
}
[ ์๋ฒ ํ์ผ (app.py) ]
from pymongo import MongoClient
from flask import Flask, render_template, jsonify, request
# -- Flask Setting --
app = Flask(__name__)
# -- pyMongo Settings --
client = MongoClient('localhost', 27017)
db = client.dbsparta
## -- Routings --
# ์ด๊ธฐ ๋ธ๋ผ์ฐ์ ํ์ด์ง ('index.html' render)
@app.route('/')
def home():
return render_template('index.html')
## -- API --
# Show Table API
@app.route('/api/list', methods=['GET'])
def show_stars():
# mystar ์ฝ๋ ์
์์ ๋ชจ๋ DB ๊ฐ์ ธ์ค๊ธฐ ['like'์ ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ : sort() ]
movie_star = list(db.mystar.find({}, {'_id': False}).sort('like', -1))
return jsonify({'movie_stars': movie_star})
# Plus Like API
@app.route('/api/like', methods=['POST'])
def like_star():
name_receive = request.form['name_give']
target_star = db.mystar.find_one({'name': name_receive})
current_like = target_star['like']
new_like = current_like + 1
db.mystar.update_one({'name': name_receive}, {'$set': {'like': new_like}})
return jsonify({'msg': '์ข์์ ์๋ฃ!'})
# Delete Card API
@app.route('/api/delete', methods=['POST'])
def delete_star():
name_receive = request.form['name_give']
db.mystar.delete_one({'name': name_receive})
return jsonify({'msg': 'delete ์๋ฃ๋์์ต๋๋ค!'})
if __name__ == '__main__':
app.run('0.0.0.0', port=5000, debug=True)
[ ์์ฑ ๋ชจ์ต ]