[Python] Tumblrからタグを指定して画像をダウンロードする

Deep Learningで画像識別器を作成したい場合、学習データを用意するのが大変です。
何枚も手でダウンロード指定ては日が暮れてしまうので、Pythonを使って自動で集められるようにします。 Tumblrからタグを指定して画像データを集めるコードを作成しました。

環境

Python 3.5.2 :: Anaconda 4.2.0 (x86_64)

事前準備

  • TubmlrにログインしてAPI Keyを取得しておく
  • 画像をダウンロードするディレクトリを作成しておく
  • requestsをインストールしておく ($ pip install requests)

ソースコード

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import requests
import time
 
API_ACCESS_COUNT = 1
 
# 画像をダウンロードするディレクトリ 先に作成しておく事
IMAGE_DL_DIR = './DownloadImages/'
 
payload = {
        'api_key' : 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
        'tag' : 'cat',
        'before' : ''
        }
 
photo_urls = []
for i in range(API_ACCESS_COUNT):
    # requestsでアクセスする, 結果はjsonで取得できる
    response = requests.get(TUMBLR_URL, params=payload)
    response_json = response.json()
 
    for data in response_json['response']:
        # typeがphotoでないものは省く
        if data['type'] != 'photo':
            continue
        for photo in data['photos']:
            photo_urls.append(photo['original_size']['url'])
 
    payload['before'] = response_json['response'][len(response_json['response']) - 1]['timestamp']
    print("get image url... " + str(i + 1) + ' / ' + str(API_ACCESS_COUNT))
    # サーバーに負荷をかけないため, 1秒まつ
    time.sleep(1)
 
# 写真データをDLする
total_size_of_url = len(photo_urls)
 
for i, url in enumerate(photo_urls):
    # 後ろから3文字取得して拡張子のチェックを行う
    extension = url[-3:]
    if extension != 'jpg' and extension != 'png':
        continue
 
    # ダウンロード
    response = requests.get(url)
    if not response.ok:
        continue
 
    # ファイルに書き込み
    with open(IMAGE_DL_DIR + str(i) + '.jpg', 'wb') as handler:
        handler.write(response.content)
 
    print('download image... ' + str(i + 1) + ' / ' + str(total_size_of_url))
    # サーバーに負荷をかけないため1秒まつ
    time.sleep(1)

サーバーに負荷をかけないように、APIアクセスしたら1秒待っています。
API_ACCESS_COUNTの数を変更すればより多くのURLが取得で切るので、画像もたくさんダウンロードできます。
一回のURL取得アクセスで25個ぐらいURLが取得できるので、API_ACCESS_COUNT x 25個ぐらいの画像がダウンロードできます。

0 件のコメント :

コメントを投稿