Qiita API v2を使用して人気のタグ情報を取得しrails DBに保存する方法

今回、QiitaのAPI v2を使用して人気の技術タグを取得し、railsのDBに保存していきます。こちらの画像のように人気のタグ上位100個をデータベースに保存していきます。タグの取得だけであれば認証不要でも問題ないそうです。ただし、1時間に60回以上APIを叩くと制限がかかるようなので気をつけてください。

参考URL

タグ用にモデルを作成

最初にタグを保存するためのモデルを作成していきます。SkillCategoryというモデル名にします。以下をコマンドで叩くとマイグレーションファイルが生成されます。技術タグ(Python,ruby)のカラムはNot NULLのuniqueで設定します。

rails g model SkillCategory tag_name:string 
icon_url:string followers_count:integer items_count:integer
class CreateSkillCategories < ActiveRecord::Migration[6.0]
  def change
    create_table :skill_categories do |t|
      t.string :tag_name, null: false, unique: true
      t.string :icon_url
      t.integer :followers_count
      t.integer :items_count

      t.timestamps
    end
  end
end

マイグレーションファイルを確認したら、rails db:migrateを実行。

rails db:migrate

schema.rbは以下のようになります。

schema.rb
create_table "skill_categories", force: :cascade do |t|
    t.string "tag_name", null: false
    t.string "icon_url"
    t.integer "followers_count"
    t.integer "items_count"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
  end

Qiita APIのタグ情報

/api/v2/tagsがタグ取得用のURIで以下の情報を取得できます。詳しくはQiita apiの公式ページをご確認ください。

  • followers_count
    • このタグをフォローしているユーザの数
    • Example: 100
    • Type: integer
  • icon_url
    • このタグに設定されたアイコン画像のURL
    • Example: "https://s3-ap-northeast-1.amazonaws.com/qiita-tag-image/9de6a11d330f5694820082438f88ccf4a1b289b2/medium.jpg"
    • Type: null, string
  • id
    • タグを特定するための一意な名前
    • Example: "qiita"
    • Type: string
  • items_count
    • このタグが付けられた記事の数
    • Example: 200
    • Type: integer
{"followers_count"=>128, "icon_url"=>"https://s3-ap-northeast-1.amazonaws.com/qiita-tag-image/33f7bc94654564c44e4d9f9a11513c27223a0db7/medium.jpg?1465429151", "id"=>"Microsoft", "items_count"=>593}
{"followers_count"=>300, "icon_url"=>"https://s3-ap-northeast-1.amazonaws.com/qiita-tag-image/20a2ec1b34c57bc5593a3a0b33520c713aa1b34b/medium.jpg?1479970375", "id"=>"ネットワーク", "items_count"=>589}
{"followers_count"=>203, "icon_url"=>"https://s3-ap-northeast-1.amazonaws.com/qiita-tag-image/43d617ffa96ca2d38a591bf12b7f689e9a0a3dfd/medium.jpg?1515775968", "id"=>"PHPUnit", "items_count"=>589}
{"followers_count"=>294, "icon_url"=>"https://s3-ap-northeast-1.amazonaws.com/qiita-tag-image/fcf5e589ece6308c73ee7a1155dfd1b0a8ea2436/medium.jpg?1438800208", "id"=>"関数型プログラミング", "items_count"=>588}
{"followers_count"=>355, "icon_url"=>"https://s3-ap-northeast-1.amazonaws.com/qiita-tag-image/6adc95ed7187649fc3fcc973ca4ca84e27bb8202/medium.jpg?1501235634", "id"=>"設計", "items_count"=>586}

seed.rbファイルを編集

seed.rbはデータベースに初期データを投入するためのコードを記述するファイルです。デフォルトのコメント部分を見ると例が書いてあります。今回、人気のタグ上位100個をデータベースに保存したいので、/api/v2/tagsをエンドポイントとして一番最初のページを取得するので変数pageに1を代入。取得する要素の数を100にしたいので変数PER_PAGEに100を代入。記事数が多い順にタグを取得したいのでsort=countとします。Net::HTTPは転送プロトコル HTTP を扱うライブラリで、今回はgetリクエストを使用します。JSON.parse()の引数にJSONデータを指定することで、オブジェクトデータに変換してくれます。parseをしたらfor文でループ、SkillCategory.create(この一文でQiita APIで取得したタグ情報をデータベースに保存してくれます。seed.rbファイルにコードを記述したらコマンドでrails db:seedを実行。

seed.rb
# This file should contain all the record creation needed to seed the database with its default values.
# The data can then be loaded with the rails db:seed command (or created alongside the database with db:setup).
#
# Examples:
#
#   movies = Movie.create([{ name: 'Star Wars' }, { name: 'Lord of the Rings' }])
#   Character.create(name: 'Luke', movie: movies.first)
PER_PAGE = "100"
page = "1"
url = "https://qiita.com/api/v2/tags?page=" + page + "&per_page=" + PER_PAGE + "&sort=count"
uri = URI.parse(url)
response = Net::HTTP.get(uri)
results = JSON.parse(response)
puts results
for result in results do
    SkillCategory.create(tag_name: result["id"],icon_url: result["icon_url"],followers_count: result["followers_count"],items_count: result["items_count"])
end      

rails consoleでタグ情報が保存されたか確認

実際のタグ情報がデータベースに保存されたかコンソールで確認します。SkillCategory.allを実行するとタグ情報の一覧を取得。これでデータベースのQiita APIを使用して取得したタグ情報をデータベースに保存できたことを確認しました。

rails c
SkillCategory.all
SkillCategory Load (3.2ms)  SELECT "skill_categories".* FROM "skill_categories" LIMIT $1  [["LIMIT", 11]]
=> #<ActiveRecord::Relation [#<SkillCategory id: 1, tag_name: "Python", icon_url: "https://s3-ap-northeast-1.amazonaws.com/qiita-tag-...", followers_count: 75656, items_count: 41142, created_at: "2020-05-17 07:09:38", updated_at: "2020-05-17 07:09:38">, #<SkillCategory id: 2, tag_name: "JavaScript", icon_url: "https://s3-ap-northeast-1.amazonaws.com/qiita-tag-...", followers_count: 74618, items_count: 33950, created_at: "2020-05-17 07:09:38", updated_at: "2020-05-17 07:09:38">, #<SkillCategory id: 3, tag_name: "Ruby", icon_url: "https://s3-ap-northeast-1.amazonaws.com/qiita-tag-...", followers_count: 41587, items_count: 27051, created_at: "2020-05-17 07:09:38", updated_at: "2020-05-17 07:09:38">, #<SkillCategory id: 4, tag_name: "Rails", icon_url: "https://s3-ap-northeast-1.amazonaws.com/qiita-tag-...", 

現在、nuxtとrailsで個人開発をしています。その過程で技術タグが必要になったので、Qiita APIを使用してみました。一年ぶりにrailsを触ると新しい発見が多い、おかげさまでおうち時間を満喫できています。

>文系エンジニア大学生の技術ブログ

文系エンジニア大学生の技術ブログ

社会が多様化していく中、大学生の学生生活も多様であるべきと考えています。主にエンジニア向けにITやプログラミングなどの技術系と大学生向けに休学、留学、海外生活、トビタテ留学、長期インターンに関する記事を書いています。