前回、icrawlerを使って画像を自動的にダウンロードするプログラムを作りました。今回はそれをGUI化したので紹介したいと思います。
前回の記事はこちら。
今回の記事のプログラムを実行した様子はこちらです。
準備
前回同様、icrawlerというモジュールを使います。
https://icrawler.readthedocs.io/en/latest/builtin.html#search-engine-crawlers
以下のコマンドでインストールしてください。
|
1 |
pip install icrawler |
プログラムの内容
ソースコードはこちら。
|
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 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
#-*- coding: utf-8 -*- import os from icrawler.builtin import BingImageCrawler from tkinter import * from tkinter import messagebox import tkinter.ttk as ttk class ImageDownloader(Frame): def __init__(self, master=None): Frame.__init__(self, master) self.grid() self.master.geometry('440x110') self.master.title(u'画像ダウンロード') self.label1 = Label(self, text='keyword') self.label1.grid(row=0, column=0, padx=10, pady=5) self.entrybox = Entry(self, width=30) self.entrybox.grid(row=0, column=1, padx=5, pady=5) self.button = Button(self, text='download', width=20, command=self.StartDownload) self.button.grid(row=0, column=2, padx=10, pady=5) self.label2 = ttk.Label(self, text="最大ダウンロード数") self.label2.grid(row=1, column=1, padx=5, pady=5) numlist = ('10', '20', '50', '100', '200') self.max_num = ttk.Combobox(self, values=numlist, height=8, width=20, state="readonly", justify="right") self.max_num.current(0) self.max_num.grid(row=1, column=2, padx=5, pady=5) self.label3 = ttk.Label(self, text="画像サイズ") self.label3.grid(row=2, column=1, padx=5, pady=5) sizelist = ('小', '中', '大', '特大', '指定なし') self.img_size = ttk.Combobox(self, values=sizelist, height=8, width=20, state="readonly", justify="center") self.img_size.current(4) self.img_size.grid(row=2, column=2, padx=5, pady=5) def StartDownload(self): self.keyword = self.entrybox.get() # 検索キーワード if self.keyword == '': messagebox.showinfo('', 'キーワードを入力してください') return self.dirname = 'images' # 画像を保存するディレクトリ os.makedirs(self.dirname, exist_ok=True) self.bing_crawler = BingImageCrawler(downloader_threads=4, storage={'root_dir': self.dirname}) # 最大ダウンロード数 n = self.max_num.current() max_num_list = [10, 20, 50, 100, 200] max_num = max_num_list[n] # 画像サイズ n = self.img_size.current() img_size_list1 = [(100, 100), (700, 700), (1200, 700), (1400, 1000), None] img_size_list2 = [(700, 700), (1400, 1000), (1600, 1200), (4000, 2000), None] img_size1 = img_size_list1[n] img_size2 = img_size_list2[n] self.bing_crawler.crawl(keyword=self.keyword, filters=None, offset=0, max_num=max_num, min_size=img_size1, max_size=img_size2, file_idx_offset='auto') messagebox.showinfo('', 'ダウンロードが終了しました') if __name__ == "__main__": app = ImageDownloader() app.mainloop() |
ついでにpyinstallerで実行ファイルにもしました。必要な方はこちらからどうぞ。
プログラムの説明
それでは簡単に内容を説明していきます。
tkinterのFrameを継承したImageDownloaderというクラスを作成しています。
コンストラクタでキーワードを入力するエディットボックス(Entry)、ダウンロードを実行するボタン、ダウンロードする画像の最大数とサイズを選択するコンボボックスなどを作成しています。
|
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 |
class ImageDownloader(Frame): def __init__(self, master=None): Frame.__init__(self, master) self.grid() self.master.geometry('440x110') self.master.title(u'画像ダウンロード') self.label1 = Label(self, text='keyword') self.label1.grid(row=0, column=0, padx=10, pady=5) self.entrybox = Entry(self, width=30) self.entrybox.grid(row=0, column=1, padx=5, pady=5) self.button = Button(self, text='download', width=20, command=self.StartDownload) self.button.grid(row=0, column=2, padx=10, pady=5) self.label2 = ttk.Label(self, text="最大ダウンロード数") self.label2.grid(row=1, column=1, padx=5, pady=5) numlist = ('10', '20', '50', '100', '200') self.max_num = ttk.Combobox(self, values=numlist, height=8, width=20, state="readonly", justify="right") self.max_num.current(0) self.max_num.grid(row=1, column=2, padx=5, pady=5) self.label3 = ttk.Label(self, text="画像サイズ") self.label3.grid(row=2, column=1, padx=5, pady=5) sizelist = ('小', '中', '大', '特大', '指定なし') self.img_size = ttk.Combobox(self, values=sizelist, height=8, width=20, state="readonly", justify="center") self.img_size.current(4) self.img_size.grid(row=2, column=2, padx=5, pady=5) |
ダウンロードを実行するボタンを押すとStartDownload関数が実行され、キーワードとダウンロードの最大数、画像サイズを指定してBingImageCrawlerの crawl 関数を呼び出しています。
画像サイズとしては「小」、「中」、「大」、「特大」、「指定なし」があり、小は(100px, 100px)~(700px, 700px)の画像、中は(700px, 700px)~(1400px, 1000px)の画像、大は(1200px, 700px)~(1600px, 1200px)の画像、特大は(1400px, 1000px)~(4000px, 2000px)の画像を探すようにしています。このあたりの区分は適当です。
|
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
def StartDownload(self): self.keyword = self.entrybox.get() # 検索キーワード if self.keyword == '': messagebox.showinfo('', 'キーワードを入力してください') return self.dirname = 'images' # 画像を保存するディレクトリ os.makedirs(self.dirname, exist_ok=True) self.bing_crawler = BingImageCrawler(downloader_threads=4, storage={'root_dir': self.dirname}) # 最大ダウンロード数 n = self.max_num.current() max_num_list = [10, 20, 50, 100, 200] max_num = max_num_list[n] # 画像サイズ n = self.img_size.current() img_size_list1 = [(100, 100), (700, 700), (1200, 700), (1400, 1000), None] img_size_list2 = [(700, 700), (1400, 1000), (1600, 1200), (4000, 2000), None] img_size1 = img_size_list1[n] img_size2 = img_size_list2[n] self.bing_crawler.crawl(keyword=self.keyword, filters=None, offset=0, max_num=max_num, min_size=img_size1, max_size=img_size2, file_idx_offset='auto') messagebox.showinfo('', 'ダウンロードが終了しました') |
サイズを指定した場合、「最大ダウンロード数」に対して実際にダウンロードされる画像の数はかなり少なくなってしまいました。サイズの指定の仕方が悪いのでしょうか?(ごめんなさい。よく分かりません)

画像サイズを「指定なし」にすると「最大ダウンロード数」に近い数の画像がダウンロードされます。数が必要な場合は画像サイズに「指定なし」を選んでください。
さいごに
今回は画像をダウンロードするプログラムをGUI化して手軽に使えるようにしてみました。誰かのお役に立てば幸いです。
- 投稿タグ
- プログラミング