【Python】ALISのAPIのデータを「CSVファイル」に保存する方法


リンク:

アリスブログ「ALISのAPI」を使用する方法まとめ > 当記事


◆ 【Python】ALISのAPIのデータを「CSVファイル」に保存する方法

ついにやってきました! CSVファイルの保存の回!


CSVファイルを生成することができれば、表計算ソフト(エクセルとか)と連携を取ることができるようになるので、今まで集計していたデータの「保存や分析」が行えるようになりますとても重要です

なので、しっかり覚えていきましょう!


○ 留意事項

・ファイルの作成を行ったら、最後に必ず、アプリを終了させて下さい。そうしないと、ファイルの情報が更新されないかもしれません

・本番用のプログラムは、実行速度が遅いです


○ 関連記事




◆ CSVファイルについて

CSV(comma-separated values)とは、項目を「,」(カンマ、コンマ)で区切った、テキストファイルのことです。


CSVデータの例:

a1,a2,ほげほげ,a4,
a5,a6,a7


上記のデータ列を、表計算ソフトで読み込んだ場合:


上記の「CSVデータの例」をメモ帳とかに保存して、「拡張子をcsv(中身は実質txt)」にすれば出来上がります。簡単です


○ Pythonで「CSVファイル」を生成する方法

import codecs

str1 = 'a1,a2,ほげほげ,a4\na5,a6,a7'

file_name1 = 'csv1.csv'

file1 = codecs.open(file_name1,'w','utf-8')

file1.write(str1)

file1.close


input('Enterキーで終了')

テキストデータを保存するプログラムと、殆ど同じコードです。


・「\n」について

「\n」は改行の宣言です。これを入れておかないと、次の行に改行されないので、気をつけておいて下さい


「CSVファイル」を生成したい場合は、APIから出力されたデータを「A,B,C,D,E,F……」のように「,」で分けながら、文字列に保存しておけば良いというわけですね。


……それでは、次に、「本番での使用方法」を見ていきましょう!



◆ 記事の情報をCSVファイルに保存するプログラム

import urllib.request
import json
import pprint
import time
import math
import datetime
import codecs


#任意の値
user_name1 = 'yuuki'
load_num = 3 # 記事の呼び出しを行う数


#固定の値
article_id_memo1 = ''
sort_key_memo1 = ''
article_box2 = []


# 呼び出しする数の生成
if load_num < 1 : load_num = 1

limit1 = load_num
loop_num = (int)(1 + (load_num - 1) / 100)

if limit1 > 100 : limit1 = 100


for count1 in range(loop_num):
    try:
        url_name1 = f'https://alis.to/api/users/{user_name1}/articles/public?limit={limit1}'

        if count1 >= 1:
            url_name1 += f'&article_id={article_id_memo1}&sort_key={sort_key_memo1}'

        cm_data1 = urllib.request.urlopen(url_name1)
        article_box1 = json.loads(cm_data1.read().decode("utf-8"))
        article_box2.extend(article_box1['Items'])

        load_article1_len1 = len(article_box1['Items'])

        print("Load : " + str(count1))

        if load_article1_len1 <= 0:
            break

        else:
            article_id_memo1 = article_box1['Items'][load_article1_len1 - 1]['article_id']
            sort_key_memo1 = article_box1['Items'][load_article1_len1 - 1]['sort_key']

        #time.sleep(1)

    except:
        print("Error!")
        break


print("")

page2 = 0
load_article1_len2 = len(article_box2)

csv_str1 = '作成日時,タイトル名,いいねの数,ALISトークン\n'
csv_str_box1 = []



for article3 in article_box2:
    title_name1 = article3['title']

    date_str1 = (str)(datetime.datetime.fromtimestamp((int)(article3['sort_key'] / 1000000)))

    url_name2 = f'https://alis.to/api/articles/' + article3['article_id'] + '/likes'
    cm_data2 = urllib.request.urlopen(url_name2)
    like_dict1 = json.loads(cm_data2.read().decode("utf-8"))

    like1 = like_dict1['count']

    url_name3 = f'https://alis.to/api/articles/' + article3['article_id'] + '/alistoken'
    cm_data3 = urllib.request.urlopen(url_name3)
    alis_token_dict1 = json.loads(cm_data3.read().decode("utf-8"))

    alis_token1 = alis_token_dict1['alis_token'] / 1000000000000000000
    alis_token2 = math.floor(alis_token1 * 100) / 100

    csv_str_box1.append(f'{date_str1},{title_name1},{like1},{alis_token2}\n')

    page2 += 1
    print(f'Load ({page2} / {load_article1_len2}) : {title_name1} いいね : {like1} ALIS : {alis_token2}')

    time.sleep(1)


for str1 in reversed(csv_str_box1):
    csv_str1 += str1



file_name1 = user_name1 + '_ALIS_ArticleData.csv'
file1 = codecs.open(file_name1,'w','utf-8')
file1.write(csv_str1)
file1.close



print('')
print(f'CSVファイル「{file_name1}」を作成しました!')

print('')
print('要素数 : ' + str(len(article_box2)))
print('')


input('Enterキーで終了')

※1 説明しておきたい部分を太字にしています

※2 このソースコードは、「ALISユーザーの『いいねの数』と『獲得したALISトークン』を表示する方法」と「ALISの記事をバックアップする方法」に書かれているコードを合成したものです


○ 説明!

csv_str1 = '作成日時,タイトル名,いいねの数,ALISトークン\n'

CSVファイルの「冒頭の内容」を上記のようにしておきます。


csv_str_box1 = []

リスト型の宣言。

必要な文字列を、全て「csv_str1」に連結してしまっても良いのですが、

今回は「古い順から記事を表示したいため」、一度「リスト型」に「文字列」を格納して、順番の変更ができる状態にしておきます


date_str1 = (str)(datetime.datetime.fromtimestamp((int)(article3['sort_key'] / 1000000)))

日付を文字列で保存しておくプログラムです。

記事の情報には、「['sort_key']」と呼ばれる「unix時間」を保存したものがあるので、そちらを利用した上で「fromtimestamp」を用いて、「unix時間」を日付のデータに変換しています


・「 / 1000000」について

「['sort_key']」は精度が良すぎるので秒単位以下のデータは捨てています


・余談:「['published_at']」について

ALISの記事の情報には、「['published_at']」という名前の秒単位まで保存された「unix時間」のデータがあります。

こちらのほうが、「unix時間」を扱いやすいので、「['sort_key']」ではなく、「['published_at']」を使いたくなるものなのですが…、

なんと! (現時点での)この要素は「2018/05/01」、以前の「ALISの記事の情報」には含まれていないのです


このことから、「['published_at']」で投稿時間を保存していると、記事を取得している最後の方で(大分待った後に)、プログラムがエラーになって強制終了を起こします

鬼畜仕様です。ご注意下さい。


_(:3 」∠ )_  < このバグの発見に苦労したよ……



csv_str_box1.append(f'{date_str1},{title_name1},{like1},{alis_token2}\n')

CSVに保存しておきたいデータ(「日付,タイトル名,いいね数,ALISトークン数」)を、「csv_str_box1」に入れていきます。


for str1 in reversed(csv_str_box1):
    csv_str1 += str1

「reversed」は、呼び出す配列を反転させるコードです。

これにを使って、CSVに保存しておきたいデータを「csv_str1」内に逆から入れていきます。


file_name1 = user_name1 + '_ALIS_ArticleData.csv'
file1 = codecs.open(file_name1,'w','utf-8')
file1.write(csv_str1)
file1.close

最初の方で説明した「Pythonで『CSVファイル』を生成する方法」をちょっとだけ改造したものです。

このプログラムで、任意の文字列を、CSVファイルに保存します


○ 実行結果

・プログラムの確認

「user_name1 = 'yuuki'」「load_num = 10000」で起動


・生成されたCSVファイルの確認

今回は、古い順から記事を並べています。


・私の記事の「いいね数」と「ALISトークン」の関係

「APIの利用方法」と「CSVの操作」を覚えれば

ののたさん」が行っているような「ALISの分析データ」を出力することもできるようになります。



「『ALISのAPI』を使用する方法まとめ」に戻る




◆ 「ゆうき」のツイッター


公開日:2018/09/14
獲得ALIS:23.31
ゆうき / アリスブロガー's icon'
  • ゆうき / アリスブロガー
  • @yuuki
ALISブロガーです。スキル:SEO対策、ライティング、プログラム等。ALISでは「記事制作のアドバイス」や「情報提供」などを行っています。よろしくお願いします。Twitter yuuki_tw1
コメントする
コメントする