송용우

Update getBJ with date

1 +exports.StringToDate_BJ = function (date_str) {
2 + let arr_date = date_str.split(" "); //yyyy m dd tt MM SS Fomat LIST
3 + let arr_date_r = arr_date.map(function (str) {
4 + let str_r = str.slice(0, -1);
5 +
6 + return str_r.length == 1 ? "0" + str_r : str_r;
7 + });
8 +
9 + return arr_date_r[0] + arr_date_r[1] + arr_date_r[2]; //YYYYMMDD 형식으로 반환
10 +};
1 const axios = require("axios"); 1 const axios = require("axios");
2 const cheerio = require("cheerio"); 2 const cheerio = require("cheerio");
3 +const StringToDate = require("./StringToDate");
4 +/*
5 +ToDO
6 +- 유저 네임 검증
7 +- 예외 처리
8 +*/
9 +exports.getBJ = async function (userid) {
10 + let data_list = [];
11 + let next_page_link = "";
3 12
4 -exports.getBJ = function (userid) { 13 + await getStartPage(userid).then((html) => {
5 - const getHtml = async (userid) => { 14 + //시작 페이지를 가져온다.
15 + //같은 객체를 두번 선언한다. 퍼포먼스에 문제 생길수도
16 + //함수에 객체를 넘기는 방법도 있다.
17 + //첫 페이지 가져온다.
18 + data_list.push(getData(html));
19 + next_page_link = getNextPageLink(html);
20 + });
21 + while (next_page_link != -1) {
22 + //다음 페이지를 가져온다.
23 + await getNextPage(next_page_link).then((html) => {
24 + data_list.push(getData(html));
25 + next_page_link = getNextPageLink(html);
26 + });
27 + }
28 + return data_list.flat(1);
29 +};
30 +
31 +const getStartPage = async (userid) => {
32 + //유저 아이디 입력
6 try { 33 try {
7 - return await axios.get("https://www.acmicpc.net/user/" + userid); 34 + return await axios.get(
35 + "https://www.acmicpc.net/status?user_id=" + userid + "&result_id=4"
36 + );
8 } catch (error) { 37 } catch (error) {
9 console.log(error); 38 console.log(error);
10 } 39 }
11 - }; 40 +};
12 -
13 - getHtml(userid).then((html) => {
14 - let psList = [];
15 - const $ = cheerio.load(html.data);
16 - const $bodyList = $("div.panel-body").children();
17 41
18 - $bodyList.each(function (i) { 42 +const getNextPage = async (link) => {
19 - if (i % 2 == 0) { 43 + //링크 입력
20 - psList[i / 2] = { 44 + try {
21 - problem_number: $(this).children().text(), 45 + return await axios.get(link);
22 - problem_title: $(this).next().children().text(), 46 + } catch (error) {
23 - }; 47 + console.log(error);
24 } 48 }
25 - }); 49 +};
26 50
27 - console.log(psList); 51 +const getData = (html) => {
28 - return psList; 52 + //페이지 데이터 파싱
53 + let psArr = [];
54 + const $ = cheerio.load(html.data);
55 + const $bodyList = $("#status-table > tbody");
56 + $bodyList.children().each((index, element) => {
57 + psArr.push({
58 + problem_number: $(element).find("a.problem_title").text(),
59 + problem_title: $(element).find("a.problem_title").attr("title"),
60 + solved_date: StringToDate.StringToDate_BJ(
61 + $(element).find("a.real-time-update").attr("title")
62 + ),
63 + });
29 }); 64 });
65 + return psArr;
66 +};
67 +const getNextPageLink = (html) => {
68 + //다음 페이지가 있으면 다음 페이지 주소 return, 없으면 -1 return
69 + const $ = cheerio.load(html.data);
70 + return $("#next_page").attr("href")
71 + ? "https://www.acmicpc.net/" + $("#next_page").attr("href")
72 + : -1;
30 }; 73 };
......