TL;DR
- 自分の投稿した記事のPV数を知りたい
- 個々のページを見れば確認できるが、できれば一括で取りたい
- Qiita APIを使おう
投稿したエントリのPV数について
自分が投稿した記事を見ると、PV数が表示されます。
見れるのは、自分が投稿した記事だけみたいですよね。
それはそうとして、これをなんとかして一括で取れないものだろうか、と。
Qiita API v2
これを実現するには、Qiita APIを使えばよいみたいです。
"投稿"に関するAPIを使えば、page_views_count(閲覧数)として取得することが可能なようです。
調べてみると、いくつか同じようなことをしている記事もあったのですが、ここは勉強を兼ねて自分で書いてみたいと思います。
お題は、Pythonで。
利用するQiita APIは、以下の2つです。
アクセストークンの取得
最初に、アクセストークンを取得します。
「設定」 → 「アプリケーション」から、アクセストークンを発行してください。
スコープは、今回はread_qiita
があれば良いです。
ここで取得したトークンの値を覚えておきます。
作成したアクセストークンは、一覧としては確認することができます。
環境
今回の環境は、こちらです。
$ python3 -V
Python 3.6.8
HTTPのリクエストには、Requestsを使うことにします。
$ pip3 install requests
使用したRequestsのバージョンは、こちらです。
$ pip3 freeze
...
requests==2.22.0
...
ソースコード
では、PV数を取得するソースコードを作成します。
こんな感じで作りました。
- 自分が投稿した記事のPV数を取得し、結果を表示する
- PV数、タイトル、URL、タグ、作成日時を表示
- 表示は、PV数の降順に行う
- Qiita APIの呼び出し時には、
Authorization
ヘッダーでアクセストークンを付与する - APIの呼び出し後には、スリープを入れる
get_qiita_item_pv.py
from time import sleep
import requests
access_token = "[作成したアクセストークン]"
item_list_base_url = "https://qiita.com/api/v2/authenticated_user/items"
headers = { "Authorization": f"Bearer {access_token}" }
page = 1
per_page = 100
sleep_time = 0.1
page_views = []
while True:
item_list_url = f"{item_list_base_url}?page={page}&per_page={per_page}"
items = requests.get(item_list_url, headers = headers)
items_body = items.json()
if not len(items_body):
break
for entry in items_body:
item_id = entry["id"]
item_url = f"https://qiita.com/api/v2/items/{item_id}"
item = requests.get(item_url, headers = headers)
item_body = item.json()
title = item_body["title"]
url = item_body["url"]
tags = item_body["tags"]
created_at = item_body["created_at"]
page_views_count = item_body["page_views_count"]
page_views.append({
"title": title,
"url": url,
"tags": [ tag["name"] for tag in tags ],
"created_at": created_at,
"page_views_count": page_views_count
})
sleep(sleep_time)
page += 1
sleep(sleep_time)
page_views.sort(key = lambda e: e["page_views_count"], reverse = True)
for page_view in page_views:
print(f"""page_view: {page_view['page_views_count']}
title: {page_view['title']}
url: {page_view['url']}
tags: {page_view['tags']}
created_at: {page_view['created_at']}""")
print()
PV数は、記事一覧のAPIでは取得できなくて(APIドキュメントを見ると取れそうな雰囲気はあるのですが…)、実際には記事個別のAPIを呼び出す必要があります。この時に、認証情報(要はアクセストークン)が必要になります。
実行
では、自分のアカウントでこのスクリプトを動作させてみます。
こんな結果になりました。
$ python3 get_qiita_item_pv.py
page_view: 6154
title: Ubuntu Linux 18.04 LTS / 18.10でOpenJDK 11を使いたい
url: https://qiita.com/charon/items/af0f0de2ae9adbc03bfe
tags: ['Java', 'Linux', 'Ubuntu']
created_at: 2018-11-19T13:03:18+09:00
page_view: 3846
title: プロキシ環境下でdocker buildしたい
url: https://qiita.com/charon/items/d8365d610343d64d598e
tags: ['Docker']
created_at: 2019-01-04T11:29:29+09:00
page_view: 1826
title: 初めてのZeroMQ(Python)でREQ-REPパターン
url: https://qiita.com/charon/items/bdbef40fca6fa89edb24
tags: ['Python', 'ZeroMQ']
created_at: 2019-04-09T16:32:42+09:00
page_view: 1735
title: Apacheのアクセスログを、FluentdでtailしてElasticsearchに放り込む
url: https://qiita.com/charon/items/86d12ac7ca2d7cf6c580
tags: ['Apache', 'Fluentd', 'Elasticsearch', 'Kibana']
created_at: 2018-12-12T09:09:26+09:00
page_view: 1613
title: Stack Overflowクローン、Scooldを使ったQAサイト
url: https://qiita.com/charon/items/cacc2cfac380d8ad46b9
tags: ['Java', 'AdventCalendar']
created_at: 2018-12-11T14:34:57+09:00
page_view: 1385
title: Docker Composeで起動したコンテナのログを、Amazon CloudWatch Logsに送る
url: https://qiita.com/charon/items/7e2328e5abf7340d32b6
tags: ['Docker', 'CloudWatch-Logs']
created_at: 2019-05-07T12:49:04+09:00
〜省略〜
自分の書いた記事で、どのようなものが見られているのか、時々見てみると面白いのかもな?と思います。