PythonでTwintを使ってTwitterのデータを収集する方法

概要

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

CRITICAL:root:twint.run:Twint:Feed:noDataExpecting value: line 1 column 1 (char 0) · Issue #915 · twintproject/twint
This error will be reported from 0:00 on September 18, 2020. It is found through debug that the page does not exist. Can...

使い方

使い方は簡単で、ユーザー名を指定するだけです。

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 オプションは末尾を更新するオプションなので、最新をマージはできません。

もし他により良い方法があれば教えてください。

以上、参考になりましたら幸いです。

コメント

タイトルとURLをコピーしました