1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SuiSuiAdvent Calendar 2023

Day 25

アドカレ開催中の流行はコレだ

Last updated at Posted at 2023-12-25

前置き

アドベントカレンダーももう終わりですね.
たくさんの記事が投稿されましたが,どのような投稿が多いか見てみましょう!

データは2023年12月1日 ~ 2023年12月25日 までの期間です.

動作環境

  • Python 3.12.0
  • Qiita API v2

Qiita API v2を使用する際の下準備は以下のサイトを参考にしました.

ソースコード

import collections
import datetime
import http.client
import pandas as pd
import math
import time

h = {'Authorization': 'Bearer 【アクセストークン】'}
conn = http.client.HTTPSConnection("qiita.com")
url = "/api/v2/items?"

# 記事を取得する期間を指定
start = '2023-12-01'
end = '2023-12-25'

# 日付をリスト化
date_list = [d.strftime('%Y-%m-%d') 
             for d in pd.date_range(start, end, freq='D')]

tags = []
wait_time = 3600
for target_date in date_list:
    # 対象の検索日を取得
    query = "&query=created:>=" + target_date + "+created:<=" + target_date + "&per_page=100"
    # 検索で指定した日に作成された記事数を取得
    conn.request("GET",  url + query, headers=h)
    res = conn.getresponse()
    
    if res.status == 403:
        after_time = datetime.datetime.fromtimestamp(time.time() + wait_time)
        print("アクセス制限です.少なくとも {} までは待機します.".format(after_time.strftime('%Y/%m/%d %H:%M:%S')))
        time.sleep(wait_time)
        res = conn.getresponse()
    
    res.read()
    total_count = int(res.headers['Total-Count'])
    # 取得した記事数をもとにリクエスト回数を算出
    page_count = math.ceil(total_count / 100)
    print(target_date + "に作成されたデータを取得するのに必要なリクエスト回数は" + str(page_count) + "回です.")
    # 各記事のタグ情報取得・
    for p in range(1, page_count+1):
        page = "page=" + str(p)
        conn.request("GET", url + page + query, headers=h)
        res = conn.getresponse()
        data = res.read().decode("utf-8")
        df = pd.read_json(data)
        
        for tag_list in df["tags"]:
            for tag in tag_list:
                tags.append(tag["name"])

rank = 10
ctags = collections.Counter(tags)
for tag in ctags.most_common():
    rank -= 1
    print(tag)
    if rank == 0:
        break

解説

ざっくりとコードの解説をしていきます.

認証設定・取得対象の設定

h = {'Authorization': 'Bearer 【アクセストークン】'}
conn = http.client.HTTPSConnection("qiita.com")
url = "/api/v2/items?"

認証情報の設定と今回は記事の取得なので"/api/v2/items?"としています.詳しくは参考文献のドキュメントを参照ください.

記事取得期間の準備

# 記事を取得する期間を指定
start = '2023-01-01'
end = '2023-12-25'

# 日付をリスト化
date_list = [d.strftime('%Y-%m-%d') 
             for d in pd.date_range(start, end, freq='D')]

指定期間の日付を全てリストに格納します.date_listは以下のようになります.

date_list = [
    '2023-12-01',
    '2023-12-02',
    '2023-12-03',
    ...
    '2023-12-25'
    ]

記事取得の検索クエリ設定

query = "&query=created:>=" + target_date + "+created:<=" + target_date + "&per_page=100"

指定期間に投稿された記事を取得するための検索クエリです.
今回はfor文で1日ずつ取得するようにしています.これも詳しくは参考文献のドキュメントを参照ください.

あとはなんやかんやしてタグ情報を引っ張ってきます.

人気投稿タグランキングTOP10発表

さあさあ,集計結果を発表します!

順位 タグ名 投稿数
1位 Python 1221
2位 AWS 887
3位 初心者 728
4位 AdventCalendar2023 660
5位 JavaScript 580
6位 ChatGPT 426
7位 ポエム 369
8位 React 352
9位 TypeScript 350
10位 Unity 272

参考文献

1
0
0

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
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?