やりたいこと
- ツイッターから特定ユーザーのツイートのみを大量に取得したい
- 画像付きのツイートは除外する
最近関係している業務で、↑のような状況が発生したので、やり方をメモっておきます。
Twitterから特定ユーザーのツイートを取れるだけ取得する方法
ユーザーを指定して、ツイートを大量取得する方法はいくつかありますが、今回はtwintというツールを使用します。
参考:Twint
twintであればTwitterのAPIを使用する必要がなく、従って簡単に使い始めることができます。。
もちろん完全無料です。
twintのインストール方法
既にPythonやpipが使えつ環境であれば、twintをインストールするのは滅茶苦茶簡単です。
下記のコマンドを実行してください。
pip3 install --user --upgrade git+https://github.com/twintproject/twint.git@origin/master#egg=twint
正常にインストールが完了していれば、
twint -h
でヘルプ情報が表示されるはずです。
twintはターミナルから直接コマンドとして使用する方法とPythonコード中でライブラリとしてインポートして使う方法があるようです。
今回は主に直接ターミナルから使います。
ユーザーを指定してtweetを取得する
特定ユーザーのtweetを一気に取得してcsvファイルに保存します。
下記コマンドでOKです。
twint -u ユーザー名 -o output.csv --csv
ユーザー名のところは@を除いたtwitterIDです。
例えばオバマ元大統領のツイートを取得したい時は
twint -u BarackObama -o output.csv --csv
で行けます。
画像付きツイートのみを取得する
引数imagesを与えることで、画像付きツイートのみを取得することも出来ます。
twint -u BarackObama -o output.csv --csv --images
非常に簡単なので特に他に言うことは無いです笑
画像無しツイートのみを取得する
調べたところ、画像なしのツイートのみを取得する引数は無かったので無理やりやります。
おおよそ、以下のような流れです。
- 全てのツイートを取得する
- 画像ありツイートのみを取得する
- 1から2と重複する箇所を削除する
1,2はコマンドで、3はPythonコードで行います。
また、3のステップをより正確に記述すると、以下のような感じです。
- ステップ1 : 全てのツイートを格納したpandasのデータフレームと、画像つきツイートを格納したデータフレームを縦に結合する。
- ステップ2 : 結合したデータフレームから重複行を削除する。
お気づきの通り、指定ユーザーが元々全く同じつぶやきを何回もしていた場合はそのツイートは削除されてしまいます。
ですが、今回の案件ではあまりその心配をする必要は無いっぽかったので、ここはそのままにしておきました。
1,2,3のステップを実行するには、以下のmain.shを実行します。
sh main.sh
echo "まずtweetをスクレイピングします。処理にしばらく時間がかかります。"
twint -u $1 -o all-tweet.csv --csv
twint -u $1 -o tweet-image-only.csv --csv --images
echo "pythonでcsvを処理して画像つきのものを除外します。"
python3 remove-tweets-with-image.py
同ディレクトリに以下のPythonファイル(remove-tweets-with-image.py)を置いておけば正常に実行できます。
import csv
import pandas as pd
col_names=["id","conversation_id","created_at","date","time","timezone","user_id","username","name","place","tweet","language","mentions","urls","photos","replies_count","retweets_count",
"likes_count","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"
]
all_tweets_df = pd.read_csv("all-tweet.csv", names = col_names)
tweets_with_images_df=pd.read_csv("tweet-image-only.csv",names = col_names)
df_concat = pd.concat([tweets_with_images_df, all_tweets_df])
df_concat = df_concat[df_concat.duplicated(keep=False,subset='id')==False]
df_concat.to_csv("result.csv")
目的の成果物が、result.csvとして吐き出されているはずです。
ちなみに、自分のリポジトリにコードをまとめてあります。
【補足】TwitterのAPIを利用してツイートを取得する方法もある
twitterはAPIを一般公開しています。
なので、PythonからAPIを使ってツイートを取得することもできます。
詳細なやり方については以下の動画講座が詳しいです。
・TweepyによるTwitter APIを利用したpythonプログラム開発
ただ取得するだけでなく、
- 定期的にツイートや画像、動画を保存する
- 取得したデータをwordpressに保存する
- twetter bot開発
といったトピックも網羅されているのでこういったことがやりたい場合はオススメです。
※ Python初心者でAPIというもの自体がよく分からないという場合は下のリンク先の方がオススメかもです。
・ プログラミングを業務で活かす!PythonによるWeb API活用講座
こちらではtwitter以外にも
- Googleスプレッドシート
- gmail
- LINE Notify API
- 楽天市場
- slack
などのAPI操作が一気に学べて、プログラムから自動操作できるようになります。
その他、webスクレイピングについて知りたい方は下記動画講座が役立つと思います。
(スクレイピングとは、プログラムを使ってwebサイトから自動的にデータを取得していくことを指します)