Twitterにアップロードした(された)画像を一括でダウンロードできるスクリプトを作りました。
Twitterのページの、画像/動画部分に表示されている画像をダウンロードできます。ただし、外部サイトにアップロードされた画像のダウンロードには対応していません。
動作には、Twython(Python用のTwitterライブラリ)が必要です。
(準備)twythonのインストール
$ pip install twython
画像の一括ダウンロード
Twitterのアプリケーションキーを持っていない場合は、My applications | Twitter Developersから発行する必要があります。アプリケーション作成後、My applicationsからアプリケーションを選択し、OAuth toolタブからConsumer Key等を確認できます。
TwitterAPIの利用回数制限を超えないように適当にスリープを挟んでいますが、ダウンロードする数が少ない場合は必要ないかもしれません。また、既に同一名の画像がダウンロードされている場合には、再ダウンロードを行わないようになっています。
以下、ダウンロード用のスクリプトです。
#!/usr/bin/env python # -*- coding: utf-8 -*- import os import time import urllib2 from twython import Twython u""" ツイッターで投稿された画像を一括でダウンロードする """ # 画像を保存するディレクトリ(予め作成しておく) # 各ユーザの画像は、./images/screen_name/ 内に保存される IMAGES_DIR = './images/' # Twitter 認証関係 https://dev.twitter.com/apps # Consumer key CK='Consumer keyをここに記入' # Consumer secret CS='Consumer secretをここに記入' # Access token ATK='Access tokenをここに記入' # Access token secret ATS='Access token secretをここに記入' # 取得するツイート数の最大値の設定(以下の2つの値の積) NUM_PAGES = 5 # 取得するページ数 TWEET_PER_PAGE = 200 # 1ページあたりのツイート数(最大200) # 画像をダウンロードするユーザのスクリーン名を1行に1人ずつ記入する(@の有無は問わない) SCREEN_NAMES = ''' screen_name_1 screen_name_2 @screen_name_3 ''' class TwitterImageDownloader(object): u"""Twitterから画像をダウンロードする""" def __init__(self): super(TwitterImageDownloader, self).__init__() self.twitter =Twython(app_key=CK, app_secret=CS, oauth_token=ATK, oauth_token_secret=ATS) def read_ids(self): ids_all = [line.replace('@', '') for line in SCREEN_NAMES.splitlines() if line] ids = sorted(list(set(ids_all))) return ids def get_timeline(self, screen_name): max_id = '' url_list = [] for i in xrange(NUM_PAGES): try: print 'getting timeline : @', screen_name, (i+1), 'page' tw_result = (self.twitter.get_user_timeline(screen_name=screen_name, count=TWEET_PER_PAGE, max_id=max_id) if max_id else self.twitter.get_user_timeline(screen_name=screen_name, count=TWEET_PER_PAGE)) time.sleep(5) except Exception as e: print "timeline get error ", e break else: for result in tw_result: if 'media' in result['entities']: media = result['entities']['media'] for url in media: url_list.append(url['media_url']) max_id = result['id'] if len(tw_result) < TWEET_PER_PAGE: break return url_list def create_folder(self, save_dir): try: os.mkdir(save_dir) except Exception as e: print 'cannot make dir', e file_list = os.listdir(save_dir) return file_list def get_file(self, url, file_list, save_dir): file_name = url[url.rfind('/')+1:] url_large = '%s:large'%(url) if not file_name in file_list: save_path = os.path.join(save_dir, file_name) try: print "download", url_large url_req = urllib2.urlopen(url_large) except Exception as e: print "url open error", url_large, e else: print "saving", save_path img_read = url_req.read() img = open(save_path, 'wb') img.write(img_read) img.close() time.sleep(1) else: print "file already exists", file_name def download(self): screen_name_list = self.read_ids() num_users = len(screen_name_list) for i, screen_name in enumerate(screen_name_list): save_dir = os.path.join(IMAGES_DIR, screen_name) file_list = self.create_folder(save_dir) url_list = self.get_timeline(screen_name) num_urls = len(url_list) for j, url in enumerate(url_list): self.get_file(url, file_list, save_dir) print "%d / %d users, %d / %d pictures"%((i+1), num_users, (j+1), num_urls) def main(): tw = TwitterImageDownloader() tw.download() if __name__ == '__main__': main()
0 件のコメント:
コメントを投稿