【Python】条件指定してツイートの情報を取得し、CSVファイルに出力

## はじめに
TwitterAPIを用いて、人気のツイートにどの様な特徴があるかなどのデータ分析をする際に、ツイートを取得するかと思いますが、その際のツイートの検索条件の指定の仕方、及び取得したツイートの情報をCSVファイルに出力させる方法を説明していきたいと思います。

TwitterAPIを使用するにあたっての説明については[こちらの記事](https://qiita.com/afonomics/items/98a6b7dd011844ed797b)を参考にしてください

## 検索条件の指定

まずは、検索条件の指定の仕方から。

Twitterの検索術に関しては[こちら](https://gist.github.com/cucmberium/e687e88565b6a9ca7039)を参考にしました。

では、コードを書いていきましょう。
<br>

~~~tweet.py
import tweepy
from config import CONFIG

CONSUMER_KEY = CONFIG["CONSUMER_KEY"]
CONSUMER_SECRET = CONFIG["CONSUMER_SECRET"]
ACCESS_TOKEN = CONFIG["ACCESS_TOKEN"]
ACCESS_SECRET = CONFIG["ACCESS_SECRET"]

auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_SECRET)
api = tweepy.API(auth)

tweet_data = [] #取得したツイートを格納するリスト

for tweet in api.search(q="映画 min_faves:500 min_retweets:500 exclude:retweets",tweet_mode='extended',count=10):
    try:
        tweet_data.append([tweet.id, tweet.user.screen_name, tweet.created_at, tweet.full_text.replace('\n',''), tweet.favorite_count, tweet.retweet_count, tweet.user.followers_count, tweet.user.friends_count])
    except Exception as e:
        print(e)
~~~
<br>

APIのキーの設定や、インスタンスの作成の説明は割愛させていただきます。
そちらの説明に関しては[こちらの記事](https://qiita.com/starcoffee66/items/cd61fd187d26c245e37d)を参考にしてください。

まずは、取得したツイートを格納するリストを作成します。
`tweet_data = []`

次に、`api.search()`でツイートの検索を行なっているわけですが、この引数の記述で検索条件を細かく指定しています。

`q=`の部分から見ていきましょう。
`"映画 min_faves:500 min_retweets:500 exclude:retweets"`と記述されていますが、それぞれの意味について解説します。

`映画`              検索するキーワード
`min_faves:500`    いいね数が500以上
`min_retweets:500` リツイート数が500以上
`exclude:retweets` 検索結果にリツイートを含まない

この検索結果にリツイートを含まないというのは、ツイートを取得する際にリツイートも含んでしまうと、同じツイート内容が重複するため、それを回避するために指定しています。

他にも、`filter:images`や、`filter:videos`などを`q=`に含めると、画像付きのツイートや動画付きのツイートで検索することもできます。

次に、`tweet_mode='extended'`を指定することで、ツイートの本文が長い場合に、途切れない様にしています。
※デフォルトでは途切れてしまうため。

### 取得したツイートの中から扱う値の指定

下記のコードの部分で取得したツイートをリストに格納しています。
<br>

~~~
 tweet_data.append([tweet.id, tweet.user.screen_name, tweet.created_at, tweet.full_text.replace('\n',''), tweet.favorite_count, tweet.retweet_count, tweet.user.followers_count, tweet.user.friends_count])
~~~
<br>
`.append`する際に、引数を指定していますが、ここで取得したツイートの中から扱う値の指定をしています。

`tweet.id` ツイートIDの取得
`tweet.user.screen_name` ユーザーネームの取得
`tweet.created_at` ツイート日時の取得
`tweet.full_text.replace('\n','')` ツイート本文を改行を取り除いた上で取得
`tweet.favorite_count` いいね数の取得
`tweet.retweet_count` リツイート数の取得
`tweet.user.followers_count` フォロワー数の取得
`tweet.user.friends_count` フォロー数の取得

これで上記で指定した内容が、`tweet_data`に`count`で指定した分格納されていることになります。

では、ツイートの取得ができたので、CSVファイルに書き出しましょう。

## CSVファイルへの書き出し
<br>

~~~tweet.py
import csv #CSVライブラリの読み込み

## 以下省略

## 一番下に追記
with open('tweet_test.csv', 'w',newline='',encoding='utf-8') as f:
    writer = csv.writer(f, lineterminator='\n')
    writer.writerow(["id","user","created_at","text","fav","RT","follower","follows"])
    writer.writerows(tweet_data)
pass

~~~
<br>

上記のコードを追記してください。

CSVファイルへの書き出しについての細かい説明に関しては、[こちらの記事](https://note.nkmk.me/python-csv-reader-writer/)を参考にしてください。

簡単な説明だけします。

~~~
with open('tweet_test.csv', 'w',newline='',encoding='utf-8') as f:
~~~

この`'tweet_test.csv'`の部分でcsvのファイル名を指定しています。
<br>

~~~
writer.writerow(["id","user","created_at","text","fav","RT","follower","follows"])
~~~

`writer.writerow()`で、カラム名を設定しています。

先ほど行なった作業で

>ツイートID
>ユーザーネーム
>ツイート日時
>ツイート本文
>いいね数
>リツイート数
>フォロワー数
>フォロー数

の順番で値を格納しているので、この値に合わせて、カラム名を指定しています。

そして、`writer.writerows(tweet_data)`で書き出すデータを指定しています。

### 完成したコード

~~~tweet.py
import tweepy
import csv
from config import CONFIG

CONSUMER_KEY = CONFIG["CONSUMER_KEY"]
CONSUMER_SECRET = CONFIG["CONSUMER_SECRET"]
ACCESS_TOKEN = CONFIG["ACCESS_TOKEN"]
ACCESS_SECRET = CONFIG["ACCESS_SECRET"]

auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_SECRET)
api = tweepy.API(auth)

tweet_data = [] #取得したツイートを格納するリスト

for tweet in api.search(q="映画 min_faves:500 min_retweets:500 exclude:retweets",tweet_mode='extended',count=10):
    try:
        tweet_data.append([tweet.id, tweet.user.screen_name, tweet.created_at, tweet.full_text.replace('\n',''), tweet.favorite_count, tweet.retweet_count, tweet.user.followers_count, tweet.user.friends_count])
    except Exception as e:
        print(e)

with open('tweet_test.csv', 'w',newline='',encoding='utf-8') as f:
    writer = csv.writer(f, lineterminator='\n')
    writer.writerow(["id","user","created_at","text","fav","RT","follower","follows"])
    writer.writerows(tweet_data)
pass
~~~

<br>
このプログラムを実行すると、映画というワードを含み、ファボとRTが500以上でRTを含まないツイートが10件取得でき、取得したツイートをCSVファイルに書き出せます。

これでいくつかの条件で取得し、取得したデータをグラフにしたり、形態素分析に繋げられるかと思います。