先日、go言語でTwitterへの自動投稿とデータを収集する方法についてまとめました。
elsammit-beginnerblg.hatenablog.com
今回はTwitterに投稿されている画像を収集する方法についてまとめておこうと思います!!
Twitter APIが使用できることを前提に記載しますので、Twitter APIの登録等、事前準備が必要な方は、
https://elsammit-beginnerblg.hatenablog.com/entry/2021/01/15/215142
へアクセスの上、準備を完了させてください。
■画像付きtweetの抽出と画像URL収集
まずはTwitter APIにて画像付きtweetの抽出と画像のURLを収集していきます。
コードはこちらのようになります。
v := url.Values{} v.Set("count", "20") searchResult, _ := api.GetSearch("検索ワード exclude:retweets filter:images", v) tweets := searchResult.Statuses for _, tweet := range tweets { for _, entityMedia := range tweet.ExtendedEntities.Media { mediaRawUrl := entityMedia.Media_url_https Println(mediaRawUrl) } }
前回のTwitter抽出と異なるのは、
tweets := searchResult.Statuses for _, entityMedia := range tweet.ExtendedEntities.Media { mediaRawUrl := entityMedia.Media_url_https Println(mediaRawUrl) }
となります。
文字列を収集するコードは
for _, tweet := range searchResult.Statuses { Println(tweet.CreatedAt, tweet.Text) }
でした。
tweetsに格納されたデータから、
entityMedia := range tweet.ExtendedEntities.Media
のようにメディアデータのみを抽出し、
mediaRawUrl := entityMedia.Media_url_https ||<[ にて、メディアデータからURLを抽出しています。 ■URLから画像ダウンロードと保存 Twitterからの画像データ収集とは少しずれますが、画像をダウンロードするコードについても載せておきます。 コードはこちら。 fileUrlは画像が格納されたURL、 downloadPath は画像を格納するファイルパス、 となります。 >|go| func DownloadFile(fileUrl, downloadPath string) string { response, err := http.Get(fileUrl) if err != nil { return "failed to request" } defer func() { cerr := response.Body.Close() if cerr == nil { return } }() file, err := os.Create(downloadPath) if err != nil { return "Create Error" } _, aerr := io.Copy(file, response.Body) if aerr != nil { return "failed to write download" } return "ok" }
実施していることは、
こちらのコードにてGet requestを行い、
responseデータを収集。
response, err := http.Get(fileUrl) if err != nil { return "failed to request" } defer func() { cerr := response.Body.Close() if cerr == nil { return } }()
そして、Create関数にてパスで指定されたファイルを生成。
file, err := os.Create(downloadPath) if err != nil { return "Create Error" }
最後にresponseデータからBody(今回は画像データ)を先ほど作成した画像ファイルにコピー。
_, aerr := io.Copy(file, response.Body) if aerr != nil { return "failed to write download" }
■(参考)画像収集コードを載せておきます。
先ほどのコードを組み合わせてこちらのようなコードを作成しました。
func main() { api := GetTwitterApi() v := url.Values{} v.Set("count", "20") searchResult, _ := api.GetSearch("検索ワード exclude:retweets filter:images", v) tweets := searchResult.Statuses image := "./dir/image.jpg" i := 0 for _, tweet := range tweets { for _, entityMedia := range tweet.ExtendedEntities.Media { mediaRawUrl := entityMedia.Media_url_https Println(mediaRawUrl) image = "./dir/image_" + strconv.Itoa(i) + ".jpg" ret := DownloadFile(mediaRawUrl, image) println(ret) time.Sleep(time.Millisecond * 500) i = i + 1 } } }
※GetTwitterApi()は前回の投稿を参考。
Twitterの投稿データを
./dir配下に、image_0.jpg~image_N.jpg(Nはツイッターから収集できた画像データ数)
の名前で保存していきます。
短期間にTwitterにアクセスしてしまうとTwitter社に迷惑がかかるので、
time.Sleep(time.Millisecond * 500)
にて、定期的に待ちを入れました。
■最後に
今回はTwitterから画像データの収集方法についてまとめました。
Twitterは最新トレンドなどのデータが豊富なので、データ解析とかに流用できますね。
後でやってみようかな?🤔