전세계

버그: 연속적으로 checkData를 수행할 경우 발생하는 버그 수정(비동기 함수로 전환)

Showing 1 changed file with 156 additions and 141 deletions
...@@ -8,174 +8,191 @@ const cheerio = require('cheerio'); ...@@ -8,174 +8,191 @@ const cheerio = require('cheerio');
8 const url = 'http://lol.inven.co.kr/dataninfo/proteam/progamer.php?code=135'; 8 const url = 'http://lol.inven.co.kr/dataninfo/proteam/progamer.php?code=135';
9 9
10 const version = '0.1'; 10 const version = '0.1';
11 +const dataFileName = 'data.json';
11 12
12 var fakerData = {}; 13 var fakerData = {};
13 14
14 -function checkData() { 15 +async function checkData() {
15 try { 16 try {
16 - const dataBuffer = fs.readFileSync('data.json'); 17 + if (fakerData.version == version) {
17 - console.log("데이터 파일이 존재합니다. 데이터를 읽습니다."); 18 + console.log("이미 데이터가 존재합니다.");
18 - fakerData = JSON.parse(dataBuffer.toString()); 19 + }
19 - console.log(fakerData); 20 + else if (fakerData.version == undefined) {
20 - 21 + const dataBuffer = fs.readFileSync(dataFileName);
21 - if(fakerData.version != version){ 22 + console.log("데이터를 읽습니다.");
23 + fakerData = JSON.parse(dataBuffer.toString());
24 + console.log(fakerData);
25 + }
26 + else {
22 console.log("버전이 다릅니다. 데이터를 크롤링합니다."); 27 console.log("버전이 다릅니다. 데이터를 크롤링합니다.");
23 - getData(); 28 + await getData();
24 } 29 }
25 } 30 }
26 catch (exception) { 31 catch (exception) {
27 - console.log(exception);
28 if (exception.code == "ENOENT") { 32 if (exception.code == "ENOENT") {
29 console.log("데이터 파일이 존재하지 않습니다. 데이터를 크롤링합니다."); 33 console.log("데이터 파일이 존재하지 않습니다. 데이터를 크롤링합니다.");
30 - getData(); 34 + await getData();
35 + }
36 + else {
37 + console.log(exception);
31 } 38 }
32 } 39 }
40 +
41 + return new Promise(function (resolve, reject) {
42 + resolve();
43 + });
33 } 44 }
34 45
35 -const getHTML = async () => { 46 +async function getHTML() {
36 try { 47 try {
37 - return await axios.get(url); 48 + return axios.get(url);
38 } catch (error) { 49 } catch (error) {
39 console.error(error); 50 console.error(error);
51 + return null;
40 } 52 }
41 }; 53 };
42 54
43 -function getData() { 55 +async function getData() {
44 - getHTML() 56 + const html = await getHTML();
45 - .then(html => { 57 + if (html == null) {
46 - var today = new Date(); 58 + return;
47 - var dateInfo = `${today.getFullYear()}/${today.getMonth() + 1}/${today.getDate()}`; 59 + }
48 - fakerData['date'] = dateInfo;
49 60
50 - const $ = cheerio.load(html.data); 61 + fakerData['version'] = version;
62 +
63 + var today = new Date();
64 + var dateInfo = `${today.getFullYear()}/${today.getMonth() + 1}/${today.getDate()}`;
65 + fakerData['date'] = dateInfo;
66 +
67 + const $ = cheerio.load(html.data);
68 +
69 + var playerName = $('div#lolMain h2.block.name').text().split(' ');
70 + fakerData['name'] = playerName[playerName.length - 1];
71 +
72 + //#region LCK 통산 전적
73 + var tr = $('table.table.log_list.log01 tbody').children();
74 + var td = tr.eq(0).children();
75 +
76 + fakerData['lCK'] = {
77 + totalGamePlay: td.eq(1).text(),
78 + totalWin: td.eq(2).text(),
79 + totalLose: td.eq(3).text(),
80 + winRate: td.eq(4).text(),
81 + killPerMatch: td.eq(5).text(),
82 + deathPerMatch: td.eq(6).text(),
83 + assistPerMatch: td.eq(7).text(),
84 + kDA: td.eq(8).text(),
85 + kP: td.eq(9).text()
86 + };
87 + //#endregion
88 +
89 + //#region 최근 LCK 기록
90 + var recentLCKInfo = $('div.block.scriptorium_box.scriptorium_player_info').children().eq(2);
91 + var mostInfo = recentLCKInfo.find('div.left ul.block.list').children();
92 + var mostList = [];
93 + var indicatorInfo = recentLCKInfo.find('div.right ul.block.bottom.clearfix').children();
94 +
95 + mostInfo.each(function (i, elem) {
96 + mostList[i] = {
97 + champion: $(this).find('div.name_area p.value b').text(),
98 + played: $(this).find('div.play_area p.value').text(),
99 + record: $(this).find('div.log_area p.value').text(),
100 + kDA: $(this).find('div.kda_area p.value').text()
101 + };
102 + });
103 +
104 + fakerData['recentLCK'] = {
105 + name: recentLCKInfo.find('h3.block.player_sub_title.clearfix').text(),
106 + most: mostList,
107 + comparison_WinRate: indicatorInfo.eq(0).find('div.progress.left div.text').text()
108 + .concat(" ", indicatorInfo.eq(0).find('div.progress.right div.text').text()),
109 + comparison_KDA: indicatorInfo.eq(1).find('div.progress.left div.text').text()
110 + .concat(" ", indicatorInfo.eq(1).find('div.progress.right div.text').text()),
111 + comparison_KP: indicatorInfo.eq(2).find('div.progress.left div.text').text()
112 + .concat(" ", indicatorInfo.eq(2).find('div.progress.right div.text').text())
113 + };
114 + //#endregion
115 +
116 + //#region 통산 전적
117 + var td = $('div.scriptorium').children('div.listTable').eq(1).find('table tbody tr').children();
118 +
119 + fakerData['fullCareer'] = {
120 + totalGamePlay: td.eq(0).text(),
121 + totalWin: td.eq(1).text(),
122 + totalLose: td.eq(2).text(),
123 + winRate: td.eq(3).text(),
124 + totalKill: td.eq(4).text(),
125 + totalDeath: td.eq(5).text(),
126 + totalAssist: td.eq(6).text(),
127 + killPerMatch: td.eq(7).text(),
128 + deathPerMatch: td.eq(8).text(),
129 + assistPerMatch: td.eq(9).text(),
130 + kDA: td.eq(10).text(),
131 + kP: td.eq(11).text()
132 + }
133 + //#endregion
51 134
52 - var playerName = $('div#lolMain h2.block.name').text().split(' '); 135 + //#region 대회 별 전적
53 - fakerData['name'] = playerName[playerName.length - 1]; 136 + var tr = $('div.scriptorium').children('div.listTable').eq(3).find('table tbody').children();
137 + var competitionData = {};
54 138
55 - //#region LCK 통산 전적 139 + tr.each(function (i, elem) {
56 - var tr = $('table.table.log_list.log01 tbody').children(); 140 + var td = $(this).children();
57 - var td = tr.eq(0).children(); 141 + var competitionName = td.eq(0).text().replace(td.eq(0).find('span').text(), '');
58 142
59 - fakerData['lCK'] = { 143 + competitionData[competitionName] = {
144 + name: competitionName,
60 totalGamePlay: td.eq(1).text(), 145 totalGamePlay: td.eq(1).text(),
61 totalWin: td.eq(2).text(), 146 totalWin: td.eq(2).text(),
62 totalLose: td.eq(3).text(), 147 totalLose: td.eq(3).text(),
63 winRate: td.eq(4).text(), 148 winRate: td.eq(4).text(),
64 - killPerMatch: td.eq(5).text(), 149 + totalKill: td.eq(5).text(),
65 - deathPerMatch: td.eq(6).text(), 150 + totalDeath: td.eq(6).text(),
66 - assistPerMatch: td.eq(7).text(), 151 + totalAssist: td.eq(7).text(),
67 - kDA: td.eq(8).text(), 152 + killPerMatch: td.eq(8).text(),
68 - kP: td.eq(9).text() 153 + deathPerMatch: td.eq(9).text(),
69 - }; 154 + assistPerMatch: td.eq(10).text(),
70 - //#endregion 155 + kDA: td.eq(11).text(),
71 - 156 + kP: td.eq(12).text()
72 - //#region 최근 LCK 기록
73 - var recentLCKInfo = $('div.block.scriptorium_box.scriptorium_player_info').children().eq(2);
74 - var mostInfo = recentLCKInfo.find('div.left ul.block.list').children();
75 - var mostList = [];
76 - var indicatorInfo = recentLCKInfo.find('div.right ul.block.bottom.clearfix').children();
77 -
78 - mostInfo.each(function (i, elem) {
79 - mostList[i] = {
80 - champion: $(this).find('div.name_area p.value b').text(),
81 - played: $(this).find('div.play_area p.value').text(),
82 - record: $(this).find('div.log_area p.value').text(),
83 - kDA: $(this).find('div.kda_area p.value').text()
84 - };
85 - });
86 -
87 - fakerData['recentLCK'] = {
88 - name: recentLCKInfo.find('h3.block.player_sub_title.clearfix').text(),
89 - most: mostList,
90 - comparison_WinRate: indicatorInfo.eq(0).find('div.progress.left div.text').text()
91 - .concat(" ", indicatorInfo.eq(0).find('div.progress.right div.text').text()),
92 - comparison_KDA: indicatorInfo.eq(1).find('div.progress.left div.text').text()
93 - .concat(" ", indicatorInfo.eq(1).find('div.progress.right div.text').text()),
94 - comparison_KP: indicatorInfo.eq(2).find('div.progress.left div.text').text()
95 - .concat(" ", indicatorInfo.eq(2).find('div.progress.right div.text').text())
96 }; 157 };
97 - //#endregion 158 + });
98 - 159 +
99 - //#region 통산 전적 160 + fakerData['competitions'] = competitionData;
100 - var td = $('div.scriptorium').children('div.listTable').eq(1).find('table tbody tr').children(); 161 + //#endregion
101 - 162 +
102 - fakerData['fullCareer'] = { 163 + //#region 챔피언 별 전적
103 - totalGamePlay: td.eq(0).text(), 164 + var tr = $('div.scriptorium').children('div.listTable').eq(4).find('table tbody').children();
104 - totalWin: td.eq(1).text(), 165 + var championData = {};
105 - totalLose: td.eq(2).text(), 166 +
106 - winRate: td.eq(3).text(), 167 + tr.each(function (i, elem) {
107 - totalKill: td.eq(4).text(), 168 + var td = $(this).children();
108 - totalDeath: td.eq(5).text(), 169 + var championName = td.eq(0).text();
109 - totalAssist: td.eq(6).text(), 170 +
110 - killPerMatch: td.eq(7).text(), 171 + championData[championName] = {
111 - deathPerMatch: td.eq(8).text(), 172 + name: championName,
112 - assistPerMatch: td.eq(9).text(), 173 + totalGamePlay: td.eq(1).text(),
113 - kDA: td.eq(10).text(), 174 + totalWin: td.eq(2).text(),
114 - kP: td.eq(11).text() 175 + totalLose: td.eq(3).text(),
176 + winRate: td.eq(4).text(),
177 + totalKill: td.eq(5).text(),
178 + totalDeath: td.eq(6).text(),
179 + totalAssist: td.eq(7).text(),
180 + killPerMatch: td.eq(8).text(),
181 + deathPerMatch: td.eq(9).text(),
182 + assistPerMatch: td.eq(10).text(),
183 + kDA: td.eq(11).text(),
184 + kP: td.eq(12).text()
115 } 185 }
116 - //#endregion 186 + });
117 - 187 +
118 - //#region 대회 별 전적 188 + fakerData['champions'] = championData;
119 - var tr = $('div.scriptorium').children('div.listTable').eq(3).find('table tbody').children(); 189 + //#endregion
120 - var competitionData = {}; 190 +
121 - 191 + console.log(fakerData);
122 - tr.each(function (i,elem) { 192 + fs.writeFileSync(dataFileName, JSON.stringify(fakerData));
123 - var td = $(this).children(); 193 +
124 - var competitionName = td.eq(0).text().replace(td.eq(0).find('span').text(), ''); 194 + return new Promise(function (resolve, reject) {
125 - 195 + resolve();
126 - competitionData[competitionName] = {
127 - name: competitionName,
128 - totalGamePlay: td.eq(1).text(),
129 - totalWin: td.eq(2).text(),
130 - totalLose: td.eq(3).text(),
131 - winRate: td.eq(4).text(),
132 - totalKill: td.eq(5).text(),
133 - totalDeath: td.eq(6).text(),
134 - totalAssist: td.eq(7).text(),
135 - killPerMatch: td.eq(8).text(),
136 - deathPerMatch: td.eq(9).text(),
137 - assistPerMatch: td.eq(10).text(),
138 - kDA: td.eq(11).text(),
139 - kP: td.eq(12).text()
140 - };
141 - });
142 -
143 - fakerData['competitions'] = competitionData;
144 - //#endregion
145 -
146 - //#region 챔피언 별 전적
147 - var tr = $('div.scriptorium').children('div.listTable').eq(4).find('table tbody').children();
148 - var championData = {};
149 -
150 - tr.each(function (i, elem) {
151 - var td = $(this).children();
152 - var championName = td.eq(0).text();
153 -
154 - championData[championName] = {
155 - name: championName,
156 - totalGamePlay: td.eq(1).text(),
157 - totalWin: td.eq(2).text(),
158 - totalLose: td.eq(3).text(),
159 - winRate: td.eq(4).text(),
160 - totalKill: td.eq(5).text(),
161 - totalDeath: td.eq(6).text(),
162 - totalAssist: td.eq(7).text(),
163 - killPerMatch: td.eq(8).text(),
164 - deathPerMatch: td.eq(9).text(),
165 - assistPerMatch: td.eq(10).text(),
166 - kDA: td.eq(11).text(),
167 - kP: td.eq(12).text()
168 - }
169 - });
170 -
171 - fakerData['champions'] = championData;
172 - //#endregion
173 -
174 - return fakerData;
175 - })
176 - .then(res => {
177 - console.log(res)
178 - fs.writeFileSync('data.json', JSON.stringify(res));
179 }); 196 });
180 } 197 }
181 198
...@@ -184,6 +201,4 @@ app.get('/', (req, res) => { ...@@ -184,6 +201,4 @@ app.get('/', (req, res) => {
184 res.send('Express Test'); 201 res.send('Express Test');
185 }); 202 });
186 203
187 -app.listen(port, () => console.log(`app listening at http://localhost:${port}`));
188 -
189 -checkData();
...\ No newline at end of file ...\ No newline at end of file
204 +app.listen(port, () => console.log(`app listening at http://localhost:${port}`));
...\ No newline at end of file ...\ No newline at end of file
......