趣闻 - 过去一周,程序员都在写什么语言?
一直以来我在使用一个叫wakatime的工具来记录每天的编码情况。
比如:
想要了解wakatime的, 自己去https://wakatime.com了解一下。
除了这个以外,wakatime还提供一个公开的排行榜,展示了最近七天用户的编码排名情况。
于是机会来了。
- 把这个排名的数据抓取下来,只要前40页
- 把每一个用户使用的语言列表、每个语言的时长记录统计起来
- 按语言归类, 看看哪个语言最近7天的使用时间最多。
第一步,数据爬下来,目标40页
我当然是不希望抓页面的,这样太没趣,更重要的是
人家有提供接口!!!
这下事情就简单多了,代码如下:
'use strict';
const request = require('request-agent').init();
const fs = require('fs');
(async () => {
let data = {};
for (let i = 0; i < 40; i++) {
data = await request
.method('get')
.url(`https://wakatime.com/api/v1/leaders?page=${i + 1}`)
.send();
fs.writeFileSync(`./waka_stat/${i + 1}.json`, data.body);
}
})().then((v) => {
console.log(v); process.exit(0);
}).catch((e) => {
console.log(e);
});
第二步,统计
你可能要问, 为什么不一遍请求接口一遍统计呢?
原因是这个接口速度有点蛋疼(翻墙好点), 先把数据拉下来, 这样我统计的部分调试也方便。
贴代码:
'use strict';
const fs = require('fs');
let result = {};
for (let i = 1; i <= 40; i++) {
let data = require(`./${i}.json`).data;
let len = data.length;
for (let k = 0; k < len; k++) {
let languages = data[k].running_total.languages;
for (let index in languages) {
result[languages[index].name] = result[languages[index].name] || 0;
result[languages[index].name] += languages[index].total_seconds;
}
}
}
let unsort = [];
for (let k in result) {
unsort.push({
name: k,
seconds: Number.parseInt(result[k] / 3600),
});
}
unsort.sort((a, b) => {
if (a.seconds > b.seconds) return -1;
return 1;
})
fs.writeFileSync('./waka_stat/result.json', JSON.stringify(unsort, null, 2));
结果
贴一部分:
[
{
"name": "JavaScript",
"hours": 15112
},
{
"name": "PHP",
"hours": 9366
},
{
"name": "Java",
"hours": 4164
},
{
"name": "TypeScript",
"hours": 3262
},
{
"name": "Python",
"seconds": 3119
},
{
"name": "HTML",
"hours": 3054
},
{
"name": "C#",
"hours": 2662
},
{
"name": "Ruby",
"hours": 1981
},
{
"name": "Vue.js",
"hours": 1698
}...