Heroku

Streamlit 라이브러리를 활용한 배포 예제

사전준비

  • 배포를 하기 위해서는 필수로 진행해야 할 사전준비가 필요하다.
  • Git & Github 설치 과정은 생략한다.

Step 01 - Streamlit 회원가입

Untitled

Untitled

  • Set up your account를 작성한다. 작성이 끝나면 다음과 같은 화면이 나오면 정상적으로 등록이 된 것이다.

Untitled

Step 02 - Github 레포 설정

  • Gitub 레포를 설정한다.
  • 이 때, 주의해야 할 것은 Public으로 설정을 해야한다.
    • .gitignore 파일도 Setting 하는 것이 좋다.

Untitled

Heroku를 활용한 카카오챗봇 배포 - DB조회편

읽기 전 공지

  • 본 글은 2022년 11월 28일까지만 유효합니다. 무료 버전이 사라지기 때문에, 앞으로 어떻게 될지는 현재 글 쓰는 시점에서는 모릅니다. 이 부분에 주의해서 참고 하시기를 바랍니다.

강의 홍보

Heroku를 활용한 카카오챗봇 배포 - 응용편

읽기 전 공지

  • 본 글은 2022년 11월 28일까지만 유효합니다. 무료 버전이 사라지기 때문에, 앞으로 어떻게 될지는 현재 글 쓰는 시점에서는 모릅니다. 이 부분에 주의해서 참고 하시기를 바랍니다.

강의 홍보

Heroku를 활용한 카카오챗봇 배포 - 인사말편

읽기 전 공지

  • 본 글은 2022년 11월 28일까지만 유효합니다. 무료 버전이 사라지기 때문에, 앞으로 어떻게 될지는 현재 글 쓰는 시점에서는 모릅니다. 이 부분에 주의해서 참고 하시기를 바랍니다.

강의 홍보

Heroku를 활용한 배포 - DB 연결편

읽기 전 공지

  • 본 글은 2022년 11월 28일까지만 유효합니다. 무료 버전이 사라지기 때문에, 앞으로 어떻게 될지는 현재 글 쓰는 시점에서는 모릅니다. 이 부분에 주의해서 참고 하시기를 바랍니다.

강의 홍보

Flask-Dash-Heroku 연동

개요

  • Flask 및 Dash를 활용하여 간단한 대시보드를 생성할 수 있다.
  • 기존 구현한 대시보드를 Heroku에 배포할 수 있다.

사전준비

  • 파이썬 가상환경 설치 및 기존 라이브러리에 대한 이해가 어느정도 있음을 가정한 상태에서 본 블로그를 작성했음을 유의한다.
  • Heroku 회원가입 및 로그인이 되어 있어야 한다.

Step 1. Github Repo생성

  • Github Repo 생성 시, 중복되지 않을 법한 이름으로 생성
    • 필자 Repo : flask-heroku-dash-evan1234
  • 해당 Repo를 로컬로 가져온다.
git clone https://github.com/your_name/your_unique_repo.git

Step 2. 가상환경 설치 및 주요 라이브러리 설치

  • 먼저 가상환경을 설치한다.
virtualenv venv
  • 가상환경에 접속한다.
source venv/Scripts/activate
  • 주요 라이브러리를 설치한다.
    • pandas : 데이터 불러오기 및 가공
    • dash & plotly : 동적 시각화 대시보드 제공 라이브러리
    • Flask : Flask 웹 프레임워크
    • SQLAlchemy : 데이터베이스 연동 프레임워크
pip install dash plotly Flask pandas gunicorn psycopg2-binary SQLAlchemy Flask-SQLAlchemy

Step 3. 기본 배포 테스트

  • 먼저 본격적인 코드에 앞서 기본적으로 배포가 되는지 확인한다.
  • 필요한 파일 app.py, Procfile, runtime.txt, requirements.txt 파일이 필요하다.

(1) app.py

  • 아래와 같이 작성한다.
# -*- coding:utf-8 -*-

from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return "Hello World"

(2) Procfile 파일 작성

  • 대문자 및 소문자 정확하게 기재해야 한다.
web: gunicorn app:app

(3) runtime.txt 파일 작성

python-3.9.12

(4) requirements.txt 파일 작성

  • 해당 파일은 기존에 설치했던 라이브러리를 모두 호출하는 형식이어야 한다.
  • 프로젝트 Root 경로에서 아래와 같이 실행한다.
pip freeze > requirements.txt
  • 전체 파일 구조를 확인하면 아래와 같다.
$ ls
app.py  Procfile  README.md  requirements.txt  runtime.txt  venv/

(5) wsgi.py 파일 작성

from app import app

if __name__ == "__main__":
    app.run(threaded=True, port=5000)

(5) 배포 시작

  • 아래 명령어를 순차적으로 입력하여 실행한다.
    • heroku login 시, Web UI에서 실제 ID와 Password를 입력해야 한다.
    • heroku create github repo와 동일하게 작성한다.
heroku login
heroku create your_project_repo
git add .
git commit -m "initial updated"
git push # github repo에 추가
git push heroku main

(6) 배포 사이트 확인

  • 실제로 정상적으로 배포가 완료가 되었다면 실제 웹사이트 URL을 클릭 후, 아래와 같이 확인할 수 있어야 한다.
  • 배포가 진행이 안된다면, 그 다음 코드를 입력하는 것은 의미가 없기 때문에 확인 후 넘어가도록 한다.

Untitled

Flask Heroku Pandas Postgres 튜토리얼

강의 홍보

개요

  • Flask 기본적인 작동 원리를 배운다.
  • Postgres와 SQLAlchemy를 활용한다.
  • Heroku에 배포를 진행한다.

사전준비

  • Github에 각 개인에게 맞는 Github Repo를 생성한다.
    • 주의 : 반드시 Unique하게 작성해야 한다.
  • 가상환경 설정을 진행한다.
  • PostgreSQL DB 설정은 다음을 참조한다.
virtualenv venv
  • 주요 라이브러리를 설치한다.
pip install Flask psycopg2 SQLAlchemy pandas gunicorn

배포

  • 프로젝트 시작 전에는 항상 선 배포를 하고 시작한다.
  • app.py를 만들어본다.
# -*- coding: utf-8 -*-

from flask import Flask

app = Flask(__name__)

@app.route("/")
def index():
    return "Hello World!"
  • 3개의 파일이 필요하다.

Heroku App 배포

개요

Procfile 생성

  • 프로젝트 Root 디렉터리에 Procfile 을 생성한다.
web: gunicorn index:server
  • 이 때, index 파일명을 의미한다.

작업 파일 수정

  • index.py을 열고, 다음 코드를 추가한다.
    • server = app.server 을 추가한다.
app = dash.Dash(__name__, meta_tags=[{"name": "viewport",
                                      "content": "width=device-width"}])

server = app.server

Runtime 파일 추가

  • 어떤 파이썬 버전에서 실행할 것인지 해당 코드를 작성한다. (runtime.txt)
    • 마찬가지로 프로젝트의 Root 디렉토리에서 생성한다.
python-3.8.7

Heroku 로그인 및 App 생성

  • Heroku 회원가입을 안했다면, 진행한다.

Heroku Dash App 배포 - Windows 10

개요

  • WindowsVirtualenv를 활용하여 빠르게 App 배포를 해본다.

1. 프로그램 다운로드

tutorial_01.png

  • 이럴 경우에는 환경변수를 강제로 잡는다.
C:\Program Files\heroku\bin
  • Heroku가 제대로 환경설정이 되어 있는지 확인하려면, 터미널에서 다음 명령어를 입력해 확인한다.
$ heroku -v
heroku/7.53.0 win32-x64 node-v12.21.0
(base)

2. Getting Started

$ heroku login
heroku: Press any key to open up the browser to login or q to exit:
Opening browser to https://cli-auth.heroku.com/auth/cli/browser/93982084-f22f-4a6b-b347-94f1aa4b6b47?requestor=SFMyNTY.g2gDbQAAAA4xMTIuMTQ0LjIyOC43Nm4GACiKMnR9AWIAAVGA.j9hng63oLOpCVOcHcWyOYDqT4s11jMHDtEesGw5xUD4
heroku: Waiting for login...
Logging in... done
Logged in as your_email@gmail.com
  • Github Repo를 생성하고, git clone 으로 바탕화면(또는 적정한 곳)에 Repo를 내려 받는다.
$ git clone https://github.com/your_name/heroku-app-green.git
  • heroku_app 경로에서 다음과 같이 실행한다.
    • 이 때, 프로젝트 폴더명, github repo 이름, heroku 이름이 동일해야 한다.
    • 또 한가지 주의해야 할 점은 name 방식이다. 무료 방식이기 때문에, 타 사용자가 해당 주소를 사용하고 있다면, 쓸수 없다. 또한, heroku_app 과 같은 형식도 되지 않는다.
    • 아래는 heroku app 생성 실패 내역이다.
$ heroku create heroku-app
 »   Warning: heroku update available from 7.53.0 to 7.59.2.
Creating heroku-app... !
 !    Name heroku-app is already taken                   
  • 정상적으로 설치가 완료되면 다음과 같이 뜬다.
$ heroku create heroku-app-green
 »   Warning: heroku update available from 7.53.0 to 7.59.2.
Creating heroku-app-green... done
https://heroku-app-green.herokuapp.com/ | https://git.heroku.com/heroku-app-green.git
(base)
  • heroku login을 진행한다.
$ heroku login
heroku: Press any key to open up the browser to login or q to exit: 
Opening browser to https://cli-auth.heroku.com/auth/cli/browser/9320abcd-b8c6-406d-9198-ca14d1e59a26?requestor=SFMyNTY.g2gDbQAAAA4yMjEuMTU3LjM3LjIxNm4GAGgtTBB7AWIAAVGA.GlyVc8jbyiW6NG0MVzCS0bOjtzBWvYRfjB9-gnkQaoQ
Logging in... done
Logged in as your_email_address
  • 이제 마지막으로 heroku app에 repository를 생성한다.
$ heroku git:remote -a your_app
 »   Warning: heroku update available from 7.53.0 to 7.59.2.
set git remote heroku to https://git.heroku.com/heroku-app-green.git
  • heroku-app-green 이 생긴 것을 확인할 수 있다.

tutorial_02.png

네이버 뉴스 댓글 크롤링 대시보드 만들기 with Heroku

강의 홍보

1. 개요

  • 기존 웹크롤링은 주로 코드에 기반한 소개가 주를 이루었음
  • 본 장에서는 가급적 사용자 기준에 맞춰서 뉴스 URL만 입력하면 댓글 수집할 수 있는 기능 소개함

2. 라이브러리

  • 크롤링 및 대시보드 작업을 위한 필수 라이브러리는 다음과 같음 (requirements.txt)
colorama==0.4.4
dash==1.21.0
gunicorn==20.1.0
numpy==1.19.4
pandas==1.2.0
beautifulsoup4==4.9.3
openpyxl==3.0.7
requests==2.26.0
  • 위 파일을 프로젝트의 가장 최상단에 위치시켜 놓는다.
  • 설치 진행 시에는 pip install -r requirements.txt 해도 좋고, 아니면 개별적으로 설치를 해도 좋다.

3. 코드 설명

  • 본장에서는 디테일한 코드 설명은 넘어가도록 한다.

(1) 크롤링 코드

  • 먼저 크롤링 코드는 다음과 같다.
# 크롤링 라이브러리
from bs4 import BeautifulSoup
import requests
import re

# 데이터프레임
import pandas as pd

# 샘플 URL을 적용한다. 
url = "https://news.naver.com/main/read.naver?mode=LSD&mid=shm&sid1=100&oid=022&aid=0003609357" 

def get_df(url):
    # 댓글을 달 빈 리스트를 생성합니다.
    List = []
    url = url
    oid = url.split("oid=")[1].split("&")[0]
    aid = url.split("aid=")[1]
    page = 1
    header = {
        "User-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36",
        "referer": url,

    }
    while True:
        c_url = "https://apis.naver.com/commentBox/cbox/web_neo_list_jsonp.json?ticket=news&templateId=default_society&pool=cbox5&_callback=jQuery1707138182064460843_1523512042464&lang=ko&country=&objectId=news" + oid + "%2C" + aid + "&categoryId=&pageSize=20&indexSize=10&groupId=&listType=OBJECT&pageType=more&page=" + str(
            page) + "&refresh=false&sort=FAVORITE"
    # 파싱하는 단계입니다.
        r = requests.get(c_url, headers=header)
        cont = BeautifulSoup(r.content, "html.parser")
        total_comm = str(cont).split('comment":')[1].split(",")[0]

        match = re.findall('"contents":([^\*]*),"userIdNo"', str(cont))
        # 댓글을 리스트에 중첩합니다.
        List.append(match)

        # 한번에 댓글이 20개씩 보이기 때문에 한 페이지씩 몽땅 댓글을 긁어 옵니다.
        if int(total_comm) <= ((page) * 20):
            break
        else:
            page += 1

		# 
    def flatten(l):
        flatList = []
        for elem in l:
        # if an element of a list is a list
        # iterate over this list and add elements to flatList
            if type(elem) == list:
                for e in elem:
                    flatList.append(e)
            else:
               flatList.append(elem)
        return flatList

    # 리스트 결과입니다.
    # print(flatten(List))

    # convert dataframe
    data = pd.DataFrame(flatten(List), columns=["기사댓글"])
    data = data.rename_axis("index").reset_index()

    # write_excel
    # data.to_excel("news_comments.xlsx", sheet_name="Sheet1")
    return data

# data = get_df(url) # URL 테스트 시, 실행 
data = pd.DataFrame({"index": [0], "기사댓글": ["댓글"]}) # 앱 배포시 실행
# print(data.head())
  • 중간에 주석처리 한 것을 풀면 된다.
  • 해당 코드는 app.py 또는 일반적인 주피터 노트북, 구글 코랩에서 실행해도 된다.
  • 수집된 댓글을 확인해보니, 중간에 삭제된 글은 댓글 수집 시, 제외되는 것을 확인할 수 있다.

dash-crawling-04.png