10.19. MiniCamp_WEB_5WEEK

5w31892p·2022년 10월 19일
0

미니캠프

목록 보기
12/17

01. 무비스타

  1. 미리 init_db.py로 DB 저장 완료
#init.py

import requests
from bs4 import BeautifulSoup

from pymongo import MongoClient

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


# DB에 저장할 영화인들의 출처 url을 가져옵니다.
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로부터 영화인들의 사진, 이름, 최근작 정보를 가져오고 mystar 콜렉션에 저장합니다.
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.mystar2.insert_one(doc)
    print('완료!', name)


# 기존 mystar 콜렉션을 삭제하고, 출처 url들을 가져온 후, 크롤링하여 DB에 저장합니다.
def insert_all():
    db.mystar2.drop()  # mystar 콜렉션을 모두 지워줍니다.
    urls = get_urls()
    for url in urls:
        insert_star(url)


### 실행하기
insert_all()
  1. GET - 보여주기
#app.py

@app.route('/api/list', methods=['GET'])
def show_stars():
    stars = list(db.mystar2.find({}, {'_id': False}).sort('like', -1))
    return jsonify({'all_stars': stars})
//index.html

$(document).ready(function () {
  showStar();
});

function showStar() {
  $.ajax({
    type: 'GET',
    url: '/api/list',
    data: {},
    success: function (response) {
      let stars = response['all_stars']
      
      for (let i = 0; i < stars.length; i++) {
        let img = stars[i]['img_url']
        let like = stars[i]['like']
        let name = stars[i]['name']
        let recent = stars[i]['recent']
        let url = stars[i]['url']
        
        let temp_html = `<div class="card">
                          <div class="card-content">
                            <div class="media">
                              <div class="media-left">
                                <figure class="image is-48x48">
                                <img src="${img}" 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="#"token interpolation">${name}')" class="card-footer-item has-text-info"> 위로! <span class="icon"><i class="fas fa-thumbs-up"></i></span></a>
                            <a href="#"token interpolation">${name}')" class="card-footer-item has-text-danger"> 삭제 <span class="icon"><i class="fas fa-ban"></i></span></a>
                          </footer>
                        </div>`
        
        $('#star-box').append(temp_html);
      }
    }
  });
}
  1. POST - 좋아요, 삭제
# 좋아요

@app.route('/api/like', methods=['POST'])
def like_star():
    name_receive = request.form['name_give']

    stars = db.mystar2.find_one({'name':name_receive})
    like = stars['like']

    new_like = like + 1

    db.mystar2.update_one({'name': name_receive}, {'$set': {'like': new_like}})

    return jsonify({'msg': '좋아요 완료'})


# 삭제

@app.route('/api/delete', methods=['POST'])
def delete_star():
    name_receive = request.form['name_give']
    db.mystar2.delete_one({'name': name_receive})
    return jsonify({'msg': '삭제 완료 ✔'})
// 좋아요

function likeStar(name) {
  $.ajax({
    type: 'POST',
    url: '/api/like',
    data: {name_give: name},
    success: function (response) {
      alert(response['msg']);
      window.location.reload();
    }
  });
}



// 삭제

function deleteStar(name) {
  $.ajax({
    type: 'POST',
    url: '/api/delete',
    data: {name_give: name},
    success: function (response) {
      alert(response['msg']);
      window.location.reload();
    }
  });
}

02. AWS

EC2 서버 사기

  1. 시작하기
    1) 인스턴스 시작
    2) Ubuntu 18.04 체크 (우분투: 리눅스 배포판)
    3) 키페어 이름 설정 후 받아서 보관

  2. 1년 후 자동결제 방지
    → 인스턴스 중지 or 정지

  3. AWS EC2에 접속하기
    1) GitBash 실행 ↔ 종료는 exit 입력

    ssh -i 받은키페어를끌어다놓기 buntu@IPv4퍼블릭IP
  4. 간단한 리눅스 명령어

    ls → 내 위치의 모든 파일을 보기
    
    pwd → 내 위치(폴더의 경로) 보기
    
    mkdir aaa → 현 위치에 aaa 폴더 만들기
    
    cd aaa → aaa 폴더로 이동
    
    cd .. → 폴더 나가기 (상위 폴더로 이동)
    
    cp -r [복사할 것] [붙여넣기 할 것] → 복사 붙여넣기
    
    rm -rf [지울 것] → 지우기
    
    sudo [실행 할 명령어] → 명령어를 관리자 권한으로 실행
    
    sudo su → 관리가 권한으로 들어감 (나올때는 exit)

03. FileZilla

  1. 왼쪽 상단 사이트 관리자 열기 클릭

  2. 새 사이트 → 이름 설정

  3. FTP는 SFPT 로 설정

  4. host는 퍼블릭IPv4주소

  5. 포트는 22

  6. 로그온 유형 → 키 파일

  7. 사용자 → ubuntu

  8. 키 파일 찾아서 열기 → 연결


04. 서버 환경 통일

EC2 한방에 세팅

혼자서 서버 세팅하는 방법

  1. 위 파일 파일질라로 업로드

  2. git bash 실행

sudo chmod 755 initial_ec2.sh

05. AWS 포트 열어주기

  1. 포트 여는 방법
    1) 인스턴스 → 보안 → 보안그룹 → 인바운드 규칙 편집
    2) 규칙 추가로 포트 열기
    → 5000(flask 기본포트)
    → 80(http 접속을 위한 기본포트)
    → 27017(외부에서 mongoDB 접속하기 하기 위한 포트)
    3) 소스유형 : 위치무관 (현재 위치무관 없음)
    → IPv4 IPv6 각각 열기
    4) 규칙 저장
    → 포트 다 연 후 퍼블릭IPv4주소:5000 접속하면 접속됨

  2. 돌아가고 있는 flask 끄는 방법
    Ctrl + C


06. 도메인 구입 연결

  1. (구매 후) My가비아

  2. (도메인 우측) 관리

  3. (좌측 세번째) DNS 정보 → DNS 관리

  4. (도메인 우측) 관리 → 레코드 수정 → 레코드 추가
    1) 호스트 → @
    2) 값/위치 → 퍼블릭IPv4주소

  5. 구매한 도메인으로 접속
    → 이때 nohup으로 켜져있어야 함


07. og태그

<meta property="og:title" content="내 사이트의 제목" />
<meta property="og:description" content="보고 있는 페이지의 내용 요약" />
<meta property="og:image" content="{{ url_for('static', filename='ogimage.png') }}" />
  1. og:title , og:description 내용 적기

  2. 구글에서 원하는 사이즈 이미지 찾아서 적용
    1) 가로 사이즈 * 세로 사이즈 검색
    2) '이미지를 다른 이름으로 저장' → static에 저장
    3) og:image에 이미지 이름을 적고, jpg파일인지 png파일인지 확인후 맞게 적기

  3. 서버가 돌아가고 있다면 끄기

    ps -ef | grep 'app.py'
    kill -9 pid값1
    kill -9 pid값2
  4. refresh 후 FileZilla 기존파일 삭제 후 바뀐 파일 업로드

  5. 서버 다시 켜서 확인

    nohup python app.py &

08. og태그 안보이는 경우

  1. 코드 오타 등

  2. 카카오나 페이스북 즉시 업데이트 X
    1) 성능T상의 문제로 og 태그를 바로 업데이트 하지 않기 때문
    2) 수동으로 초기화(캐쉬삭제)해야 함
        카카오톡 캐쉬삭제 방법
        페이스북 캐쉬삭제 방법

0개의 댓글