[2026 하계 모각코 1주차] 학식 크롤링하기

딤동희·2026년 7월 7일

2026 하계 모각코

목록 보기
1/6
post-thumbnail

여러분은 자신의 웹사이트에 학식까지 작게 띄워 사용자들이 조금이라도 더 많은 정보를 얻어갔으면 좋겠다는 생각을 하신 적 있는가? 오늘은 제가 한 번 충남대학교의 학식 정보를 가져와 json으로 출력해보도록 하겠다.

크롤링할 사이트 조사하기


위 사진은 충남대 오늘의 학식 사이트이다. 사이트의 url은 https://mobileadmin.cnu.ac.kr/food/index.jsp?searchYmd=${date} 이며, searchYmd 파라미터로 해당일에 맞는 학식을 확인할 수 있다.
보이는것처럼 표 형식으로 table 태그 안에 각 정보(예: 중식-학생-2학생회관)에 맞는 학식이 td안에 작성되어있다는 것을 알 수 있다.

코드 작성

크롤링을 하기 위해 환경은 javascript, 크롤링을 위한 패키지는 axios와 cheerio를 사용하였다.

const crawling = async (date) => {
    try {
        const url = `https://mobileadmin.cnu.ac.kr/food/index.jsp?searchYmd=${date}`;
        const res = await axios.get(url);

        const html = res.data
        const $ = cheerio.load(html);

        const haksik = Array.from({ length: 6 }, (_, idx) => {
            const time = ['breakfast', 'lunch', 'dinner'][Math.floor(idx/2)];
            const target = ['teacher', 'student'][idx%2]
            
            return {
                time: time,
                target: target,
                menu: {
                    fir: '메뉴확인',
                    sec: '운영안함',
                    thi: '운영안함',
                    fou: '운영안함',
                    fif: '운영안함'
                }
            }
        });

먼저 axios로 학식 사이트의 html을 get한 뒤, cheerio로 받은 html을 load해준다. 이게 html을 검색할 수 있게 하는 과정같았다.
이후 학식을 저장할 공간을 만들어주었는데, 조식 중식 석식 별로 학생과 직원이 있기 때문에 총 6행 5열(각 식당)로 배열을 만들었다.

		$('tbody').eq(0).find('tr').each((idx, tr) => {
            const tds = $(tr).find('td')

            const menu = []
            
            tds.each((_, td) => {
                menu.push($(td).text().split('\n').filter((v) => v != '').join('\n'));
            })
            
            const len = menu.length
            haksik[idx].menu.sec = menu[len-4];
            haksik[idx].menu.thi = menu[len-3];
            haksik[idx].menu.fou = menu[len-2];
            haksik[idx].menu.fif = menu[len-1];
        });

        console.log(haksik);
    } catch (error) {
        console.error(error)
    }
}

crawling('2026.03.23');

이제 검색을 한다. tbody 속에 있는 각 tr을 검색해야하므로 $('tbody').eq(0).find('tr').each((idx, tr) 으로 각 tr을 순회하였다.
tr안에는 행에 맞는 학식메뉴가 식당별로 td로 구별되어있으므로, tr 안에있는 td들을 찾아 또 각각 순회하여 메뉴를 저장한다.
이후 각 식당에 맞는 메뉴를 원래 저장하기 위해 만든 변수인 haksik의 올바른 위치에 넣어주기만 하면 끝이 난다.

테스트

crawling('2026.03.23');

실행해보면,

짜라란 대충 이렇게 잘된것을 볼 수 있다.

후기

크롤링이란 웹페이지를 그대로 가져와 그곳에서 데이터를 추출해 내는 행위이다. 수많은 웹페이지들 사이에서 원하는 데이터를 빼와 가공하여 사용한다는 것의 필요성 뿐만 아니라, 이 행위 자체에 대한 아름다움?까지 느낄 수 있었다. 다만 무식한 크롤링은 해당 웹사이트의 서버에 대한 도스 공격과 다를 바가 없기 때문에 주의가 필요하다.

2개의 댓글

comment-user-thumbnail
2026년 7월 14일

순살감자탕 진짜 맛도리입니다 . . .

1개의 답글