축구선수 몸값 분석 웹 크롤링 (9) - 결과표 html 템플릿 만들기

1. HTML 템플릿 추가

  • 기존의 크롤링 결과를 단순이 표만 달랑 보여주는 것이 아니라 실제 하나의 페이지처럼 보이게 해야 했다.
  • 즉, 크롤링 결과를 html의 정해진 구역안에만 표시되게끔 할 방법이 필요했다.
  • 이를 위해 Flask에서 지원하는 Jinja 템플릿을 사용하면 백엔드의 데이터를 가져올 수 있다.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Transfer List</title>
    <link href="static/result_style.css" rel="stylesheet">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-0evHe/X+R7YkIZDRvuzKMRqM+OrBnVFBL6DOitfPri4tjfHxaWutUpFmBp4vmVor" crossorigin="anonymous">
</head>

<body>
    <header class="p-3 bg-dark text-white" id="pageHeader">
        <div class="title-header">
            <h1>Transfermarkt Player List</h1>
        </div>
    </header>

    <article id="mainArticle"> 
        <!-- 크롤링 결과 출력 -->
    {{ df_html | safe }}

    </article>

    <div id="nationTable">
    {{ nf_html | safe }}
    </div>


    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0-beta1/dist/js/bootstrap.bundle.min.js" integrity="sha384-pprn3073KE6tl6bjs2QrFaJGz5/SUsLqktiwsUTF55Jfv3qYSDhgCecCxMW52nD2" crossorigin="anonymous"></script>
</body>
</html>
from flask import Flask, render_template, request
import pandas as pd
import transfermarkt

app = Flask(__name__, static_url_path='/static')
        
@app.route('/')
def index():
    return render_template('index.html')

@app.route("/result", methods=['POST'])
def show_result():
    num = request.form["listnum"]
    typeList = request.form.getlist('type')
    pos = request.form['position']

    df = transfermarkt.show_valueList(num, typeList, pos)
    df_html = df.to_html(index=False, justify='left', classes='table')

    nf = transfermarkt.show_nationList()
    nf_html = nf.to_html(index=False,justify='left',classes='table')

    return render_template('result.html', df_html=df_html, nf_html=nf_html)

if __name__ == "__main__":
    app.run(debug=True)
  • 뷰함수에서 리턴할 때 html 파일을 같이 담아서 보내면 html의 Jinja 템플릿에서 이를 처리한다.
  • 선수가치 표와 Groupby한 표를 나누어서 표에 담았고, 덕분에 선수표를 정렬 조건에 따라 정렬할 수 있게 되었다.
    : Groupby한 표와 병합하였을 때 기존의 정렬(SortValue)이 안되는 오류가 있어서 기능을 추가하지 못했다.

2. 느낀점

  1. 점점 필요한 기능들이 많아지고 이를 코드에 직접 추가하면서 분량이 많아지게 되었고, 가독성이 갈수록 떨어짐을 몸소 느낄 수 있었다. 클린 코드, 중복되는 코드를 수정하고 각 기능에 적절한 주석을 다는 것이 중요함을 알 수 있었다.
  2. 사실 백엔드 개발자를 희망했었고 그 때문에 프론트 엔드는 소홀히 해도 될 줄 알았다. 하지만 이번 프로젝트를 진행하면서 프론트 엔트의 구조를 아는 것이 얼마나 중요한지, 그리고 이것이 절대 만만하게 봐서는 안되는 분야라는 것을 이번 기회를 통해 알 수 있었다.