Python TweepyでTweet取得(search_full_archive)

[Pythonパッケージの`tweepy`](https://www.tweepy.org/)を使ってTweet取得しました。少し前に短期間で実装したので、記憶が曖昧な部分も多いのですが、とりあえず記録に残しておきます。
[`search_tweets`関数](https://docs.tweepy.org/en/stable/api.html#tweepy.API.search_tweets)を使う記事は多かったのですが、[`search_full_archive`関数](https://docs.tweepy.org/en/stable/api.html#tweepy.API.search_full_archive)を扱う記事が少なかったので残しておきます。[`search_tweets`関数](https://docs.tweepy.org/en/stable/api.html#tweepy.API.search_tweets)は直近のTweetしか検索できません。

そもそもAPIのバージョンを意識しないでコピペしたので、`Tweepy`のAPI V1.1を使っています(v2が最新)。V2のやり方を知りたい人はこちら。

https://zero-cheese.com/8436/

# 環境

|Python/パッケージ|Version|
|:-:|:-:|
|Python|3.9.13|
|tweepy|4.10.1|
|pandas|1.4.3|

# 手順
## 前提
Twitter APIの申請が終わっていることです。申請手順は先程と同じリンクに従えばすぐ終わります。

https://zero-cheese.com/8436/

## 1. Sandbox作成
[`search_full_archive`関数](https://docs.tweepy.org/en/stable/api.html#tweepy.API.search_full_archive)はsandbox環境であれば無料で使用できます。そのための設定が必要です。以下のURLからDeveloper Portalにアクセス。

https://developer.twitter.com/en/account/environments

「Setup Environment」ボタンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/42a7ed08-a7ad-cfcc-1dcb-e98d328c3d52.png)

"Dev environment label"にPython側で指定する名前を入れ、"App"に申請したアプリケーション名を入力。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/bfb92811-a4c5-1391-e5d7-32f3f74170ea.png)

## 2. コードによる取得
適当なクエリで検索。`-is_retweet -RT`でリツイート除去しています(もっと賢いリツイート除去方法があるかもしれない)。
認証部分はご自身で入れてください。

```python
import pandas as pd
import tweepy

def get_twitter_api():
    auth = tweepy.OAuthHandler(<CONSUMER_KEY>, <CONSUMER_SECRET>)
    auth.set_access_token(<ACCESS_TOKEN, <ACCESS_SECRET>)
    return tweepy.API(auth)

api = get_twitter_api()

tweets = tweepy.Cursor(api.search_full_archive, label='sandbox', 
          fromDate="201001010000", query='安倍晋三 -is_retweet -RT')\
                       .items(100)
        #取得したツイートを一つずつ取り出して必要な情報をtweet_dataに格納する
tw_data = []
LABELS=['ツイート時刻', 'ツイート本文', 'いいね数', 'リツイート数', '返信数', 'place']

for tweet in tweets:
            #tweet_dataの配列に取得したい情報を入れていく
    tw_data.append([
                tweet.created_at,  #UTCだったかも
                tweet.text,
                tweet.favorite_count, 
                tweet.retweet_count, 
                tweet.reply_count, 
                tweet.place
                       ])
df = pd.DataFrame(tw_data,columns=LABELS)
print(df)
```

取得結果。

```txt
                                               ツイート本文  いいね数  リツイート数  返信数 place  
0   #この人を国葬って正気ですか\nこのタグ使ってる奴らのツイート見れば、自民公明以外も宗教との...     0       0    0  None  
1              安倍晋三に相応しい巨匠ですね https://t.co/4aDHALaVnV     0       0    0  None  
2   安倍晋三さんのどこが国葬に値しない政治家なのか誰か教えてくれ(執筆:フジテレビ　上席解説委員...     0       0    0  None  
3   #マイあさ\n安倍晋三氏の葬儀は、旧統一協会、国民会議、連立与党の公明党と合同し、自由民主党...     0       0    0  None  
4   #この人を国葬って正気ですか \n例えるなら超みたいに理不尽な仕打ちをする全王に怒らずにダン...     0       0    0  None  
..                                                ...   ...     ...  ...   ...  
95      @MeMe79968641 @kazu10233147 統一教会よりも恐ろしい安倍晋三教。     0       0    0  None  
96  安倍晋三さんのどこが国葬に値しない政治家なのか誰か教えてくれ | FNNプライムオンライン ...     0       0    0  None  
97  安倍晋三さんのどこが国葬に値しない政治家なのか誰か教えてくれ(FNNプライムオンライン)\n...     0       0    1  None  
98  #自民党気持ち悪い \nこの展開だとフリーザが安倍晋三真理教の信者に敵視されていてデマや誹謗...     0       0    0  None  
99  安倍晋三さんのどこが国葬に値しない政治家なのか誰か教えてくれ（FNNプライムオンライン） -...     3       0    0  None  
```

## おまけ: メンションとリンク除去
メンションとリンクを後でツイート本文から除去しています(ハッシュタグは除去なし)。

```python
import re
line = re.sub(r"@(\w+) ", "", line)
line = re.sub(r"https?://[\w/:%#\$&\?\(\)~\.=\+\-\"]+", "", line)
```