LoginSignup
6
2

More than 3 years have passed since last update.

【Python】QiitaのAPIでユーザー情報と記事情報を取得する

Last updated at Posted at 2020-03-22

この記事の目的

なんとなく, Qiitaの記事データを分析してみたくなったので, APIをさわってみました.
記事情報だけ取得できれば良いので, 今回は認証の必要はないです.

大きく2つ試しました.
1.ユーザー情報一覧の取得
2.特定ユーザーの記事一覧の取得

順に説明します.

準備

ライブラリを読み込んでおきます.

import numpy as np
import pandas as pd
import requests
import json
from pandas.io.json import json_normalize

一番下のjson_normalizeというものは, APIで返ってきたjson形式のデータをpandasのデータフレームの形式に整形してくれる便利なやつです.

1.ユーザー情報一覧の取得

Qiita API v2 ドキュメントのサンプルには,
GET /api/v2/users?page=1&per_page=20などと書いてあります.
つまり, 以下のようなURLにアクセスすれば情報を得られます.
https://qiita.com/api/v2/users?page=1&per_page=20

ここで, per_pageが一度に取得するユーザー数で, pageがその何番目かを表しています. 例えば1000件のユーザー情報が欲しければ, per_page=100(上限)として最低でも10回のリクエストを送る必要があります.

ということで, コードにすると, 以下のようになります.

n = 333 # 取得したいユーザー数

per_page = 100
df = pd.DataFrame()

for page in range(1, int(n/per_page)+2): #多めに取得しておく
    base_url = "https://qiita.com/api/v2/users?page={0}&per_page={1}"
    url = base_url.format(page, per_page)

    response = requests.get(url)
    res = response.json()

    tmp_df = json_normalize(res)
    df = pd.concat([df, tmp_df])

df.reset_index(drop=True, inplace=True)

df = df.iloc[:n,:] #多めに取得した分削除

結果はこんな感じのデータフレームになります.
image.png

2.特定ユーザーの記事一覧の取得

Qiita API v2 ドキュメントのサンプルには,
GET /api/v2/items?page=1&per_page=20&query=qiita+user%3Ayaottiなどと書いてあります.
つまり, 以下のようなURLにアクセスすれば情報を得られます.
https://qiita.com/api/v2/items?page=1&per_page=20&query=qiita+user%3Ayaotti

ここで, 新たに, queryが登場しましたが, これはブラウザで検索するときと同様の検索オプションが使えます. ただし, :がURLでは%3Aという表記にエンコードされている点は注意です.

image.png

これを使うことで, query=user%3A〇〇〇という感じで特定ユーザーの情報を取得します.
ということで, コードは以下のようになります.

n = 125 # 取得したい記事数

user = "yaotti"
per_page = 100
df = pd.DataFrame()

for page in range(1, int(n/per_page)+2): #多めに取得しておく
    base_url = "https://qiita.com/api/v2/items?page={0}&per_page={1}&query=user%3A{2}"
    url = base_url.format(page, per_page, user)

    response = requests.get(url)
    res = response.json()

    tmp_df = json_normalize(res)
    df = pd.concat([df, tmp_df])

df.reset_index(drop=True, inplace=True)

df = df.iloc[:n,:] #多めに取得した分削除

結果はこんな感じのデータフレームになります.
image.png

以上!

参考

Qiita API v2 ドキュメント
pandasのjson_normalizeで辞書のリストをDataFrameに変換

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