🚀 深入解析:如何用JavaScript抓取LeetCode竞赛排名数据

191 阅读3分钟

🚀 深入解析:如何用JavaScript抓取LeetCode竞赛排名数据

在编程社区中,LeetCode竞赛一直是衡量程序员算法能力的重要标尺。通过参与竞赛,不仅可以锻炼自己的编程技巧,还能和全球顶尖程序员一较高下。然而,我们多数情况只希望看到自己所使用语言的题解,希望从某个特定角度(比如编程语言)来分析竞赛数据,这就需要我们进行一些数据抓取工作。今天,我将向大家展示如何使用JavaScript来抓取LeetCode竞赛的排名数据,并筛选出特定编程语言的用户排名。

🔍 需求分析

首先,我们需要明确目标:

  1. 获取指定竞赛的排名数据:LeetCode提供了每周竞赛的排名API,我们可以根据竞赛编号来获取数据。
  2. 筛选特定编程语言的用户:在获取到排名数据后,我们需要筛选出使用特定编程语言(如JavaScript)的用户。
  3. 分页处理:由于排名数据可能非常庞大,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}&region=${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}&region=${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();

💡 注意事项

  1. API限制:请确保你遵守LeetCode的API使用条款,不要进行过于频繁的请求,以免对服务器造成负担。
  2. 错误处理:在实际应用中,你可能需要更完善的错误处理机制,比如重试逻辑或降级处理。
  3. 数据隐私:尊重用户的数据隐私,不要滥用抓取到的数据。

🚀 结语

通过本文,我们学习了如何使用JavaScript抓取LeetCode竞赛的排名数据,并筛选出特定编程语言的用户排名。这个技能不仅可以帮助我们深入了解竞赛数据,还能激发我们对编程和数据科学的兴趣。希望这篇文章对你有所帮助,祝你编程愉快!