LoginSignup
1

More than 1 year has passed since last update.

QiitaAPIを使って指定タグの全記事リストを作る

Last updated at Posted at 2021-04-09

やりたいこと

気になったタグでのおすすめ記事がなかなか見つからないので、
特定タグでLGTMの多い記事を抽出できるようにする。

準備

linux上で、jqが使えること。

手順

例でタグは「新人プログラマ応援」としてます。
https://qiita.com/tags/%e6%96%b0%e4%ba%ba%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%9e%e5%bf%9c%e6%8f%b4?page=1

step0 タグの記事数を確認

上記リンクより、2021/4/9時点、2609件
QiitaAPIの仕様で100件が最大なので、取得処理が27回必要そう。

step1 ターミナル起動

step2 シェル起動

./get_tags.sh
get_tags.sh
#!/bin/zsh
# qiitaから対象タグの全記事一覧取得する
for (( i=1; i<=27 ;i++ ))
do
  ss="curl 'https://qiita.com/api/v2/tags/新人プログラマ応援/items?page=${i}&per_page=100' | jq '.[] | { likes_count: .likes_count, title: .title, url: .url}' >> tags_all.json"
  eval $ss
done 
# sort 降順
jq 'sort_by(.likes_count) | reverse' --slurp tags_all.json  > ranking_all.json
# end

step3 ファイルをみる

ranking_all.json
[
  {
    "likes_count": 9160,
    "title": "ロシアの天才ハッカーによる【新人エンジニアサバイバルガイド】",
    "url": "https://qiita.com/jacksuzuki/items/b2fa6b44962e73a53d08"
  },
  {
    "likes_count": 5731,
    "title": "AtCoder に登録したら次にやること ~ これだけ解けば十分闘える!過去問精選 10 問 ~",
    "url": "https://qiita.com/drken/items/fd4e5e3630d0f5859067"
  },
  {
    "likes_count": 4755,
    "title": "エンジニアの情報収集法まとめ",
    "url": "https://qiita.com/nesheep5/items/e7196ba496e59bb2aa28"
  },
 ...
  }
]

Appendix LGTMの件数でフィルターをしたいとき

LGTM>100以上でフィルタの例

jq '.[] | select(.likes_count > 100)' ranking_all.json  > ranking_over100.json

修正版シェルスクリプト

  1. 出力ファイル名にタグ名と日付(YYYY-MM-DDT形式)を追加
  2. 投稿記事数から取得するページ数計算を追加 (認証なしだと、1時間あたり60APIコールの制限にひっかかりやすくなってます_φ( ̄ー ̄ )
get_tags_v2.sh
#!/bin/zsh
# 出力ファイル名を設定
TAG_ID='新人プログラマ応援'
DATE_NOW=`date +%Y-%m-%dT`
TAGS_FILE="tags_${TAG_ID}_${DATE_NOW}.json"
RANKINGFILE="ranking_${TAG_ID}_${DATE_NOW}.json"
echo "TAGS_FILE=${TAGS_FILE}, RANKINGFILE=${RANKINGFILE}"

# qiitaから対象タグの記事数を取得する
curl "https://qiita.com/api/v2/tags/${TAG_ID}" | jq '.' > tags_detail.json
ITEM_COUNT=$(jq '. | .items_count'  tags_detail.json)
PAGE_COUNT=$(( $(( $ITEM_COUNT + 99 )) / 100 ))
echo "ITEM_COUNT=${ITEM_COUNT}, PAGE_COUNT=${PAGE_COUNT}"

# qiitaから対象タグの全記事一覧取得する
cp /dev/null ${TAGS_FILE}  # ファイルを空にしておく
for (( i=1; i<=${PAGE_COUNT} ;i++ ))
do
  ss="curl 'https://qiita.com/api/v2/tags/${TAG_ID}/items?page=${i}&per_page=100' | jq '.[] | { likes_count: .likes_count, title: .title, url: .url}' >> ${TAGS_FILE}"
  eval $ss
done 
# sort 降順
jq 'sort_by(.likes_count) | reverse' --slurp ${TAGS_FILE}  > ${RANKINGFILE}
# end

githubレポジトリ

参照リンク

Qiita API v2の仕様
https://qiita.com/api/v2/docs

Qiita API v2の仕様(特定タグの記事リスト)
https://qiita.com/api/v2/docs#get-apiv2tagstag_iditems

jq(manual)
https://stedolan.github.io/jq/manual/

jq コマンドを使う日常のご紹介
https://qiita.com/takeshinoda@github/items/2dec7a72930ec1f658af

eval(man)
https://man7.org/linux/man-pages/man1/eval.1p.html

[メモ] Qiita: 投稿記事の閲覧数をコマンドラインで取得
https://qiita.com/mt08/items/57411d9618725d58a41f

PythonでQiita APIを叩いて初心者向け記事を一覧取得したあと、神記事たちを参拝していく
https://qiita.com/yaboxi_/items/97e78831741d02091e0d


Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1