R言語を使ってTwitterのタイムライン上の画像をすべて保存する

概要

機械学習の素材にしたり、Twitter上で特定のジャンルの画像を集めたりする目的で、Twitterのタイムラインに流れてくる全ての画像をダウンロードできるコードをRで書きました。例えば、「このアカウントに流れてくる画像をすべて保存したいけれども、いちいちダウンロードするのは面倒」というときにお使いください。なおこのコードは、一日一回実行されることを前提に、当日投稿された画像のみを保存します。
R(studio)を日常的に使っている方は、rtweetの設定のみ行えば、そのままこのコードを使うことができると思います。
notchained.hatenablog.com

注意

rtweetパッケージはTwitterからapiを用いたデータ取得を行います。データの使用目的や手法などはTwitterのdeveloper policyに則っている必要があります。
developer.twitter.com

コード

コードは以下の通りです。
「アカウント名」「保存先のディレクトリ」の部分は自身の目的・環境に合わせて入力してください。

なお初めてRを使用する際にはこのコードも実行しておく必要があります。また、rtweetパッケージを最初に使う際にも設定が必要なようです。(詳細上述)

install.packages("rtweet")
install.packages("dplyr")
install.packages("stringr")
コード
library(rtweet)
library(tidyverse)
library(stringr)

#Set date with system
today <- Sys.Date()
today <- as.character(today)

#get timeline data
tweets <- get_timeline("アカウント名", n=10000, home = TRUE)

#sort tweets with media only, posted today
media <- tweets %>%
  filter(!is.na(media_expanded_url))
relevant <- media %>%
  filter(created_at >= today)

#Get media URLs
URLs <- relevant %>%
  select(ext_media_url)

#####################################################################
#Split URLs into 2 groups
URLs_1 <- URLs %>%
  filter(str_detect(ext_media_url, "^http"))
URLs_2 <- URLs %>%
  filter(str_detect(ext_media_url, "^c"))

##For group 2, convert charactor into list
length_2 <- nrow(URLs_2)
t <- as.character(URLs_2[1, "ext_media_url"])
t <- str_sub(t, start = 6)
t <- str_sub(t, end = -2)
t <- eval(parse(text = t))
df_2 <- as.data.frame(t)
for (i in 2:length_2) {
  t <- as.character(URLs_2[i, "ext_media_url"])
  t <- str_sub(t, start = 6)
  t <- str_sub(t, end = -2)
  t <- eval(parse(text = t))
  temp_frame <- as.data.frame(t)
  df_2 <- merge(df_2, temp_frame, all = T)
}
colnames(df_2) <- "ext_media_url"

#merge group 1 and 2
URLs_1 <- as.data.frame(URLs_1)
URLs <- rbind(URLs_1, df_2)
####################################################

length <- nrow(URLs)

for (i in 1:length) {
  temp <- as.character(URLs[i, "ext_media_url"])
  num <- paste("保存先のディレクトリ/",i,".jpg",sep="")
  filepath <- num
  download.file(temp, filepath, mode = "wb")
  Sys.sleep(1)
}

*R上級者はRでfor文を用いるのを嫌う傾向があります。