メインコンテンツへスキップ
見出し画像

【2020年12月版】noteの非公式APIを使ってユーザーの"全記事データ”を取得してみる※pythonコード有り

    karupoimou

    note非公式APIは「v1」から「v2」へ

    前回2020年の2月時点にも書いた「note非公式APIを用いて全記事データを取得する方法」ですが、2020/12/30の現時点において「v1」APIは廃止されておりもはや使えなくなっています。

    そして代わりに「v2」APIが使えるようになっています。

    そこで今回は「v2」APIを使って、ユーザーの"全記事データ”を取得するpythonコードについて検証していきたいと思います

    現在のAPI

    ユーザー情報を取得するAPI URL

    https://note.com/api/v2/creators/user_name

    user_nameの部分に取得したいユーザー名を入れます
    例としては以下のようになります

    # 例:note公式の情報を取得
    https://note.com/api/v2/creators/info

    なお上記のURLで返ってくるのはjson形式のデータなのでwebブラウザで開くとこの様に見えます

    画像1

    これでは読み取るのも一苦労なので、次はpythonを用いてこれを展開していきます

    ユーザー情報をPythonで取得する

    前述のAPI URLをpythonのrequestsで取得し、pandasのデータフレームにそのまま投入するとこの様になります

    # ユーザー情報取得
    import requests
    import pandas as pd
    import json
    
    user_name="info"
    
    user_api_url="https://note.com/api/v2/creators/%s"%user_name
    
    res = requests.get(user_api_url).content
    
    df = pd.read_json(res)
    
    display(df)

    画像2

    取得できた項目一覧

    customDomain
    disableSupport
    externalLinks
    followAppealText
    followerCount
    followingCount
    hasCircle
    hasStore
    headerImageKey
    headerImageUrl
    id
    isAdmin
    isBlocked
    isCreatorArchivesTabEnabled
    isCreatorCirclesTabEnabled
    isCreatorFollowNumberDisplayed
    isCreatorJobOfferTabEnabled
    isCreatorLikesTabEnabled
    isCreatorMagazinesTabEnabled
    isCreatorProfileTabEnabled
    isFollowed
    isFollowing
    isMedia
    isMyself
    isOfficial
    magazineCount
    nickname
    noteCount
    originalHeaderImageUrl
    proUserId
    profile
    profileImageKey
    profileImageUrl
    showFollowCount
    socials
    style
    tlMagazines
    urlname

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

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

    ユーザーの記事一覧取得

    次に「記事」について情報を取得してみたいと思います。

    記事に関するAPI URLは以下の様です

    https://note.com/api/v2/creators/user_name/contents

    user_nameの部分を参照したいユーザー名に書き換えます

    ユーザーの記事一覧を取得するpythonコード

    # 記事情報取得
    import requests
    import pandas as pd
    import json
    
    user_name="info"
    
    contents_api_url="https://note.com/api/v2/creators/%s/contents"%user_name
    payload = {'kind':'note'}
    
    res = requests.get(contents_api_url, params=payload).content
    
    df = pd.read_json(res)
    
    display(df)

    画像3

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

     そこで次はこれを展開し、見やすいようにエクセルファイル化したいと思います。

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

    # 記事情報取得
    import requests
    import pandas as pd
    import json
    
    user_name="info"
    
    contents_api_url="https://note.com/api/v2/creators/%s/contents"%user_name
    payload = {'kind':'note'}
    
    res = requests.get(contents_api_url, params=payload).content
    df = pd.read_json(res)
    
    df2 = pd.DataFrame()
    
    # notes行だけを抽出
    df_notes = df["data"]["contents"]
    
    # 展開して新しいデータフレームに行として追加していく
    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')

    結果

    画像4

    取得できたカラム名一覧

    id
    type
    status
    name
    description
    price
    key
    slug
    publishAt
    thumbnailExternalUrl
    eyecatch
    user
    canRead
    isAuthor
    externalUrl
    customDomain
    body
    separator
    isLimited
    isTrial
    canUpdate
    tweetText
    additionalAttr
    isRefund
    commentCount
    likes
    likeCount
    anonymousLikeCount
    isLiked
    disableComment
    hashtags
    twitterShareUrl
    facebookShareUrl
    lineShareUrl
    audio
    pictures
    limitedMessage
    labels
    priorSale
    canMultipleLimitedNote
    hasEmbeddedContent
    isPinned
    pinnedUserNoteId
    isTreasuredNote
    spEyecatch
    enableBacktoDraft
    notificationMessages
    isProfiled
    isForWork
    isCircleDescription
    noteDraft
    noteUrl

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

     しかし1回のリクエストで取得できる記事数は6記事までとなっている様です。

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

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

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

    # ユーザー記事データ全件取得
    import requests
    import pandas as pd
    import json
    import time
    from tqdm import tqdm
    
    # 取得したいユーザー名
    user_name="info"
    
    # API URL
    user_api_url="https://note.com/api/v2/creators/%s"%user_name
    contents_api_url="https://note.com/api/v2/creators/%s/contents"%user_name
    
    # 取得秒数間隔の指定
    interval = 1
    
    # 総記事件数の取得
    res = requests.get(user_api_url).content
    
    df = pd.read_json(res)
    note_count = df['data']['noteCount']
    
    # 総取得ページ数
    page_num = (note_count//6) + 1
    
    # 個別ページの取得
    df2 = pd.DataFrame()
    
    for page in tqdm(range(page_num)):
    
       page = page+1
    
       payload = {'kind':'note','page':page}
       res = requests.get(contents_api_url, params=payload).content
    
       df = pd.read_json(res)
    
       df_notes = df["data"]["contents"]
       
       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(interval)
       
    # 重複行を削除する
    df2.drop_duplicates(subset='noteUrl', inplace=True)
    
    # 投稿日順に並び替え
    df2 = df2.sort_values('publishAt', ascending=False)
    
    # インデックスの振り直し
    df2 = df2.reset_index(drop=True)
    
    # エクセルファイルとして保存
    df2.to_excel('notes_all.xlsx')

    結果:成功!

    画像5

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

    おわりに

     前回の記事を改稿する形で現行のnote非公式API「v2」を用いて、ユーザー情報やユーザー全記事データを取得することを試みました。

     「v1」から「v2」で仕様が変わった部分も多少ありましたが引き続きnote 非公式APIは使用できるみたいです。

    おまけ

    画像6

    2020/12/30時点におけるnote公式アカウントの「スキ」の数が多い記事トップ10

    !!注意!!

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

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

    あなたへのおすすめ