Топ 5000 Nuggets | Рейтинг статей Nuggets Нажмите здесь

JavaScript Сообщество самородков

В статье рассказывается, как собирать данные на веб-сайте Nuggets, анализировать данные и, наконец, формировать отсортированный рейтинг.

0821 Обновление:Топ 5000 наггетсов с общим количеством лайков | Топ 5000 наггетов с общим вниманием (20190821)

0827 Обновление:[Сторонняя функция Nuggets] Статистика личных данных Nuggets, панель управления пользователя Nuggets, реализованная третьей стороной

Причина проекта в том, что мне вдруг захотелось посмотреть, какие качественные авторы есть на Nuggets. Чтобы не пропустить каждого крупного парня, я решил напрямую собрать всю информацию о статьях на сайте, чтобы найти авторов и ранжировать их. . Всеобщее внимание + чтение статьи, единая прогулка!

Адрес проекта juejin-spiderДобро пожаловать в выпуск звезд

Паук Nuggets и анализ данных, в основном сосредоточены на следующих рейтингах и статистике, нажмите, чтобы просмотреть рейтинги напрямую

Сначала зайдите в топ-50 наггетсов, обратите внимание на волну? ? ? ? Топ 5000 рейтинга здесь

🎉 Рейтинг, 👦 Подписчики, 🏠 Компания

сценарий

Захват тегов по всему сайту

Получите все данные тега в станции Nuggets

npm run tagList

будет записывать информацию тега вsrc/assets/tagList/tagList.json, каждая этикетка содержит следующую информацию, в основномtitleиid

{
  "id": "5597a063e4b08a686ce57030",
  "title": "后端",
  "createdAt": "2015-07-04T00:59:16Z",
  "updatedAt": "2017-06-18T23:34:00Z",
  "color": "#C679FF",
  "icon": "https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/leancloud-assets/d83da9d012ddb7ae85f4.png~tplv-t2oaga2asx-image.image",
  "background": "",
  "showOnNav": true,
  "relationTagId": "",
  "alias": "backend houduan",
  "isCategory": true,
  "entryCount": 19840,
  "subscribersCount": 295562,
  "isSubscribe": false
},

Сканирование статей со всего сайта

Будут собраны все статьи по всем тегам всего сайта.Процесс сбора зависит от скорости сети и производительности машины.Пожалуйста, терпеливо дождитесь завершения сбора.

Данные, собранные на этом этапе, очень важны и являются основой для всех последующих анализов.

Собранные файлы будут храниться вsrc/assets/articleDataНиже содержится много файлов json, каждый файл содержит всю метаинформацию статьи столбца под этим тегом.

npm run allTagData

каждый объект в массиве

{
  "collectionCount": 5, // 点赞数
  "userRankIndex": 5.4006856695164,
  "buildTime": 1565582852.8327,
  "commentsCount": 2, // 评论数
  "gfw": false,
  "objectId": "5d40d29d518825221b4cbb40",
  "checkStatus": true,
  "isEvent": false,
  "entryView": "",
  "subscribersCount": 0, // 无用
  "ngxCachedTime": 1565627197,
  "verifyStatus": true,
  "tags": [
    {
      "ngxCachedTime": 1565627193,
      "ngxCached": true,
      "title": "React.js",
      "id": "555e99ffe4b00c57d99556aa"
    }
  ],
  "updatedAt": "2019-08-12T04:07:32.818Z",
  "rankIndex": 0.005346156248974,
  "hot": false,
  "autoPass": false,
  "originalUrl": "https://juejin.cn/post/6844903903058739213", // 文章的 url
  "verifyCreatedAt": "2019-07-31T01:36:14.238Z",
  "createdAt": "2019-07-31T01:36:14.238Z",
  "user": {
    "community": {
      "weibo": { "uid": "5345591282", "nickname": "岁月痕迹A88" },
      "wechat": {
        "avatarLarge": "http://thirdwx.qlogo.cn/mmopen/vi_32/cabLXAUXiavVhiaDh2050AOOEToUvnZTWsSNqqKZC4hzPzHABC7fxwv6VxwebIxfKdaRkYDZoic8UXfonLDyiafuiaw/132"
      },
      "github": {
        "username": "lxfriday",
        "avatarLarge": "https://avatars0.githubusercontent.com/u/20264467?v=4",
        "uid": "20264467"
      }
    },
    "collectedEntriesCount": 154, // 点赞数
    "company": "xxx", // 公司
    "followersCount": 35, // 被关注数
    "followeesCount": 70, // 关注数
    "role": "guest", // 用户角色
    "postedPostsCount": 19, // 发布的专栏数
    "level": 2, // 用户等级
    "isAuthor": false,
    "postedEntriesCount": 2, // 分享数?
    "totalCommentsCount": 16, // 总评论数
    "ngxCachedTime": 1565627197,
    "viewedEntriesCount": 1347, // 查看的文章数
    "jobTitle": "前端", // 工作:前端
    "subscribedTagsCount": 166, // 关注的标签数
    "totalCollectionsCount": 120, // 总收藏数
    "username": "云影sky", // 用户名
    "avatarLarge": "https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2019/7/14/16bf1155693d96c2~tplv-t2oaga2asx-image.image",
    "objectId": "57a0c28979bc440054958498" // 用户 id
  },
  "author": "",
  "screenshot": "https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2019/7/29/16c3e3d979a96831~tplv-t2oaga2asx-image.image",
  "original": true,
  "hotIndex": 21.2095,
  "content": "给 PureComponent 重新指向构造函数之后,_assign 复制对象属性时, Component 构造函数不会覆盖 PureComponent 构造函数,看下面的例子就明白了。 把 PureComponent 变成 Component,userInfo 可正常变化。",
  "title": "React 源码系列-Component、PureComponent、function Component 分析",
  "lastCommentTime": "2019-08-03T16:53:20.577Z",
  "type": "post",
  "english": false,
  "category": {
    "ngxCached": true,
    "title": "frontend",
    "id": "5562b415e4b00c57d9b94ac8",
    "name": "前端",
    "ngxCachedTime": 1565627098
  },
  "viewsCount": 267, // 浏览量
  "summaryInfo": "经过 处理之后,三个组件的区别就是 type 不一样了 和 看不懂可以看下这篇文章 https://www.zhihu.com/question/34183746 js 中 和 的区别和关系 函数的 属性对象上的 是不可枚举的,所以下面两句 给 PureComponent 重新指向构造函数之后, ...",
  "isCollected": false
}

Следите за рейтингом

Получить просмотры сайта

npm run follower

При выполнении скрипта будут сгенерированы два файла

  • src/assets/calcUserRank/用户followerRank.jsonметаинформация после ранжирования
  • src/assets/calcUserRank/用户followerRank.mdmd документация по ранжированию

Нравится рейтинг

Получить рейтинг лайков на сайте

npm run dianzan

При выполнении скрипта будут сгенерированы два файла

  • src/assets/calcDianzanRank/点赞rank.jsonметаинформация после ранжирования
  • src/assets/calcDianzanRank/点赞rank.mdmd документация по ранжированию

пример

Рейтинг просмотров страниц статей по всему сайту

Получить просмотры сайта

npm run view

При выполнении скрипта будут сгенерированы два файла

  • src/assets/calcViewRank/浏览量rank.json.jsonметаинформация после ранжирования
  • src/assets/calcViewRank/浏览量rank.json.mdmd документация по ранжированию

Количество комментариев к статье Total Station

Получить просмотры сайта

npm run comment

При выполнении скрипта будут сгенерированы два файла

  • src/assets/calcCommentRank/calcCommentRank.jsonметаинформация после ранжирования
  • src/assets/calcCommentRank/calcCommentRank.mdmd документация по ранжированию

Технический анализ

  • asyncуправление параллелизмом
  • chalkкрасочная командная строка
  • requestотправить http-запрос
  • request-promiseСделайте запрос обещанным, чтобы упростить использование асинхронности

Помощник разработчика инструмента Project Assistant

  • commitlintСтандартное сообщение фиксации
  • eslintВсе знают
  • prettierАвтоматически форматировать код
  • huskyПредоставьте git-хуки
  • lint-stagedВыполняйте форматирование и проверку eslint только для измененных в данный момент файлов.
  • jestПроверить правильность алгоритма сортировки

Как рассчитываются топ-1000 и топ-5000 по 20 ваттам данных

Создайте небольшую верхнюю кучу, непрерывно добавляйте данные в кучу, отбрасывайте те, которые меньше вершины кучи, замените те, которые больше вершины кучи, на вершину кучи и настраивайте двоичное дерево для поддержания маленькой верхней кучи. . После обхода всех данных небольшая верхняя куча представляет собой ранжирование всех максимальных значений, которые мы хотим, а затем сортировка этого массива по порядку может получить ранжирование! ! !


// 最小值上浮
function heapify(arr, len, i, compareVal) {
  let min = i
  const l = 2 * i + 1
  const r = 2 * i + 2

  if (l < len && compareVal(arr[l]) < compareVal(arr[min])) min = l
  if (r < len && compareVal(arr[r]) < compareVal(arr[min])) min = r

  if (min !== i) {
    swap(arr, i, min)

    heapify(arr, len, min, compareVal)
  }
}

/**
 * 对 target 建堆
 * @param {array} target 堆数组
 * @param {*} compareVal 从 dataUnit 对象获取比对值
 */
function createHeap(target, compareVal = v => v) {
  for (let i = Math.floor((target.length - 1) / 2); i >= 0; i--) {
    heapify(target, target.length, i, compareVal)
  }
}

function findMaxPrev(dataUnit, target, compareVal = v => v) {
  if (compareVal(dataUnit) > compareVal(target[0])) {
    target[0] = dataUnit
    heapify(target, target.length, 0, compareVal)
  }
}

ранжирование

рейтинг просмотров страниц

👀 просмотры, 📌 теги

Рейтинг лайков

👍 Лайки, 📌 Метки

'掘金' === '前端社区' ????

Рейтинг комментариев

🐶 комментарии, 📌 теги

На этом все для анализа, также я посчитал общее количество статей в Наггетс и общее количество пользователей, опубликовавших статьи под лейблом

  • Общее количество статей в станции Nuggets после дедупликации: около 10w, возможна большая ошибка в статистике, до дедупликации 20+w
  • Общее количество пользователей, публикующих статьи под лейблом: около 1.5w

Ознакомьтесь со сценариями npm и начните играть

npm run allВесь процесс именования и сбора данных анализа в одной строке завершен.Объем данных, обрабатываемых во всем процессе, относительно велик, что занимает около получаса.

"scripts": {
    "all": "npm run tagList && npm run allTagData && npm run dianzan && npm run view && npm run comment && npm run follower",
    "start": "npm run tagList",
    "tagList": "TASK=tagList node App.js",
    "allTagData": "TASK=allTagData node App.js",
    "composeArticleData": "TASK=composeArticleData node App.js",
    "userData": "TASK=userData node App.js",
    "dianzan": "TASK=dianzan node App.js",
    "view": "TASK=view node App.js",
    "comment": "TASK=comment node App.js",
    "follower": "TASK=follower node App.js",
    "lint": "eslint .",
    "test": "jest"
},

Наконец, приглашаю всех обратить внимание на мои публичные аккаунты на github и WeChat.

  • GitHub
  • Публичный аккаунт WeChat