ใ‚ใกใ‚ƒใใกใ‚ƒ ้–‹็™บ่€…๐Ÿฆพ
์ฝ”๋”ฉ ์ง ๐Ÿ’ช
ใ‚ใกใ‚ƒใใกใ‚ƒ ้–‹็™บ่€…๐Ÿฆพ
  • ์นดํ…Œ๊ณ ๋ฆฌ (135)
    • ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๊ตฌ์ถ• (12)
      • ๊ฐœ๋ฐœ ํ™˜๊ฒฝ (5)
      • DB (0)
      • Node.js (4)
      • ํ˜•์ƒ ๊ด€๋ฆฌ (2)
      • Spring (1)
    • ์›น (11)
      • React (5)
      • ์ŠคํŒŒ๋ฅดํƒ€์ฝ”๋”ฉํด๋Ÿฝ__์›น (6)
    • ๋ชจ๋ฐ”์ผ (2)
      • ์•ˆ๋“œ๋กœ์ด๋“œ (2)
    • ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด (55)
      • C (13)
      • Python (15)
      • SQL (5)
      • Java (22)
    • ์‚ฌ๋ฌผ์ธํ„ฐ๋„ท (11)
      • ์•„๋‘์ด๋…ธ (11)
    • ์ผ์ƒ (31)
      • ๋ง›์ง‘ (13)
      • ๋žญํ‚น๋‹ญ์ปด (4)
      • ํ›„๊ธฐ (11)
      • ์š”๋ฆฌ (3)
      • ์žก๋‹ด (0)
    • ๊ต์–‘ (4)
      • ์‹ฌ๋ฆฌํ•™ (3)
      • ํ…Œ๋‹ˆ์Šค (1)
    • ์ž๊ฒฉ์ฆ (9)
      • ์ •๋ณด์ฒ˜๋ฆฌ๊ธฐ์‚ฌ (9)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ๐Ÿ’ป github

์ธ๊ธฐ ๊ธ€

์ตœ๊ทผ ๊ธ€

ํ‹ฐ์Šคํ† ๋ฆฌ

hELLO ยท Designed By ์ •์ƒ์šฐ.
ใ‚ใกใ‚ƒใใกใ‚ƒ ้–‹็™บ่€…๐Ÿฆพ

์ฝ”๋”ฉ ์ง ๐Ÿ’ช

[์ŠคํŒŒ๋ฅดํƒ€์ฝ”๋”ฉํด๋Ÿฝ] ๐Ÿ’ป ์›น๊ฐœ๋ฐœ ์ข…ํ•ฉ - 5์ฃผ์ฐจ (1)
์›น/์ŠคํŒŒ๋ฅดํƒ€์ฝ”๋”ฉํด๋Ÿฝ__์›น

[์ŠคํŒŒ๋ฅดํƒ€์ฝ”๋”ฉํด๋Ÿฝ] ๐Ÿ’ป ์›น๊ฐœ๋ฐœ ์ข…ํ•ฉ - 5์ฃผ์ฐจ (1)

2022. 6. 25. 20:31

ใ€Š ์ŠคํŒŒ๋ฅดํƒ€์ฝ”๋”ฉํด๋Ÿฝ ์›น๊ฐœ๋ฐœ ์ข…ํ•ฉ โ€•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()

 

init_db.py ์‹คํ–‰ ํ›„ mystar ์ฝœ๋ ‰์…˜

 

 

 [ ์˜ํ™”์ธ ์ •๋ณด ์นด๋“œ ๋„์‹ํ™” ]

 - (์„œ๋ฒ„) 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)

 

 

[ ์™„์„ฑ ๋ชจ์Šต ]

์ €์ž‘์žํ‘œ์‹œ ๋น„์˜๋ฆฌ ๋ณ€๊ฒฝ๊ธˆ์ง€ (์ƒˆ์ฐฝ์—ด๋ฆผ)
    '์›น/์ŠคํŒŒ๋ฅดํƒ€์ฝ”๋”ฉํด๋Ÿฝ__์›น' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • [์ŠคํŒŒ๋ฅดํƒ€์ฝ”๋”ฉํด๋Ÿฝ] ๐Ÿ’ป ์›น๊ฐœ๋ฐœ ์ข…ํ•ฉ - 5์ฃผ์ฐจ (2) (ๅฎŒ)
    • [์ŠคํŒŒ๋ฅดํƒ€์ฝ”๋”ฉํด๋Ÿฝ] ๐Ÿ’ป ์›น๊ฐœ๋ฐœ ์ข…ํ•ฉ - 4์ฃผ์ฐจ
    • [์ŠคํŒŒ๋ฅดํƒ€์ฝ”๋”ฉํด๋Ÿฝ] ๐Ÿ’ป ์›น๊ฐœ๋ฐœ ์ข…ํ•ฉ - 3์ฃผ์ฐจ
    • [์ŠคํŒŒ๋ฅดํƒ€์ฝ”๋”ฉํด๋Ÿฝ] ๐Ÿ’ป ์›น๊ฐœ๋ฐœ ์ข…ํ•ฉ - 2์ฃผ์ฐจ
    ใ‚ใกใ‚ƒใใกใ‚ƒ ้–‹็™บ่€…๐Ÿฆพ
    ใ‚ใกใ‚ƒใใกใ‚ƒ ้–‹็™บ่€…๐Ÿฆพ
    ๐Ÿ‘Š ๋ธ”๋กœ๊ทธ๋„ ๊ทผ์„ฑ์ด๋‹ค? ๐Ÿ‘Š

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”