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文を用いるのを嫌う傾向があります。