查询入口 lxfriday.gitee.io/juejin-spid…
项目地址 juejin-spider,欢迎 star、issue。
先上图,经过一段时间的数据积累,掘金的用户 dashboard 现在可以开放使用了。这个功能是一个比较重要但是掘金目前还没有提供的功能。
dashboard 目前提供的功能有 历史点赞数、历史 follower、历史评论数 三个图
使用指南
查询
在上面的搜索框输入用户主页的 url,点击搜索,喝一口下午茶,等待增长(由于使用的是 码云 pages 服务,可能会有访问速度和访问总次数限制)。
图表
三个图分别为:关注者增长趋势、总点赞数增长趋势、总评论数增长趋势。最多会显示最近一周的数据,目前数据已经采集了6天,明天之后就可以查看前7天的数据了。
关注者增长趋势
总点赞数增长趋势
总评论数增长趋势
技术实现
前端
前端代码位于 juejin-spider/website,基于 umi 脚手架 实现的 dashboard,用到了 React、AntD、Dva。
可能很多人会有疑问。纯静态代码是如何提供数据的?
数据当然还是来自 juejin-spider 脚本,抓取到的数据,按照 uidfile 算法 uidfile,把用户id user.objectId
经过算法处理之后自动确定生成到哪个 json 文件,所以即使有 1.5w+ 作者信息,切分之后,每个文件大概会有 3000 个作者的信息,在传输和解析的时候就不会造成卡顿。
json 文件的规范
{
"5a66dff2f265da3e4f0a4f1b":[4966,4430,140], // ...
}
// 关注者,总点赞量,总评论量
// [user.objectId]: [followersCount, totalCollectionsCount, totalCommentsCount]
脚本文件
相比于第一个版本,新增了 npm run sitedata
,执行脚本如下
const request = require('request-promise')
const async = require('async')
const path = require('path')
const fs = require('fs')
const travelArticleData = require('../utils/travelArticleData')
const uidfile = require('../utils/uidfile')
const saveDataTofile = require('../utils/saveDataTofile')
const { websitedataDir } = require('../utils/path')
const allUserObj = {}
let userCount = 0
const idSet = new Set()
travelArticleData(articleInfo => {
const {
user: {
followersCount,
totalCollectionsCount,
totalCommentsCount,
objectId,
},
} = articleInfo
if (!idSet.has(objectId) && objectId) {
// 去重
idSet.add(objectId)
// 统计在标签下发表了专栏的用户总数
userCount++
const filename = uidfile(objectId)
if (allUserObj[filename]) {
allUserObj[filename][objectId] = [
followersCount,
totalCollectionsCount,
totalCommentsCount,
]
} else {
allUserObj[filename] = {
// 关注者,总点赞量,总评论量
// [followersCount, totalCollectionsCount, totalCommentsCount]
[objectId]: [followersCount, totalCollectionsCount, totalCommentsCount],
}
}
}
})
;(async () => {
const { sysTime1 } = await request('http://quan.suning.com/getSysTime.do', {
json: true,
})
//获取当天的日期
const yearDate = sysTime1.substr(0, 8) // 20190825
const yearDateDirPath = path.resolve(websitedataDir, yearDate)
// 创建日期命名的文件夹
const yearDateDirExist = fs.existsSync(yearDateDirPath)
if (!yearDateDirExist) {
fs.mkdirSync(yearDateDirPath)
}
// 写入用户总数
saveDataTofile(
`../../website/public/data/${yearDate}`,
`userCount.txt`,
userCount,
false
)
const filenameArr = Object.keys(allUserObj)
async.eachLimit(
filenameArr,
1,
(filename, cb) => {
// 把每个 number.json 对应的数据写入,总共写 50 次
saveDataTofile(
// 自动保存到 web 项目 `public/data` 下,经过 `npm run build` 自动复制到 `/dist` 目录
`../../website/public/data/${yearDate}`,
`${filename}`,
allUserObj[filename]
)
cb()
},
err => {
if (err) throw err
console.log('getData finished')
}
)
})()
这就是掘金个人数据统计功能实现的过程,具体实现代码前往 github.com/lxfriday/ju…。现在在标签下写了专栏的用户,都可以看到自己的历史数据。
公众号: