メインコンテンツへスキップ
名称未設定-1

※重要:古い記事です:noteの非公式APIを使ってユーザーの"全記事データ”を取得してみる

    !!重要!!

    この記事の内容はもはや古いです。2020/12/30時点でこの記事を書いた当初使えていた「v1」APIは使用できなくなっていますのでご注意ください

    「v2」を用いた新しい記事は以下になります 

    以下、古いバージョンの記事になります

    現在noteでは公式なAPIは公開されていない様ですが、「note API」でweb検索するといくつか情報がヒットします。

     そこで今回はその中から実際に情報が正しいのか、2020年2月の現時点でも使えるのか検証してみたいと思います。

    非公式APIを検証

     まず「ユーザー情報」を参照するAPIを試してみたいと思います。参考にしたの以下のページです。

    https://note.mu/api/v1/users/

    *APIのURLがnote.comになる以前のnote.muとなっていますが、comでもmuでも現状は変わりなく使えるようみたいです

    検証用pythonコード:ユーザー情報

    # ユーザー情報取得
    import requests
    import pandas as pd
    import json
    
    api_url="https://note.mu/api/v1/users/"
    
    urlname="info"
    
    payload = {'urlname':urlname}
    res = requests.get(api_url, params=payload).content
    
    # jsonをPandasデータフレーム化
    df = pd.read_json(res)
    display(df)

     「urlname=""」の部分で対象とするユーザーID名をしています。

     またAPIから返ってくるデータはjson形式となっていますが、ここでは扱いやすい様にPandasのデータフレームに直接変換しています。

    結果

    画像1

    取得できた項目一覧

    authentications
    custom_domain
    draft_count
    follower_count
    following_count
    id
    is_blocked
    is_following
    is_me
    is_official
    magazine_count
    nickname
    no_urlname_user
    note_count
    point_balance
    profile
    tokusyo_contact
    tokusyo_name
    tweet_text
    urlname
    user_profile_image_path
    user_wallpaper_image_path

     フォロー数・フォロアー数・記事数、下書き数などの情報を取得することが出来ました。

     このAPIを使えばnoteユーザーの大体の情報を簡単に得ることが出来そうです(なおこのAPIは公式に公開されているものではないらしいことにご注意ください)

    ユーザーの記事一覧取得

    次に「記事」について情報を取得してみたいと思います。参考にしたのは以下のページです。

    今回は上記のページで紹介されている

    https://note.com/api/v1/notes/

    を試してみます。

    検証用pythonコード:ユーザー記事一覧

    # 記事情報取得
    import requests
    import pandas as pd
    import json
    
    api_url="https://note.com/api/v1/notes/"
    
    urlname="info"
    
    payload = {'urlname':urlname}
    res = requests.get(api_url, params=payload).content
    
    df = pd.read_json(res)
    
    display(df)

    結果

    画像2

     返ってきたデータはこれだけでした。どうやら個々の記事に関するデータは「notes」行にまとめて収納されているみたいです。

     そこで次はこれを展開して表示したいと思います。

    検証用pythonコード:個々の記事のデータ

    # 記事情報取得
    import requests
    import pandas as pd
    import json
    
    api_url="https://note.com/api/v1/notes/"
    
    urlname="info"
    
    payload = {'urlname':urlname}
    res = requests.get(api_url, params=payload).content
    
    df = pd.read_json(res)
    
    df2 = pd.DataFrame()
    
    # notes行だけを抽出
    df_notes = df["data"]["notes"]
    
    # 展開して新しいデータフレームに行として追加していく
    for i in range(len(df_notes)):
       df_n = pd.DataFrame(df_notes[i].values(), index=df_notes[i].keys()).T
       df2 = pd.concat([df2, df_n]) 
    
    display(df2)
    
    # 結果をエクセルファイルで保存
    df2.to_excel('notes.xlsx')

    結果

    列が多くてpandasでは見にくいのでエクセルで表示したものが以下になります。

    画像3


    取得できたカラム名

    id
    key
    is_treasured_note
    body
    external_url
    type
    user_id
    name
    description
    tweet_text
    twitter_share_url
    facebook_share_url
    can_multiple_limited_note
    can_sell_on_first_come_note
    pictures
    embedded_contents
    audio
    status
    publish_at
    price
    created_at
    updated_at
    like_count
    anonymous_like_count
    comment_count
    is_limited
    is_trial
    is_refund
    is_my_note
    can_read
    can_vote
    can_comment
    is_liked
    is_purchased
    is_magazine_purchased
    is_available
    eyecatch
    eyecatch_width
    eyecatch_height
    sp_eyecatch
    has_draft
    is_draft
    is_published
    is_reserved
    reserved_publish_at
    disable_comment
    likes
    user
    comment_viewable
    comments
    hashtag_notes
    has_coupon
    prior_sale
    custom_domain
    editable_scopes
    non_editable_reason

     記事に関するデータはタイトル(name列)から本文(body列)含め、ほぼ全て取得できるようです。

     記事数に関しては、どうやら1回のリクエストで取得できる記事数は10記事までとなっている様です。

     ただし「page」のクエリを追加することで、どの部分から10記事分取得するかは変えられる様です。

     そこで今回は最後にユーザー情報にある「note_count」を用いて、指定したユーザーの記事を全て取得してみたいと思います。

    禁断のユーザー記事全件取得に挑む

    # ユーザー記事データ全件取得
    import requests
    import pandas as pd
    import json
    import time
    from tqdm import tqdm
    
    urlname="info"
    
    # 総記事件数の取得
    payload = {'urlname':urlname}
    res = requests.get("https://note.mu/api/v1/users/", params=payload).content
    
    df = pd.read_json(res)
    note_count = df['data']['note_count']
    
    # 総取得ページ数
    page_num = (note_count//10) + 1
    
    # 個別ページの取得
    df2 = pd.DataFrame()
    
    for page in tqdm(range(page_num)):
    
       page = page+1
       
       payload = {'urlname':urlname,'page':page}
       res = requests.get("https://note.com/api/v1/notes/", params=payload).content
    
       df = pd.read_json(res)
    
       df_notes = df["data"]["notes"]
       for i in range(len(df_notes)):
           df_n = pd.DataFrame(df_notes[i].values(), index=df_notes[i].keys()).T
           df2 = pd.concat([df2, df_n])
       
       time.sleep(3)
       
    # 重複行を削除する
    df2.drop_duplicates(subset='id', inplace=True)
    df2 = df2.reset_index(drop=True)
    
    # エクセルファイルとして保存
    df2.to_excel('notes_all.xlsx')

    結果:成功!

    画像4

    画像5

     ユーザーが公開している全記事のデータを取得することに無事成功しました!

    おわりに

     今回はnoteの非公式APIを使ってユーザー情報やユーザー全記事データを取得することを試みました。

     公式には公開されていないnote APIですが、web上にある情報は正しく、2020年2月現在でも使用することが出来るみたいです。

    おまけ

    ノート公式アカウントの「スキ」の数が多い記事トップ10

    画像6

    注意

    なおnoteのAPIは公式に公開されているものでは無いのでご注意ください

     
     
     
    Chrome機能拡張「noteツイート検索」公開しました~/ 世の中に存在する”捉えがたいデータ”を色々工夫して「視覚化」するのがマイブームです python, pandas, wordcloud, flask, boostrap4, bar chart race など♪

    あなたへのおすすめ