-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathcurlleetcode.js
82 lines (70 loc) · 1.99 KB
/
curlleetcode.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
const LeetCodeProvider = require("./leetcodeprovider");
const Logger = require("./logger");
const Utils = require("./utils");
const {
RAW_MARKDOWN_OUTPUT_DIR,
REQUEST_RATE,
IS_FORCE_UPDATE_MODE,
MAX_CRAWL_RETRY_NUMBER,
} = require("./constants");
/**
* 当前请求问题索引
*/
let requsetNumber = 0;
let retryCounter = 0;
Utils.mkdirSync(RAW_MARKDOWN_OUTPUT_DIR);
const getProblemDetail = (questionsName, requsetNumber) => {
const cachedFilesName = Utils.getDirsFileNameSync(RAW_MARKDOWN_OUTPUT_DIR);
if (
!IS_FORCE_UPDATE_MODE &&
cachedFilesName.includes(questionsName[requsetNumber])
) {
Logger.success(`${questionsName[requsetNumber]}命中缓存, 跳过。。。`);
requsetNumber++;
getProblemDetail(questionsName, requsetNumber);
} else {
Logger.success(`开始抓取${questionsName[requsetNumber]}`);
questionsName[requsetNumber] &&
LeetCodeProvider.getProblemDetail(questionsName[requsetNumber]).then((
markDown,
) => {
if (markDown) {
retryCounter = 0;
// Logger.success(
// `问题: "${
// questionsName[requsetNumber]
// }" | 结果: ${JSON.stringify(markDown).slice(100)}...`
// );
Utils.writeFileSync(
RAW_MARKDOWN_OUTPUT_DIR,
questionsName[requsetNumber],
markDown,
);
requsetNumber++;
} else {
retryCounter++;
Logger.error(
`获取${questionsName[requsetNumber]} markdown 第${retryCounter}次 失败!`,
);
}
}).catch(Logger.error).then(() => {
if (retryCounter >= MAX_CRAWL_RETRY_NUMBER) {
Logger.error(
`抓取问题 "${questionsName[requsetNumber]}" 失败次数已达上限, 请调整抓取速率 REQUEST_RATE: ${REQUEST_RATE} 或稍后再试`,
);
process.exit(0);
} else {
setTimeout(
() => {
questionsName[requsetNumber] &&
getProblemDetail(questionsName, requsetNumber);
},
REQUEST_RATE,
);
}
});
}
};
LeetCodeProvider.getProblemsTitle().then((questionsName) => {
getProblemDetail(questionsName, requsetNumber);
});