【Python3】Twitterから特定ユーザーの画像無しのツイートのみを取得する方法

**やりたいこと**

- ツイッターから特定ユーザーのツイートのみを大量に取得したい  
- 画像付きのツイートは除外する

最近関係している業務で、↑のような状況が発生したので、やり方をメモっておきます。




## Twitterから特定ユーザーのツイートを取れるだけ取得する方法

ユーザーを指定して、ツイートを大量取得する方法はいくつかありますが、今回はtwintというツールを使用します。

参考：[Twint](https://github.com/twintproject/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. 画像ありツイートのみを取得する
3. 1から2と重複する箇所を削除する

1,2はコマンドで、3はPythonコードで行います。
また、3のステップをより正確に記述すると、以下のような感じです。


- ステップ1 : 全てのツイートを格納したpandasのデータフレームと、画像つきツイートを格納したデータフレームを縦に結合する。  
- ステップ2 : 結合したデータフレームから重複行を削除する。

お気づきの通り、指定ユーザーが元々全く同じつぶやきを何回もしていた場合はそのツイートは削除されてしまいます。
ですが、今回の案件ではあまりその心配をする必要は無いっぽかったので、ここはそのままにしておきました。




1,2,3のステップを実行するには、以下のmain.shを実行します。  

`sh main.sh`

```bash: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）を置いておけば正常に実行できます。

```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として吐き出されているはずです。


ちなみに、[自分のリポジトリ](https://github.com/ykimura517/get-tweets-without-img)にコードをまとめてあります。

## 【補足】TwitterのAPIを利用してツイートを取得する方法もある


twitterはAPIを一般公開しています。
なので、PythonからAPIを使ってツイートを取得することもできます。

詳細なやり方については以下の動画講座が詳しいです。

・<a href="https://px.a8.net/svt/ejp?a8mat=3BBPJR+AVRCOQ+3L4M+BW8O2&a8ejpredirect=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Ftweepy-twitter-python%2F" rel="nofollow">TweepyによるTwitter APIを利用したpythonプログラム開発</a>

ただ取得するだけでなく、

- 定期的にツイートや画像、動画を保存する
- 取得したデータをwordpressに保存する
- twetter bot開発

といったトピックも網羅されているのでこういったことがやりたい場合はオススメです。


※ Python初心者でAPIというもの自体がよく分からないという場合は下のリンク先の方がオススメかもです。
・ <a href="https://px.a8.net/svt/ejp?a8mat=3BBPJR+AVRCOQ+3L4M+BW8O2&a8ejpredirect=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fpython-web-api%2F" rel="nofollow">プログラミングを業務で活かす！PythonによるWeb API活用講座</a>

こちらではtwitter以外にも

- Googleスプレッドシート
- gmail
- LINE Notify API
- 楽天市場
- slack

などのAPI操作が一気に学べて、プログラムから自動操作できるようになります。



その他、webスクレイピングについて知りたい方は下記動画講座が役立つと思います。
（スクレイピングとは、プログラムを使ってwebサイトから自動的にデータを取得していくことを指します）

・<a href="https://px.a8.net/svt/ejp?a8mat=3BBPJR+AVRCOQ+3L4M+BW8O2&a8ejpredirect=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fpython-scraping-beginner%2F" rel="nofollow">PythonによるWebスクレイピング&#12316;入門編&#12316;【業務効率化への第一歩】</a>
<img border="0" width="1" height="1" src="https://www12.a8.net/0.gif?a8mat=3BBPJR+AVRCOQ+3L4M+BW8O2" alt="">