🚀 深入解析:如何用JavaScript抓取LeetCode竞赛排名数据
在编程社区中,LeetCode竞赛一直是衡量程序员算法能力的重要标尺。通过参与竞赛,不仅可以锻炼自己的编程技巧,还能和全球顶尖程序员一较高下。然而,我们多数情况只希望看到自己所使用语言的题解,希望从某个特定角度(比如编程语言)来分析竞赛数据,这就需要我们进行一些数据抓取工作。今天,我将向大家展示如何使用JavaScript来抓取LeetCode竞赛的排名数据,并筛选出特定编程语言的用户排名。
🔍 需求分析
首先,我们需要明确目标:
- 获取指定竞赛的排名数据:LeetCode提供了每周竞赛的排名API,我们可以根据竞赛编号来获取数据。
- 筛选特定编程语言的用户:在获取到排名数据后,我们需要筛选出使用特定编程语言(如JavaScript)的用户。
- 分页处理:由于排名数据可能非常庞大,API通常会进行分页处理,我们需要循环请求每一页的数据。
📝 代码实现
下面,我将逐步展示如何使用JavaScript来实现上述需求。
1. 引入必要的库
在这个项目中,我们主要使用原生的JavaScript和fetch API来发送HTTP请求。确保你的环境支持fetch(现代浏览器和Node.js环境都支持)。
2. 定义函数
我们定义一个异步函数getJsUsersRank,它接受四个参数:竞赛编号、编程语言、区域和最大页数。
async function getJsUsersRank(
competitionNum = 422,
lang = "javascript",
region = "local_v2",
maxPage = 99
) {
// ...(代码见下文)
}
3. 初始化变量
我们初始化一个空数组allJsUsers来存储筛选后的用户数据。
let allJsUsers = [];
4. 循环请求分页数据
我们使用一个for循环来遍历每一页的数据,并构建请求URL。
for (let pagination = 1; pagination <= maxPage; pagination++) {
const url = `https://leetcode.cn/contest/api/ranking/weekly-contest-${competitionNum}/?pagination=${pagination}®ion=${region}`;
// ...(代码见下文)
}
5. 发送请求并处理响应
在循环内部,我们使用fetch发送HTTP GET请求,并解析JSON响应。
try {
const response = await fetch(url);
const data = await response.json();
const ranks = data.total_rank;
// ...(代码见下文)
} catch (error) {
console.error(`Error fetching data for pagination ${pagination}:`, error);
}
6. 筛选特定编程语言的用户
我们遍历排名数据,筛选出使用指定编程语言的用户,并将其添加到allJsUsers数组中。
const jsUsers = ranks.filter((rank) => {
return Object.values(rank.submissions).some(
(submission) => submission.lang === lang
);
});
jsUsers.forEach((user) => {
allJsUsers.push({
username: user.username,
rank: user.rank,
score: user.score,
});
});
7. 输出结果
最后,我们输出筛选后的用户数据。
console.log(`Total JS Users Found: ${allJsUsers.length}`);
allJsUsers.forEach((user) => {
console.log(`User: ${user.username}, Rank: ${user.rank}, Score: ${user.score}`);
});
🎉 完整代码
下面是完整的代码实现:
async function getJsUsersRank(
competitionNum = 422,
lang = "javascript",
region = "local_v2",
maxPage = 99
) {
let allJsUsers = [];
for (let pagination = 1; pagination <= maxPage; pagination++) {
const url = `https://leetcode.cn/contest/api/ranking/weekly-contest-${competitionNum}/?pagination=${pagination}®ion=${region}`;
try {
const response = await fetch(url);
const data = await response.json();
const ranks = data.total_rank;
const jsUsers = ranks.filter((rank) => {
return Object.values(rank.submissions).some(
(submission) => submission.lang === lang
);
});
jsUsers.forEach((user) => {
allJsUsers.push({
username: user.username,
rank: user.rank,
score: user.score,
});
});
console.log(`Processed pagination ${pagination}`);
} catch (error) {
console.error(`Error fetching data for pagination ${pagination}:`, error);
}
}
console.log(`Total JS Users Found: ${allJsUsers.length}`);
allJsUsers.forEach((user) => {
console.log(
`User: ${user.username}, Rank: ${user.rank}, Score: ${user.score}`
);
});
}
getJsUsersRank();
💡 注意事项
- API限制:请确保你遵守LeetCode的API使用条款,不要进行过于频繁的请求,以免对服务器造成负担。
- 错误处理:在实际应用中,你可能需要更完善的错误处理机制,比如重试逻辑或降级处理。
- 数据隐私:尊重用户的数据隐私,不要滥用抓取到的数据。
🚀 结语
通过本文,我们学习了如何使用JavaScript抓取LeetCode竞赛的排名数据,并筛选出特定编程语言的用户排名。这个技能不仅可以帮助我们深入了解竞赛数据,还能激发我们对编程和数据科学的兴趣。希望这篇文章对你有所帮助,祝你编程愉快!