概要
Twitterのデータを収集する方法は様々ありますが、Twintを使用する方法が最も便利で使いやすいと私は思います。
ただし、システムとしてはTwitterのスクレイピングを行っているので、規約違反に当たる可能性が高いため注意が必要です。
環境
CentOS 8.4
インストール
公式では.git や pyenv でインストールする方法など、様々なインストール方法が用意されていますが、私はpipでソースコードからインストールする方法が良いと思います。
このインストール方法はインストールするユーザーのみで実行できます。
yum install git gcc python3-devel -y
pip3 install --user --upgrade git+https://github.com/twintproject/twint.git@origin/master#egg=twint
なお、以下のインストール方法はシンプルで良いように思えますが、
pip3 install twint
この方法は noDataExpecting のエラーが発生しました。対策は「ソースコードからインストールする」ですので、最初から使わない方が良いと思います。
CRITICAL:root:twint.run:Twint:Feed:noDataExpecting value: line 1 column 1 (char 0)
sleeping for 1.0 secs
CRITICAL:root:twint.run:Twint:Feed:noDataExpecting value: line 1 column 1 (char 0)
sleeping for 1.0 secs
CRITICAL:root:twint.run:Twint:Feed:noDataExpecting value: line 1 column 1 (char 0)
sleeping for 1.0 secs
参考:
CRITICAL:root:twint.run:Twint:Feed:noDataExpecting value: line 1 column 1 (char 0) #915
使い方
使い方は簡単で、ユーザー名を指定するだけです。
twint -u username
ただし、この方法は標準出力にそのまま結果が垂れ流されてしまうので、ファイルに出力した方が現実的でしょう。
出力方法によって取得できるデータにも違いがあるので参考までに例を示しておきます。
TXTでファイルに出力した場合:
twint -u pamyurin -o pamyurin.txt
1419483710609498112 2021-07-26 11:24:23 +0900 <pamyurin> 大好きクリエイティブドラッグストアの新作🐊 htt
ps://t.co/EgSnKJ6i9Z
1419196788817338371 2021-07-25 16:24:16 +0900 <pamyurin> 観葉植物っていいな🪴
JSON:
twint -u pamyurin -o pamyurin.json --json
{"id": 1419483710609498112, "conversation_id": "1419483710609498112", "created_at": "2021-07-26 11:24:23
JST", "date": "2021-07-26", "time": "11:24:23", "timezone": "+0900", "user_id": 220332457, "username":
"pamyurin", "name": "きゃりーぱみゅぱみゅ", "place": "", "tweet": "大好きクリエイティブドラッグストアの
新作🐊 https://t.co/EgSnKJ6i9Z", "language": "ja", "mentions": [], "urls": [], "photos": ["https://pbs.
twimg.com/media/E7ME6BiVoAMccqw.jpg"], "replies_count": 68, "retweets_count": 133, "likes_count": 2513,
"hashtags": [], "cashtags": [], "link": "https://twitter.com/pamyurin/status/1419483710609498112", "retw
eet": false, "quote_url": "", "video": 1, "thumbnail": "https://pbs.twimg.com/media/E7ME6BiVoAMccqw.jpg"
, "near": "", "geo": "", "source": "", "user_rt_id": "", "user_rt": "", "retweet_id": "", "reply_to": []
, "retweet_date": "", "translate": "", "trans_src": "", "trans_dest": ""}
{"id": 1419196788817338371, "conversation_id": "1419196788817338371", "created_at": "2021-07-25 16:24:16
JST", "date": "2021-07-25", "time": "16:24:16", "timezone": "+0900", "user_id": 220332457, "username":
"pamyurin", "name": "きゃりーぱみゅぱみゅ", "place": "", "tweet": "観葉植物っていいな🪴", "language": "ja"
, "mentions": [], "urls": [], "photos": [], "replies_count": 97, "retweets_count": 169, "likes_count": 3
438, "hashtags": [], "cashtags": [], "link": "https://twitter.com/pamyurin/status/1419196788817338371",
"retweet": false, "quote_url": "", "video": 0, "thumbnail": "", "near": "", "geo": "", "source": "", "us
er_rt_id": "", "user_rt": "", "retweet_id": "", "reply_to": [], "retweet_date": "", "translate": "", "tr
ans_src": "", "trans_dest": ""}
CSV:
twint -u pamyurin -o pamyurin.csv --csv
id conversation_id created_at date time timezone user_id username name
place tweet language mentions urls photos replies_count retweets_count likes_co
unt hashtags cashtags link retweet quote_url video thumbnail near
geo source user_rt_id user_rt retweet_id reply_to retweet_date translate
trans_src trans_dest
1419483710609498112 1419483710609498112 2021-07-26 11:24:23 JST 2021-07-26 11:24:23
+0900 220332457 pamyurin きゃりーぱみゅぱみゅ 大好きクリエイティブドラッグスト
アの新作🐊 https://t.co/EgSnKJ6i9Z ja [] [] ['https://pbs.twimg.com/media/E7ME6BiVoA
Mccqw.jpg'] 68 133 2514 [] [] https://twitter.com/pamyurin/status/141948371060
9498112 False 1 https://pbs.twimg.com/media/E7ME6BiVoAMccqw.jpg
[]
1419196788817338371 1419196788817338371 2021-07-25 16:24:16 JST 2021-07-25 16:24:16
+0900 220332457 pamyurin きゃりーぱみゅぱみゅ 観葉植物っていいな🪴 ja
[] [] [] 97 169 3438 [] [] https://twitter.com/pamyurin/status/1419
196788817338371 False 0 []
TXTはシンプルで視認性がよく分かりやすいですが、取得できるデータが少ないため、多くのデータが欲しい場合はJSONかCSVで取得する方が良いと思います。
なお、ファイルに出力する場合も標準出力に大量のログが出力されるため、これらを無視する場合は以下のように出力を捨てるのも良いと思います。実行速度は変わりませんが。
twint -u pamyurin -o pamyurin.json --json 1> /dev/null
特定のユーザーの最新データを更新する
私は特定のユーザーのツイートを定期的に取得し、最新データを更新する需要があったので、shellスクリプトにしました。
毎回全ツイートを取り直しても同じ結果が得られるのですが、流石にtwitterに迷惑かなと思いまして。
構成としては、ファイルの日付を基準に、日付以降の新しいツイートを取得し、既存のツイートとマージするコードになっています。
#!/bin/bash
username=$1
FILE="${username}.json"
if [ -e $FILE ]; then
since=`date +'%F' -r ${username}.json`
twint -u ${username} --since ${since} --json -o ${username}tmp.json 1> /dev/null
cat ${username}tmp.json >> ${username}.json
sort ${username}.json -r |uniq > tmp.json
mv tmp.json ${username}.json -f
rm ${username}tmp.json
else
twint -u ${username} --json -o ${username}.json 1> /dev/null
fi
実行例:
sh tweet_updater.sh pamyurin
なお、–resume オプションは末尾を更新するオプションなので、最新をマージはできません。
もし他により良い方法があれば教えてください。
以上、参考になりましたら幸いです。
コメント