최근 팀프로젝트를 진행하면서 아주대학교 공지사항을 긁어올 일이 생겼다.
아쉽게도 학교에서 제공해 주는 API가 없어서 직접 크롤러를 만들어서 공지사항을 긁어와야 한다.
코드의 흐름은 다음과 같다
1. 클라이언트가 공지사항 페이지 번호를 url 파라미터에 넣고 서버에 요청
2. 서버는 axios를 이용해 공지사항 html 데이터를 긁어옴
3. cheerio를 이용해 html 파싱
4. 공지사항 타이틀, 생성 날짜, 링크된 url을 json 형태로 클라이언트에 응답
const axios = require('axios');
const cheerio = require('cheerio');
const express = require('express')
const app = express()
const originUrl = 'https://www.ajou.ac.kr/kr/ajou/notice.do';
const getHtml = async offset => {
offset = (offset - 1) * 10;
const html = await axios.get(
`https://www.ajou.ac.kr/kr/ajou/notice.do?mode=list&&articleLimit=10&article.offset=${offset}`,
);
const $ = cheerio.load(html.data);
const result = []
for (let i = 0; i < 20; i++) {
const title = $(`tr:nth-child(${i}) > td.b-td-left > div > a`)
.text()
.replace(/^\s+|\s+$/gm, '');
const date = $(`tr:nth-child(${i}) > ` + 'td:nth-child(6)')
.text()
.replace(/^\s+|\s+$/gm, '');
let url = $(`tr:nth-child(${i}) > td.b-td-left > div > a`).attr('href')
url = originUrl + url;
if (title !== '' && title.indexOf('공지') < 0) {
result.push({title, date, url});
}
}
return result;
};
app.get('/:page', async function (req, res) {
res.send(await getHtml(parseInt(req.params.page)));
});
app.listen(3000);
'개발 > Backend' 카테고리의 다른 글
대용량 트래픽 처리를 위한 6가지 방법 (0) | 2023.03.29 |
---|