こんにちは、ミナピピン(@python_mllover)です。mentaの案件でkotoriotokoなるスクレイピングツールを紹介されて調査したのですが、まあまあ使えたのでメモがてら紹介しておきます。
ちなみにこのツール、何がすごいのかという通常のTwitterのAPIではsearchで条件を満たしているにも関わらず取得制限など検索に引っかからないツイートも余すところなく取得してくれる点です。
kotoriotoko
gitのリポジトリ:https://github.com/ShellShoccar-jpn/kotoriotoko
日本語版の解説は少しクサイがプログラム自体はスゴイです。ただTwitterのAPIそのものの縛りである10日前以上のツイートを取得することは不可能みたいです。10日前以上のツイート取得はTwitter公式のAPIの通信を分析してクライアント専用のAPI通信を見つけてそれを使うしかないかなと思いますが、クライアント偽装とか手間が掛かりそうですし、そこまでツイート取得に命を掛けていないので気が向いたらやるかも。。。
kotoriotokoの初期設定
# リポジトリのクローン $ git clone https://github.com/ShellShoccar-jpn/kotoriotoko.git
まずtwitterのAPI鍵が必要です。API鍵が無くても一応使えますが、1分ごとの高頻度のデータを収集するためにはTwitterのAPI鍵が必須です。API鍵はtwitterのデベロッパーサイトで作成できます
API鍵を作成したら以下の4つをコピーしてください。
APIキー
APIキーシークレット
アクセストークン
アクセストークンシークレット
そして以下のコマンドを実行します。要はconfigの中にCOMMON.SHLIBというファイルをCOMMON.SHLIB.sampleをコピーして作っているだけです。
$ cd /CONFIG $ cp COMMON.SHLIB.SAMPLE COMMON.SHLIB
次はCOMMON.SHLIBの中にi以下の箇所に先ほど取得した4つAPI鍵とアカウント名(@以降:@test⇒test)を貼り付けて置き換えます。貼り付けはVIMでなくてもメモ帳を使用しても大丈夫です。
<COMMON.SHLIB>
: : ###################################################################### # My account info ###################################################################### readonly MY_scname='YOUR_TWITTER_ID_(SCREEN_NAME)' readonly MY_apikey='SET_YOUR_CONSUMER_KEY_HERE' readonly MY_apisec='SET_YOUR_CONSUMER_SECRET_HERE' readonly MY_atoken='SET_YOUR_ACCESS_TOKEN_HERE' readonly MY_atksec='SET_YOUR_ACCESS_SECRET_HERE' : :
これが終わったらこれらを使ってベアラーを作成します。
$ cd <小鳥男のインストールディレクトリー>/BIN $ ./getbtwid.sh
これでreadonly MY_bearer='1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012'
(例) みたいなベアラートークンが発行されるので、このまま先ほどのconfigのCOMMON.SHLIBに張り付けて保存します。
これで初期設定完了です。
KOTORIOTOKOの使い方
使い方についてはread.meに懇切丁寧に書かれているので特にここで追記することはないかなと思いますが、簡単に初期設定とツイート検索コマンドだけ紹介しておきます。
ツイート検索
$ cd <小鳥男のインストールディレクトリー>/APPS $ gathertw.sh コロナワクチン OR ワクチン -m -filter:retweets -filter:URL -filter:bot -filter:https
これで取得したツイートがgathertw.sh~~~.dataというディレクトリが作成されます。
ツイート情報はRAWの方にjson、RESの方にTXTで保存されています。
Pythonでツイートをcsv出力する
import json import pandas as pd #変換したいJSONファイルを読み込む file_lists = glob.glob(r"C:~~\gathertw.sh20211017083920.data\RAW\**\*\*") datas = [] # ファイルを1つずつ読み込んでリストに格納して最後にcsvに吐き出す for file in file_lists: json_open = open(file,'r', encoding='utf-8') data = json.load(json_open) for d in data['statuses']: year = d['created_at'][-4:] if d['created_at'][4:7]=='Oct': month = 10 #9月だったらSEP 8月だったらAUGなど任意に変更してください day = d['created_at'][8:10] hour = d['created_at'][11:13] minute = d['created_at'][14:16] second = d['created_at'][17:19] d_time= f'{year}-{month}-{day} {hour}:{minute}:{second}' datas.append([d_time, d['user']['name'],d['full_text']]) pd.DataFrame(datas, columns=['日付', 'アカウント名', 'ツイート']).to_csv('サンプル.csv', index=False,encoding='utf-8',errors='ignore')
コメント