2021-03-02 파이썬으로 학교 급식 파싱

포코드·2021년 3월 2일
0

Year 2021

목록 보기
4/8
post-thumbnail

학교 급식을 파싱하게된 이유....

학교에서 급식표를 보려면 지정된 장소에서 봐야하길래 웹으로 급식을 편하게 확인 가능하면
좋을 것 같아서 급식웹을 만들어주기로 하였다.


학교 급식을 받아오기 -1-

일단 급식웹을 만들려면 급식을 받아서 뿌려주는 api가 필요하다. 그래서 나이스 학생서비스의 학교정보에 있는 주간식단에서 급식정보를 불러오기로 하였다.
(https://stu.sen.go.kr/edusys.jsp?page=sts_m42320 - 나이스 주간식단)

학교 급식을 받아오기 -2-

나이스 주간식단 페이지에 쿠키를 확인해서 필요한 쿠키들을 구한다.
필요한 쿠키들은

schulCode=B100000589
검색한 학교의 고유식별번호이다

schulKndScCode=04
01은 유치원 02는 초등학교이고 03은 중학교이고 04는 고등학교이다.

schulCrseScCode=4
01은 유치원 02는 초등학교이고 03은 중학교이고 04는 고등학교이다.

이제 이렇게 구한 쿠키값들로 우리가 원하는 정보인 급식을 불러올 것이다.

학교 급식을 받아오기 -3-

나이스에서의 급식정보는 주소에 쿼리를 달아주어야 나온다.
그래서 앞에서 구한값을 주소에 쿼리로 달아주고 beatifulsoup4를 이용해서
요청을 보내준 뒤, 필요없는 html 태그들을 잘라내고 필요한 정보만 남기고
flask로 post요청이 들어오면 급식정보들을 보내게 만들어주었다.


코드

crawler.py

import requests
from bs4 import BeautifulSoup
import re
import datetime

now = datetime.datetime.now()


def get_html(url):
    _html = ""
    resp = requests.get(url)
    if resp.status_code == 200:
        _html = resp.text
    return _html


def get_meal(code, ymd, weekday):
    schMmealScCode = code  # int=
    schYmd = ymd  # str

    num = weekday
    if weekday == "월":
        num = 1
    elif weekday == "화":
        num = 2
    elif weekday == "수":
        num = 3
    elif weekday == "목":
        num = 4
    elif weekday == "금":
        num = 5
    elif weekday == "토":
        num = 6
    elif weekday == "일":
        num = 7
    else:
        num = weekday

    URL = ("http://stu.sen.go.kr/sts_sci_md01_001.do?"
           "schulCode=B100000589&schulCrseScCode=4&schulKndScCode=04"
           "&schMmealScCode=%d&schYmd=%s" % (schMmealScCode, schYmd))
    html = get_html(URL)
    soup = BeautifulSoup(html, 'html.parser')
    element = soup.find_all("tr")
    element = element[2].find_all('td')
    try:
        element = element[num]  # num
        element = str(element)
        # element = element.replace('[', '')
        # element = element.replace(']', '')
        element = element.replace('<br/>', ' ')
        element = element.replace('<td class="textC last">', '')
        element = element.replace('<td class="textC">', '')
        element = element.replace('</td>', '')
        # element = element.replace('(h)', '')
        element = element.replace('.', '')
        element = element.replace('·', '')
        element = re.sub(r"\d", "", element)
    except:
        element = " "

    list_element = element.split(" ")
    list_element = list(filter(None, list_element))
    json_element = {}
    json_num = 0
    for i in list_element:
        json_element[json_num] = i
        json_num += 1

    return json_element

nowDate = now.strftime("%Y.%m.%d")  # 현재 y.m.d 불러오는 변수

meal = get_meal(2, "2020.09.23", "화")

print(meal)
print(len(meal))
print(type(meal))

app.py

from flask import Flask, request, jsonify
from crawler import get_meal
import json

app = Flask(__name__)
app.config['JSON_AS_ASCII'] = False

@app.route('/getmeal', methods = ['POST'])
def getmeal():
    req = request.get_json()
    print(req)
    meal = get_meal(req["code"], req["ymd"], req["weekday"])
    print("----------")
    print(meal)
    print("----------")
    return jsonify(meal)

if __name__ == "__main__":
    app.run(host='0.0.0.0', port='3012')

참고: https://mandu-mandu.tistory.com/21

profile
개발자 지망생

0개의 댓글