Help us understand the problem. What is going on with this article?

Qiitaの記事情報をAPIで取得しCSVに書き出す

More than 1 year has passed since last update.

1. はじめに

Python3でQiitaの記事情報をAPIで取得しCSVに書き出す2種類のスクリプトを作成したので覚書です。

  • Qiitaの記事情報1万件分をCSVに書き出すスクリプト
  • 指定した期間内に作成されたQiitaの記事情報をCSVに書き出すスクリプト

2. Qiitaの記事情報1万件分をCSVに書き出す

Qiitaの記事情報を最新1万件分取得し、PandasでCSVに出力します。
Qiita APIは以下のような仕様になっているので、仕様にあわせてスクリプトを書いていきます。

  • pageの最大値は100
  • per_pageの最大値は100

Qiita APIで取得できる記事情報は、JSONのサンプルページや、公式ドキュメントで確認できます。
Qiitaのアクセストークンはアクセストークン発行ページから取得しましょう。

サンプルコード

import http.client
import json
import pandas as pd

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

for i in range(100):
    i += 1
    # Qiita APIで記事情報を取得
    page = "page=" + str(i)
    conn.request("GET", url + page + "&per_page=100", headers=h)
    res = conn.getresponse()
    print(res.status, res.reason)
    data = res.read().decode("utf-8")
    # CSVに出力
    df = pd.read_json(data)
    df.to_csv("qiita.csv", columns=[
        'likes_count', # いいね数
        'created_at', # 作成日時
        'title', # 記事タイトル
        'url' # 記事URL
        ], mode='a', header=False, index=False)

3. 指定した期間内に作成されたQiitaの記事情報をCSVに書き出す

先ほどのコードで1万件の記事情報を取得してみましたが、何かしらの分析をしたいと思うと、最新の1万件だけではなく指定した期間内に作成された全てのQiita記事を取得したくなってきました。

1万件のデータをみてみると1ヶ月弱で1万件の投稿数になるようです。

そこで、こちらの記事:Qiitaの記事データをQiita API, Scrapyで収集を参考にさせていただきながら、指定した期間内に作成されたQiita記事情報をCSVに書き出すスクリプトを作りました。

サンプルコードの処理の流れ

処理の流れについては、前述の参考記事と同じなので引用させていただきます🙇‍♂️

GET /api/v2/itemsでは1ページあたり最大100件で最大100ページ、最大で合計10000件のデータを取得でき> る。1回のリクエストで得られるのは100件分で、ページ番号のパラメータpageをカウントアップさせてリクエストを繰り返し、すべての検索結果を取得する。

10000件を超えた分のデータは取得できないので、結果件数が10000件に収まるように半月ずつ日時をずらしていく。

このようにして取得した情報をCSVに書き出していきます。

サンプルコード

以下、サンプルコードです。

import http.client
import json
import pandas as pd
import math

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

# この期間に作成されたQiitaの記事情報を取得
start = '2019-04-15'
end = '2019-06-30'

# 半月ごとの日付をリスト化
date_list = [d.strftime('%Y-%m-%d') for d in pd.date_range(start, end, freq='SM')]
start_list = date_list[:-1]
end_list = date_list[1:]

# カウント用変数
num = 0
p = 0

# start_listの配列の数だけ繰り返し処理
for i in start_list:
    num += 1
    # 日付のリストから検索の開始日と終了日を取り出す
    start_date =  start_list[num - 1]
    end_date = end_list[num - 1]
    query = "&query=created:>" + start_date  + "+created:<" + end_date
    # 検索で指定した期間内に作成された記事数を取得
    conn.request("GET",  url + query, headers=h)
    res = conn.getresponse()
    res.read()
    print(res.status, res.reason)
    total_count = int(res.headers['Total-Count'])
    # 取得した記事数をもとにリクエスト回数を算出
    page_count = math.ceil(total_count / 100)
    print(start_date + "から" + end_date + "までのデータを取得します...")
    print("この期間に作成されたデータを取得するのに必要なリクエスト回数は" + str(page_count) + "回です")
    # データを取得しCSVに書き出す
    for p in range(page_count):
        p += 1
        page = "page=" + str(p)
        conn.request("GET", url + page + query, headers=h)
        res = conn.getresponse()
        print(res.status, res.reason)
        data = res.read().decode("utf-8")
        df = pd.read_json(data)
        df.to_csv("qiita2.csv", columns=[
            'likes_count', 
            'created_at',
            'title',
            'url'
            ], mode='a', header=False, index=False)
        print(str(p) + "/" + str(page_count) + "完了")

4. おわりに

Pandasがとても便利でした。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away