LoginSignup
7
2

More than 3 years have passed since last update.

Qiitaコーパスを作る会 1️⃣Qiitaの全記事を取得してみる

Last updated at Posted at 2019-07-15

はじめに

NLPモデルを試すときに、コーパスとしてとりあえずWikipediaやLivedoorニュースを使ってみる例は結構あると思います。
しかし、技術系のコーパスとしてQiita記事もなかなか面白い結果が得られるよ!ってことで、その軌跡を記します。

今回のシリーズで作ったソースコードはGitHubに置いてあります。

Qiitaの全記事を取得してみる

はじめに、Qiita APIを使って全記事を取得します。
ソースコードは以下です。
このソースでは記事を投稿日毎にjson出力しています。

Qiita APIの詳細はこちら

qiita_api_client.py
# --------------------------------------------------
# Qiita APIから記事データを取得
# --------------------------------------------------
import requests
import json
import time
from datetime import datetime, timedelta
import os


headers = {
    'Authorization': 'Bearer ' + os.getenv('ACCESS_TOKEN')
}
start = datetime.strptime(os.getenv('START_DATE'), '%Y-%m-%d')  # 開始日を設定
end = datetime.strptime(os.getenv('END_DATE'), '%Y-%m-%d')  # 終了日を設定

# API実行
results = []
for i in range((end - start).days):
    today = (start + timedelta(i)).strftime('%Y-%m-%d')
    print(today)

    params = {
        'page': 1,
        'per_page': 100,
        'query': 'created:' + today
    }
    res = requests.get('https://qiita.com/api/v2/items',
                       params=params, headers=headers)
    results.extend(res.json())
    total_count = int(res.headers['Total-Count'])
    print('total_count: ' + str(total_count))
    print(1)
    time.sleep(3.6)  # 3600秒に1000回まで

    # 1日に101件以上投稿されていた場合
    for j in range(2, total_count // 100 + 2):
        params['page'] = j
        res = requests.get('https://qiita.com/api/v2/items',
                           params=params, headers=headers)
        results.extend(res.json())
        print(j)
        time.sleep(3.6)  # 3600秒に1000回まで

    # ファイル書き込み
    with open('data/qiita_' + today + '.json', 'w') as f:
        json.dump(results, f)
    results = []

補足

取得対象の日付

endは最新より少し昔に設定することをお勧めします。スパム記事が大量に投稿されており、まだ削除されていない可能性があるので・・・

end = datetime.strptime(os.getenv('END_DATE'), '%Y-%m-%d')  # 終了日を設定

今回は.envに以下の設定をしています。

START_DATE=2011-09-15
END_DATE=2019-07-01

アクセス制限

アクセストークンを設定した場合、1時間に1000回のアクセス制限があるため待機処理を入れています。

    time.sleep(3.6)  # 3600秒に1000回まで

ページング

pageper_pageでページングができますが、100までしか対応していません。
つまり、一回のクエリで10000件を超える場合は取得できないので注意が必要です。
今回、記事を一日毎に取得しているのはそういう背景もあります(まさか1日に10000件以上投稿されることなんてないだろ・・・)。

    params = {
        'page': 1,
        'per_page': 100,
        'query': 'created:' + today
    }

おわりに

次回→
Qiitaコーパスを作る会 2️⃣前処理をする
次々回→
Qiitaコーパスを作る会 3️⃣単語埋め込みの様子を見てみる

7
2
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
7
2