Skip to content

dodonki1223/qiita_trend

Repository files navigation

QiitaTrend

Gem Version MIT License CircleCI

Qiitaのトレンドを10秒で取得することができます

01_qiita_trend

概要

  • QiitaのTOPページをスクレイピングしTOPページに表示されているトレンドを取得します
    • QiitaのAPIにトレンドを取得する方法がないため
  • トレンドは「通常のもの(通常トレンド)」と「ログインした時に表示されるユーザーのトレンド(ユーザートレンド)」のそれぞれを日付と更新時間(5時と17時)の組み合わせごとにキャッシュを行います
  • ユーザートレンドに関してはQiitaにログインしないと取得できないためユーザー名とパスワード設定する必要があります(通常トレンドに関しては何も設定しなくても取得できます)
  • 過去のトレンドを取得することができます(あくまでもキャッシュファイルから復元するためキャッシュファイルの無い過去のトレンドは取得することができません
  • いいね数は性質上取得した時の時間に依存します。どうしても現在時刻のいいね数が欲しい場合はキャシュファイルを手動で削除してもう一度実行してください

ドキュメント

RubyDoc.info

使用方法

gem install qiita_trendを実行する

$ gem install qiita_trend

Qiitaの通常トレンドを10秒で取得する

ターミナルでruby -r qiita_trend -e "pp QiitaTrend::Trend.new.items"を実行することでQiitaのトレンドを10秒(gem install qiita_trendも含めて)で取得できます

$ ruby -r qiita_trend -e "pp QiitaTrend::Trend.new.items"
[{"title"=>"2行でwebpack.config.jsで補完を効かせる方法",
  "user_name"=>"akameco",
  "user_image"=>
   "https://qiita-image-store.s3.amazonaws.com/0/15319/profile-images/1473684249",
  "user_page"=>"https://qiita.com/akameco",
  "article"=>"https://qiita.com/akameco/items/e12377e55e379d29636e",
  "published_at"=>"2019-08-05T01:17:34Z",
  "likes_count"=>158,
  "is_new_arrival"=>false},
 {"title"=>"Excelで誰でも簡単言語処理 (感情推定, 固有表現抽出, キーワード抽出,  文類似度推定 etc...)",
  "user_name"=>"Harusugi",
  "user_image"=>"https://avatars2.githubusercontent.com/u/19549989?v=4",
  "user_page"=>"https://qiita.com/Harusugi",
  "article"=>"https://qiita.com/Harusugi/items/535874c0456dbc4db231",
  "published_at"=>"2019-08-04T23:01:22Z",
  "likes_count"=>103,
  "is_new_arrival"=>false},
  ...

通常トレンドの簡易表示

index + タイトル名 + いいね数 + ユーザー名

$ ruby -r qiita_trend -e "QiitaTrend::Trend.new.items.each_with_index {|t, i| puts '[' + i.to_s + ']' + t['title'] + '(' + t['likes_count'].to_s + ')' + ' - ' + t['user_name']}"

[0]2行でwebpack.config.jsで補完を効かせる方法(158) - akameco
[1]Excelで誰でも簡単言語処理 (感情推定, 固有表現抽出, キーワード抽出,  文類似度推定 etc...)(103) - Harusugi
[2]コミュニケーション能力についてTwitterで打ち明けたら解決の糸口が見つかった話(109) - cyross4vocaloid
[3]畑に農作物を植えてみたけど、忙しくて毎日水やりにいけないのに日照り続きでどうしたものかと悩んでいたら、自動で散水する方法を思いついて試してみたという話(86) - mix_dvd
[4]KAGGLEでどこから手を付けていいか分からず学ぶことが多すぎてまとめてみた(89) - aokikenichi
[5]畳み込みニューラルネットワークは何を見ているか(69) - okn-yu

通常トレンドのタイトル一覧

$ ruby -r qiita_trend -e "QiitaTrend::Trend.new.items.each {|t| puts t['title']}"

2行でwebpack.config.jsで補完を効かせる方法
Excelで誰でも簡単言語処理 (感情推定, 固有表現抽出, キーワード抽出,  文類似度推定 etc...)
コミュニケーション能力についてTwitterで打ち明けたら解決の糸口が見つかった話
畑に農作物を植えてみたけど、忙しくて毎日水やりにいけないのに日照り続きでどうしたものかと悩んでいたら、自動で散水する方法を思いついて試してみたという話
KAGGLEでどこから手を付けていいか分からず学ぶことが多すぎてまとめてみた
畳み込みニューラルネットワークは何を見ているか

通常トレンドのうちnewがついているものをブラウザで一括で開く

$ ruby -r qiita_trend -e "QiitaTrend::Trend.new.new_items.each {|t| system('open ' + t['article'])}"

自分のプロジェクトで使用する

Gemfileにqiita_trendを追加する

gem 'qiita_trend'

Gemfileに追加したらbundle installしてください

通常トレンドを取得する

normal_trend = QiitaTrend::Trend.new

# 通常トレンドを全て取得する
p normal_trend.items

# 通常トレンドでNEWのものだけを取得する
p normal_trend.new_items

ユーザートレンドを取得する

ユーザートレンドを取得する時はQiitaにログインしている必要があるため、ログイン出来るユーザーとパスワードの設定が必要です ログインできないユーザー名とパスワードを指定している時はLoginFailureErrorの例外が発生します

# Qiitaにログインするためのユーザーとパスワードの設定をする
QiitaTrend.configure do |config|
  config.user_name = 'ユーザー名'
  config.password = 'パスワード'
end

# ユーザーのレンドを取得
personal_trend = QiitaTrend::Trend.new(QiitaTrend::TrendType::PERSONAL)
p personal_trend.items

ログインするユーザーとパスワードは環境変数に設定することもできます

export QIITA_TREND_USER_NAME='ユーザー名'
export QIITA_TREND_PASSWORD='パスワード'

キャッシュファイルからトレンドを取得する

キャッシュファイルが存在しない場合はNotExistsCacheErrorの例外が発生します ユーザートレンドの取得方法も通常トレンドと同様です

# 2019年8月8日5時更新分の通常トレンドを取得する
normal_trend_05 = QiitaTrend::Trend.new(QiitaTrend::TrendType::NORMAL, '2019080805')

p normal_trend_05.items
p normal_trend_05.new_items

# 2019年8月8日17時更新分のnormalのトレンドを取得する
normal_trend_17 = QiitaTrend::Trend.new(QiitaTrend::TrendType::NORMAL, '2019080817')

p normal_trend_17.items
p normal_trend_17.new_items

itemsメソッド、new_itemsメソッドについて

itemsメソッド、new_itemsメソッドはArrayを返します Array一つ一つはHashになります

irb(main):002:0> QiitaTrend::Trend.new.items.class
=> Array
irb(main):003:0> QiitaTrend::Trend.new.items[0].class
=> Hash

Hashは以下の構成になっています

irb(main):001:0> pp QiitaTrend::Trend.new.items[0]
{"title"=>"2行でwebpack.config.jsで補完を効かせる方法",
 "user_name"=>"akameco",
 "user_image"=>
  "https://qiita-image-store.s3.amazonaws.com/0/15319/profile-images/1473684249",
 "user_page"=>"https://qiita.com/akameco",
 "article"=>"https://qiita.com/akameco/items/e12377e55e379d29636e",
 "published_at"=>"2019-08-05T01:17:34Z",
 "likes_count"=>158,
 "is_new_arrival"=>false}
key 内容 備考
title 記事タイトル
user_name ユーザー名
user_image ユーザー画像URL
user_page ユーザーページ
article 記事のURL
published_at 記事作成日
likes_count いいね数 数値が入ります
is_new_arrival 「NEW」のついている記事か TrueかFalseが入ります。ログインした時に表示されるユーザーのトレンドに関してはnilになります

キャシュファイルの出力先を変更する

キャッシュファイルはデフォルトだとユーザーのHOMEディレクトリ/qiita_cache/に出力されます

/Users/dodonki1223/qiita_cache/2019080205_normal.html
/Users/dodonki1223/qiita_cache/2019080205_personal

プログラムで下記のように追記してください

# キャッシュの出力先ディレクトリを変更する
# ユーザーのHOMEディレクトリ配下のhogeディレクトリに出力する設定
# /Users/dodonki1223/hoge/
QiitaTrend.configure do |config|
  config.cache_directory = Dir.home + '/hoge/'
end

キャッシュファイルの出力先は環境変数に設定することもできます

QIITA_TREND_CACHE_DIR='/Users/dodonki1223/hoge/'

注意

このgemは勉強用で作成したものでソースにはアンチパターンなコメント(処理を説明するようなコメントなど)が書かれています。そこはご容赦ください