Elsaの技術日記(徒然なるままに)

主に自分で作ったアプリとかの報告・日記を記載

MENU

go言語でのTwitter画像データ収集

先日、go言語でTwitterへの自動投稿とデータを収集する方法についてまとめました。
elsammit-beginnerblg.hatenablog.com

今回はTwitterに投稿されている画像を収集する方法についてまとめておこうと思います!!
f:id:Elsammit:20210116185559j:plain

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は最新トレンドなどのデータが豊富なので、データ解析とかに流用できますね。
後でやってみようかな?🤔

■参考
https://qiita.com/mpppk/items/dc1743fc8b3aa3116e70