PythonでTwitter analyticsのデータエクスポート(ツイートの詳細情報[インプレッション・エンゲージメント・いいね・リツイートなど]のレポート)を自動取得

#1. 本記事とは？

Pythonを用いて、Twitterアナリティクスのデータエクスポートを自動化した。
・Twitterアナリティクスのデータエクスポート
　　- 詳細なツイート情報を取得できる。
　　- 取得できるのは自分のツイートのみ
　　- 認証は不要
・twitter api
　　- どのツイートでも取得可能
　　- 詳細な情報は取得できない
　　- 認証が必要
　　- 自動でツイートする機能がある
　　- 取得できる情報はツイート本文、いいね、リツイート数など

以下二つの記事の組み合わせに少しの追加を加えたものです。
・ruby版(参考にさせていただきました。)
[MechanizeでTwitterアナリティクスのデータエクスポートを自動化する](https://qiita.com/Feburic/items/20590d02152e06faf502)
・python でtwitterにログイン
[Python Seleniumでtwitterのログインからリプライするbot](https://qiita.com/sugusan/items/3cf6c30d07ae0dc28e1f)
#2 コード
```python.py
import time
from selenium import webdriver

# 各種設定
# twitterアカウント
account = '~~~~~~~@gmail.com' #メールアドレスを推奨(user_id or メールアドレス)
password = '〜password〜'


# Twitterログイン実行する処理

# ログインページを開く
URL="https://analytics.twitter.com/user/[user_id]/tweets"#[user_id]には、自分のユーザーID
driver = webdriver.Chrome("〜chromedriverのPATH〜")
driver.get(URL)
time.sleep(3)  # 動作止める
# accountを入力する
element_account = driver.find_element_by_class_name("js-username-field")
element_account.send_keys(account)
time.sleep(3)  # 動作止める
# パスワードを入力する
element_pass = driver.find_element_by_class_name("js-password-field")
element_pass.send_keys(password)
time.sleep(3)  # 動作止める
# ログインボタンをクリックする
element_login = driver.find_element_by_xpath('//*[@id="page-container"]/div/div[1]/form/div[2]/button')
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
element_login.click()
time.sleep(3)  # 動作止め

#7日version
driver.find_element_by_class_name('daterange-selected').click()
time.sleep(3)
element_login=driver.find_element_by_xpath("/html/body/div[4]/div[4]/ul/li[1]")
element_login.click()
time.sleep(3)
element_login=driver.find_element_by_xpath("//*[@id='export']/button")
element_login.click()
time.sleep(5)

#28日version
#driver.find_element_by_xpath("//*[@id='export']/button")
#time.sleep(3)
```
#3 補足
```first.py
driver.find_element_by_class_name('daterange-selected').click()
```
<img width="1238" alt="スクリーンショット 2019-08-20 23.53.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273482/2ad0110d-4f96-e0cc-5c4c-c35168ffd0ff.png">

```second.py
element_login=driver.find_element_by_xpath("/html/body/div[4]/div[4]/ul/li[1]")
```



<img width="1232" alt="スクリーンショット 2019-08-21 0.00.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273482/5e1dc6aa-2d01-a0a2-dc37-9ab2b5a2063b.png">

```third.py
driver.find_element_by_xpath("//*[@id='export']/button")

```
<img width="1221" alt="スクリーンショット 2019-08-21 0.01.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273482/b32393f9-6f38-6e9c-1bc6-796aba0f6e94.png">

xpathを利用する際の参考
[【超便利】PythonとSeleniumでブラウザを自動操作する方法まとめ](https://tanuhack.com/python/selenium/#i-6)

#4.AWSで実行しようとした際にはまった点を紹介
上のコード実行した際のエラー
1.
```selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":".daterange-selected"}
  (Session info: headless chrome=76.0.3809.100)
```
=>```account = '~~~~~~~@gmail.com' #メールアドレスを推奨(user_id or メールアドレス) ```
のところをuser_idで実行していたところ、ログインできない場合がありメールアドレスで実行して解決。
この時のデバックで参考にさせていただいた記事
[Seleniumで画面遷移した後の画面で要素が取得できない問題の解消](https://qiita.com/ymk1102_1t/items/42aa7c588ce97e3312b6)
```print(driver.current_url)
```を入れ込む。
2.
```selenium.common.exceptions.WebDriverException: Message: unknown error: Chrome failed to start: exited abnormally
  (Driver info: chromedriver=2.34.522913 (36222509aa6e819815938cbf2709b4849735537c),platform=Linux 4.9.20-10.30.amzn1.x86_64 x86_64)```
と
```Message: unknown error: call function result missing 'value'
```
=>aws にダウンロードしたchromeとchoromdriveのバージョンが違う場合に発生する。
[Amazon LinuxでSelenium環境を最短で構築する](https://qiita.com/onorioriori/items/4fa271daa3621e8f6fd9)
[Amazon Linux上で、Python + Selenium + Headless Chromeを使用してWEBスクレイピング](https://oliversi.com/2019/01/06/python-aws-selenium-chrome/)
を参考にバージョンを合わせることと、

```
options = webdriver.ChromeOptions()
options.add_argument('--no-sandbox')
options.add_argument("start-maximized")
options.add_argument("--disable-dev-shm-usage")
options.add_argument("disable-infobars")
options.add_argument('--disable-extensions')
options.add_argument('--headless')
options.add_argument('--disable-gpu')
driver = webdriver.Chrome(options=options)

```
などのオプションを指定することで解決。

[AWS Lambda(Python3)でSelenium + Chrome Headless + でwebスクレイピングする](https://www.yamamanx.com/aws-lambdapython3-selenium-chrome-headless/)
[chromedriver インストールメモ](https://www.ytyng.com/blog/ubuntu-chromedriver/)

を参考にして解決。
3.
2で、以下のコードを用いたことでcsvデータのダウンロードができない問題が生じる。

```
options.add_argument('--headless')
```

[解決策]

```
def enable_download_in_headless_chrome(browser, download_dir):
    #add missing support for chrome "send_command"  to selenium webdriver
    browser.command_executor._commands["send_command"] = ("POST", '/session/$sessionId/chromium/send_command')

    params = {'cmd': 'Page.setDownloadBehavior', 'params': {'behavior': 'allow', 'downloadPath': download_dir}}
    browser.execute("send_command", params)


enable_download_in_headless_chrome(driver, "〜保存したいフォルダ名〜")
```
[[Selenium] ヘッドレスモードでCSVファイルをダウンロードしたい時の対処法](https://nobuhiroharada.com/2018/06/30/headlesss-csv-download/)
[上の記事で紹介されていた記事](https://bugs.chromium.org/p/chromium/issues/detail?id=696481#c86)
に書いてあるコードを挿入することで解決。

#プラスで補足
crontabで自動でコードを実行する。

```
#crontabで編集可能になる。
#crontab -rはcrontabの内容が消えてしまうので注意する。

$ crontab -e
```

```
* * * * * * bash -l -c "python ~/python.py"

#一つ目の*は「分」
#二つ目の*は「時」を表す。
#この二つで、毎日~時~分に実行できるようになるため十分だと思います。
```

```
#丁寧に説明すると、上のコードを書いた後、
[esc]を押して、
次は : を押して、
最後に wq　を入力して
[enter]　で保存完了。
```

#5.まとめ
色々とはまっちゃいましたが、seleniumのお勉強が十分できました。
この後の分析は、
[【Pythonによるデータ分析①】Pythonでツイッターのオリジナルデータから、拡散されやすいツイートを分析してみよう！](https://note.mu/daikawai/n/nb47e68957bf0)
などでお勉強して分析してみるのもいいですね。