Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
21
Help us understand the problem. What is going on with this article?

More than 1 year has passed since last update.

@zonbitamago

Qiitaいいね数ランキングAPIの作成

TL;DR

QiitaAPIGoogle Apps ScriptGlitchFirebaseを利用して、Qiitaいいね数ランキングAPIを作成しました。
ご活用ください!

https://us-central1-qiita-trend-web-scraping.cloudfunctions.net/qiitaScraiping/{type}/{YYYY-MM-DD}

{type}

  • daily・・・日別ランキング
  • weekly・・・週別ランキング

{YYYY-MM-DD}

ランキング登録日。
※2018/9/23以降が取得可能。

e.g.)
{
  "data": [
    {
      "updated_at": "2018-09-19T12:29:34+09:00",
      "url": "https://qiita.com/mikan3rd/items/ba4737023f08bb2ca161",
      "user": {
        "items_count": 24,
        "name": "",
        "followees_count": 19,
        "id": "mikan3rd",
        "website_url": "https://www.wantedly.com/users/809162",
        "github_login_name": "mikan3rd",
        "profile_image_url": "https://avatars2.githubusercontent.com/u/27764298?v=3",
        "followers_count": 71,
        "location": "Tokyo",
        "twitter_screen_name": "mikan_the_third",
        "organization": "",
        "permanent_id": 178077,
        "facebook_id": "",
        "linkedin_id": "",
        "description": "文系から転職したエンジニア2年生。\r\nReactとPythonがちょっと書ける"
      },
      "id": "ba4737023f08bb2ca161",
      "tags": [
        {
          "versions": [],
          "name": "Python"
        },
        {
          "name": "Instagram",
          "versions": []
        },
        {
          "name": "GoogleCloudPlatform",
          "versions": []
        }
      ],
      "created_at": "2018-09-17T21:12:27+09:00",
      "title": "[2018] 個人でも使える!おすすめAPI一覧",
      "likes_count": 1209
    },
    {
      "url": "https://qiita.com/tkrkt/items/2fc9a9a59ce679aab728",
      "user": {
        "facebook_id": "",
        "linkedin_id": "",
        "description": "趣味エンジニアです。",
        "items_count": 15,
        "name": "",
        "followees_count": 4,
        "id": "tkrkt",
        "website_url": "",
        "github_login_name": "tkrkt",
        "profile_image_url": "https://qiita-image-store.s3.amazonaws.com/0/60243/profile-images/1473695175",
        "followers_count": 34,
        "location": "",
        "twitter_screen_name": null,
        "organization": "",
        "permanent_id": 60243
      },
      "id": "2fc9a9a59ce679aab728",
      "tags": [
        {
          "versions": [],
          "name": "コメント"
        },
        {
          "name": "VSCode",
          "versions": []
        }
      ],
      "created_at": "2018-09-20T21:19:45+09:00",
      "title": "なぜ我々はいまだに文字列でコメントを書いているのか",
      "likes_count": 909,
      "updated_at": "2018-09-21T18:34:38+09:00"
    },
    {"以下略"}
  ]
}

はじめに

情報収集するにあたっていつもこの記事を読んでいます。お世話になってます!
【毎日自動更新】Qiitaのデイリーストックランキング!ウィークリーもあるよ

記事を読んでいるうちにふと考えました。これはどうやってランキングを作ってるんだ??
なので、学習も兼ねて車輪の再発明を行うことにしました。
(参考:「車輪の再発明」を否定するのは間違っているかもしれない)

目標

今回はとりあえず以下を目標とします。

  • 無料サービスのみ利用する
  • ランキングが自動更新される
  • (せっかくなので)WebAPI化

QiitaAPI

何はともあれ、Qiitaのデータを集計し、ランキングを作成しなければいけません。Qiitaの全てのページを確認するのは現実的ではありませんのでQiitaAPIをスクレイピングすることとします。
特定の日付で作成された記事の一覧を取得し、いいね数で並べ替え、ランキングデータを構築します。

GoogleAppsScript

QiitaAPIをスクレイピングしランキングを自動更新する必要があるので、ジョブスケジューラの用に自動で起動する物が必要です。無料で利用でき、cronのように動かせるものを探したところ、Google Apps Scriptと出会いました。
こちらを活用し、とりあえずランキングデータは2時間置きに更新することとします。

Firebase

とりあえず無料で何かを作るのであればFirebaseが楽です。
そのうち、今回は以下が利用しやすそうです。

ここまでの情報を組み合わせると、以下のような構成となります。
scraiping-flow_1.png

ただし、ここでCloudFunconsの無料枠ではGoogle以外のサービスにリクエストを投げることができないという題点が発生しました。

Glitch

上記の問題点を解消するために、Glitchという無料のNode.jsサーバを活用します。
GlitchからQiitaAPIを呼び出し、データを整形した後にCloudFunctions経由でデータを登録します。

完成形

ここまでで全て無料サービスでシステムをまとめ上げることができました。
上記を全てまとめると、以下のようになります。
scraiping-flow.png
getAPI-flow.png

終わりに

無料のWebサービスのみの組み合わせでWebAPIが作成できました。
また、これを使ってQiita-Trend-PWAというサイトを作りました。
無料のサービスを組み合わせると割と何でもできます。

みなさんも無料サービスを是非ご活用ください!

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
21
Help us understand the problem. What is going on with this article?