【第三方掘金功能】掘金我的数据统计,第三方实现的掘金用户 dashboard

查询入口 lxfriday.gitee.io/juejin-spid…前端

项目地址 juejin-spider,欢迎 star、issue。git

先上图,通过一段时间的数据积累,掘金的用户 dashboard 如今能够开放使用了。这个功能是一个比较重要可是掘金目前尚未提供的功能。github

dashboard 目前提供的功能有 历史点赞数、历史 follower、历史评论数 三个图web

使用指南

查询

在上面的搜索框输入用户主页的 url,点击搜索,喝一口下午茶,等待增加(因为使用的是 码云 pages 服务,可能会有访问速度和访问总次数限制)。算法

图表

三个图分别为:关注者增加趋势总点赞数增加趋势总评论数增加趋势。最多会显示最近一周的数据,目前数据已经采集了6天,明天以后就能够查看前7天的数据了。npm

关注者增加趋势 json

总点赞数增加趋势 promise

总评论数增加趋势 async

技术实现

前端

前端代码位于 juejin-spider/website,基于 umi 脚手架 实现的 dashboard,用到了 React、AntD、Dva。ide

可能不少人会有疑问。纯静态代码是如何提供数据的?

数据固然仍是来自 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…。如今在标签下写了专栏的用户,均可以看到本身的历史数据。


公众号:

相关文章
相关标签/搜索