Python で Qiitaの投稿記事に対するView数を取得してみました


## 概要
インフラ屋がアプリ屋のことを少しでも理解できるようにと思い、色々と実施してきた内容をQiitaに投稿しています。投稿した記事のView数等が気になってきたので、メンバー全員分を一括して取得できるようにする Python プログラムを作成しました。投稿数が多くなるとView数の取得に時間がかかるので、プログレスバー表示を追加しています。

### 実行環境
macOS Big Sur 11.1 
python 3.8.3

### 個人トークンの取得

Qiitaアカウントの個人トークンを以下の手順で取得します

1. 個人アカウントでログイン
2. アカウント → 設定 → アプリケーション → 個人用アクセストークン → トークンを発行 

### 実行プログラム

```python:QiitaAPI_GetView.py
import time
import argparse
import requests
import json
from tabulate import tabulate
from tqdm import tqdm

# メンバー全員の投稿アカウント毎の個人トークンの定義
tokens = {
    "yamahiro": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "himorishuhei": "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy",
    "Alex-hiro": "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz",
    'turupon': "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
}

# https のパラメータ情報
params = {
    "page": "1",
    "per_page": "100",
}


# アカウント毎に投稿した記事のListを取得
def GetPostList():

    # 投稿アカウントでの取得
    cnt = 0
    for (key, token) in zip(tokens.keys(), tokens.values()) :

        # https のヘッダー情報 with 個人トークン
        print("\n ■---■---■ 投稿者：{}".format(key))
        headers = {
            "Authorization": "Bearer " + token
        }

        # 個人トークンを利用してのその個人の投稿記事情報の取得
        res1 = requests.get('https://qiita.com/api/v2/authenticated_user/items', params=params, headers=headers)
        jsonlist = json.loads(res1.text)

        # 投稿記事毎View数の取得
        cnt += GetView(jsonlist, headers)
    
    return cnt


# 投稿した記事のView数の取得
def GetView(jsonlist, headers):

    # 取得する情報のキーと値の準備
    item_key=['User', 'url', 'page_views_count', 'likes_count', 'created_at', 'updated_at', 'Title']
    item_value=[]
    se=[]

    # 投稿記事毎の情報の取得
    # プログレスバーで進捗状況を表示
    for i, item in enumerate(tqdm(jsonlist)):

        # その記事情報の取得
        se.clear()
        res2 = requests.get('https://qiita.com/api/v2/items/' + item['id'], headers=headers)
        rec = json.loads(res2.text)

        # アカウント名、記事URL、View数、いいね数、作成日、更新日、記事タイトル 情報の取得
        item_value.append([rec['user']['id'], rec['url'], rec['page_views_count'], rec['likes_count'], rec['created_at'], rec['updated_at'], rec['title']])


    # json形式への変換
    rows = [dict(zip(item_key,item)) for item in item_value]

    # 取得情報の表示
    print(tabulate(rows, headers='keys'))
    print("\n   ---> 投稿数：{}\n".format(len(rows)))

    return len(rows)


if __name__ == '__main__':    
    parser = argparse.ArgumentParser(description='Qiitaの投稿記事に対するView数を取得する')
    args = parser.parse_args()

    start = time.time()
    cnt = GetPostList()
    generate_time = time.time() - start

    print("")
    print("　Qiita Post 総数 : " + str(cnt))
    print("  取得時間:{0}".format(generate_time) + " [sec] \n")
```

### プログラムの実行
 
```
## 実行結果
$ python QiitaAPI_GetView.py                                          

 ■---■---■ 投稿者：yamahiro
100%|██████████████████████████████████████████████████████████████████████████████████████████████| 12/12 [00:03<00:00,  3.65it/s]
User      url                                                      page_views_count    likes_count  created_at                 updated_at                 Title
--------  -----------------------------------------------------  ------------------  -------------  -------------------------  -------------------------  ---------------------------------------------------------------------------------------
yamahiro  https://qiita.com/yamahiro/items/dfbdb2de55812d6b2506                 334              0  2020-12-20T05:37:36+09:00  2021-02-21T15:38:50+09:00  Cloudianオブジェクトストレージ/マルチスレッドによるファイルのアップロード
    ：
yamahiro  https://qiita.com/yamahiro/items/7b8a11c773106b641795                 859              1  2020-12-18T05:38:27+09:00  2021-02-21T15:27:15+09:00  [Cloudian #1] AWS SDK for Python(boto3)で、オブジェクトストレージにアクセスしてみる

   ---> 投稿数：12


 ■---■---■ 投稿者：himorishuhei
100%|████████████████████████████████████████████████████████████████████████████████████████████████| 4/4 [00:00<00:00,  4.69it/s]
User          url                                                          page_views_count    likes_count  created_at                 updated_at                 Title
------------  ---------------------------------------------------------  ------------------  -------------  -------------------------  -------------------------  --------------------------------------------
himorishuhei  https://qiita.com/himorishuhei/items/cb53613b49846f53fb91                 174              0  2021-10-21T11:16:11+09:00  2021-10-21T11:20:50+09:00  Azure Databricksにおける日本語文字化けの対処
    ：
himorishuhei  https://qiita.com/himorishuhei/items/201f7de74670aee85c6d                 718              0  2021-05-19T10:42:22+09:00  2021-05-19T10:42:22+09:00  Azure仮想マシン料金を計算してみた

   ---> 投稿数：4


 ■---■---■ 投稿者：Alex-hiro
100%|████████████████████████████████████████████████████████████████████████████████████████████████| 5/5 [00:01<00:00,  4.35it/s]
User       url                                                       page_views_count    likes_count  created_at                 updated_at                 Title
---------  ------------------------------------------------------  ------------------  -------------  -------------------------  -------------------------  -----------------------------------------------------------------
Alex-hiro  https://qiita.com/Alex-hiro/items/7f096462f4622c0ea24d                 242              2  2021-11-10T16:17:53+09:00  2021-11-10T16:17:53+09:00  Confluent Platformのデモを試してみる(Kafkaコネクト編)
    ：
Alex-hiro  https://qiita.com/Alex-hiro/items/3769d6052f216791ded4                 408              5  2021-04-20T14:44:20+09:00  2021-09-01T20:07:10+09:00  Azure Kubernetes Service(ASK)上でConfluent Platformを構築してみる

   ---> 投稿数：5


 ■---■---■ 投稿者：turupon
100%|██████████████████████████████████████████████████████████████████████████████████████████████| 73/73 [00:26<00:00,  2.71it/s]
User     url                                                     page_views_count    likes_count  created_at                 updated_at                 Title
-------  ----------------------------------------------------  ------------------  -------------  -------------------------  -------------------------  -------------------------------------------------------------------------------------------------------------------------------------------------
turupon  https://qiita.com/turupon/items/b69d867e3e05b05e307e                 299              0  2021-11-12T15:11:44+09:00  2021-11-12T15:11:44+09:00  Python の DataFrame を利用してデータ抽出変換をしてみました （１レコード → 複数レコード）
    ：
turupon  https://qiita.com/turupon/items/f458e37f200185843420                 573              0  2020-12-23T11:51:18+09:00  2020-12-24T11:26:42+09:00  オブジェクトストレージ Cloudian/S3 にあるJSON形式のデータから特定のデータを抽出してみます

   ---> 投稿数：73


　Qiita Post 総数 : 94
  取得時間:35.04356503486633 [sec] 
```

### まとめ

これでメンバー全員の投稿した記事のView数をいつでも確認できるようになりました、、、、、