kivantium活動日記

プログラムを使っていろいろやります

Tweepyで画像を収集する (WIP)

機械学習をするためにはデータが必要なので、頑張って集める必要があります。 とりあえずTweepyで取れるだけ取る方法をいろいろ考えていきます。

Cursorを使う

Tweepyが標準で用意しているCursorというクラスを使ってタイムラインからRate Limitの許す限り画像を収集するコードは次のようになりました。

# -*- coding: utf_8 -*-

import os
import tweepy
import urllib.request
from urllib.parse import urlparse
from pprint import pprint


consumer_key = 'xxxxxxxxxxxxxxxxxxxxxxxxx'
consumer_secret = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
access_token = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
access_secret = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_secret)
api = tweepy.API(auth, wait_on_rate_limit=True, wait_on_rate_limit_notify=True)

for tweet in tweepy.Cursor(api.home_timeline).items():
    if 'media' in tweet.entities:
        for media in tweet.extended_entities['media']:
            media_url = media['media_url']
            filename = os.path.basename(urlparse(media_url).path)
            try:
                urllib.request.urlretrieve(media_url, filename)
                print("Saved :", filename)
            except IOError:
                print("Failed to save the image from", media_url)

しかし、GET statuses/home_timelineは15分に15回しか呼び出すことができません(ドキュメント)。1回あたり20ツイート取得できるので15分で300件のツイートしか取得できないことになります。(countというパラメータがありますが、実験してみるとcountに大きい値を指定するとその分呼べる回数が減るようで、止まるまでに取得できるツイート数はあまり変わりませんでした。

タイムラインに常駐してツイートを収集しつづけるタイプのプログラムを書く必要がありますが、それはCursorでは実現できなさそうなので真面目に考える必要がありそうです。

友利奈緒判定botのときもRate Limitに悩まされたし、一生Rate Limitと戦っている……

明日以降のためのメモ

広告コーナー