13
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-08-20

#1. 本記事とは?

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

以下二つの記事の組み合わせに少しの追加を加えたものです。
・ruby版(参考にさせていただきました。)
MechanizeでTwitterアナリティクスのデータエクスポートを自動化する
・python でtwitterにログイン
Python Seleniumでtwitterのログインからリプライするbot
#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()
スクリーンショット 2019-08-20 23.53.42.png
second.py
element_login=driver.find_element_by_xpath("/html/body/div[4]/div[4]/ul/li[1]")
スクリーンショット 2019-08-21 0.00.32.png
third.py
driver.find_element_by_xpath("//*[@id='export']/button")

スクリーンショット 2019-08-21 0.01.44.png

xpathを利用する際の参考
【超便利】PythonとSeleniumでブラウザを自動操作する方法まとめ

#4.AWSで実行しようとした際にはまった点を紹介
上のコード実行した際のエラー
1.

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で画面遷移した後の画面で要素が取得できない問題の解消

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環境を最短で構築する
Amazon Linux上で、Python + Selenium + Headless Chromeを使用してWEBスクレイピング
を参考にバージョンを合わせることと、

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スクレイピングする
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ファイルをダウンロードしたい時の対処法
上の記事で紹介されていた記事
に書いてあるコードを挿入することで解決。

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

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

$ crontab -e
* * * * * * bash -l -c "python ~/python.py"

#一つ目の*は「分」
#二つ目の*は「時」を表す。
#この二つで、毎日~時~分に実行できるようになるため十分だと思います。
#丁寧に説明すると、上のコードを書いた後、
[esc]を押して、
次は : を押して、
最後に wq を入力して
[enter] で保存完了。

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

13
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?