やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

Google画像検索したファイルを一括ダウンロードするコマンド(googleimagesdownload)

 ちょっと面倒だった。

情報源

手順

  1. インストール
  2. 使ってみる

1. インストール

$ pip install google_images_download
$ googleimagesdownload
bash: googleimagesdownload: コマンドが見つかりません

 pip3でインストールしても同様……。

1-1. 環境変数パスを通す

 こちらを参考にした。

$ pip show -f google_images_download
...
Location: /home/pi/.local/lib/python2.7/site-packages
...
Files:x
  ../../../bin/googleimagesdownload
...
$ export PATH="${PATH}:~/.local/bin"

 例によって~/.bashrcに上記export文を書くことで自動化できる。

1-2. ヘルプ

 なにこれ。ヘルプが雑でバージョンがヘルプで……。

$ googleimagesdownload --help
usage: googleimagesdownload [-h] [-cf CONFIG_FILE]

optional arguments:
  -h, --help            show this help message and exit
  -cf CONFIG_FILE, --config_file CONFIG_FILE
                        config file name
$ googleimagesdownload --version
usage: googleimagesdownload [-h] [-k KEYWORDS] [-kf KEYWORDS_FROM_FILE]
                            [-sk SUFFIX_KEYWORDS] [-pk PREFIX_KEYWORDS]
                            [-l LIMIT] [-f {jpg,gif,png,bmp,svg,webp,ico}]
                            [-u URL] [-x SINGLE_IMAGE] [-o OUTPUT_DIRECTORY]
                            [-i IMAGE_DIRECTORY] [-n] [-d DELAY]
                            [-co {red,orange,yellow,green,teal,blue,purple,pink,white,gray,black,brown}]
                            [-ct {full-color,black-and-white,transparent}]
                            [-r {labeled-for-reuse-with-modifications,labeled-for-reuse,labeled-for-noncommercial-reuse-with-modification,labeled-for-nocommercial-reuse}]
                            [-s {large,medium,icon,>400*300,>640*480,>800*600,>1024*768,>2MP,>4MP,>6MP,>8MP,>10MP,>12MP,>15MP,>20MP,>40MP,>70MP}]
                            [-es EXACT_SIZE]
                            [-t {face,photo,clipart,line-drawing,animated}]
                            [-w {past-24-hours,past-7-days}] [-wr TIME_RANGE]
                            [-a {tall,square,wide,panoramic}]
                            [-si SIMILAR_IMAGES] [-ss SPECIFIC_SITE] [-p]
                            [-ps] [-pp] [-m] [-e] [-st SOCKET_TIMEOUT] [-th]
                            [-la {Arabic,Chinese Simplified),Chinese (Traditional,Czech,Danish,Dutch,English,Estonian,Finnish,French,German,Greek,Hebrew,Hungarian,Icelandic,Italian,Japanese,Korean,Latvian,Lithuanian,Norwegian,Portuguese,Polish,Romanian,Russian,Spanish,Swedish,Turkish}]
                            [-pr PREFIX] [-px PROXY] [-cd CHROMEDRIVER] [-ri]
                            [-sa] [-nn] [-of OFFSET] [-nd]
googleimagesdownload: error: unrecognized arguments: --version

使いそうな引数

 引数は色々ある。使いそうなのを抜き出してみた。

引数 意味 値の例
-k 検索キーワード '壁紙 夜空'
-l ダウンロード上限数 10(default:100)
-s 最低サイズ >1024*768
-es 正確なサイズ 1920,1080
-r ライセンス labeled-for-reuse-with-modifications
labeled-for-reuse
labeled-for-noncommercial-reuse-with-modification
labeled-for-nocommercial-reuse
-d ディレイ 2
-nd ダウンロードしない (none)
-o 出力先 /tmp
-n サブディレクトリなし (none)

 -s-esは併用できないらしい。*,で統一されてない……。同一サイトなら2秒位ディレイしないとサーバ負荷が高いかも?。

 名前や引数が整理されていない印象。

2. 使ってみる

URL取得

 まずはURLのみ表示。

googleimagesdownload -nd -k "壁紙 夜空" -l 10 -es 1920,1080 -r labeled-for-reuse-with-modifications
Item no.: 1 --> Item name = 壁紙 夜空
Evaluating...
Starting to Print Image URLS
Image URL: https://images.pexels.com/photos/1047617/pexels-photo-1047617.jpeg?cs=srgb&dl=-1047617.jpg&fm=jpg
Printed url without downloading
Image URL: https://images.pexels.com/photos/459680/pexels-photo-459680.jpeg?cs=srgb&dl=nasa-sf-459680.jpg&fm=jpg
Printed url without downloading
Image URL: https://images.pexels.com/photos/262644/pexels-photo-262644.jpeg?cs=srgb&dl=-262644.jpg&fm=jpg
Printed url without downloading
Image URL: https://images.pexels.com/photos/991167/pexels-photo-991167.jpeg?cs=srgb&dl=cgi-991167.jpg&fm=jpg
Printed url without downloading
Image URL: https://images.pexels.com/photos/532040/pexels-photo-532040.jpeg?cs=srgb&dl=nasa-sf-532040.jpg&fm=jpg
Printed url without downloading
Image URL: https://images.pexels.com/photos/531995/pexels-photo-531995.jpeg?cs=srgb&dl=nasa-sf-531995.jpg&fm=jpg
Printed url without downloading
Image URL: https://get.pxhere.com/photo/croatia-early-morning-red-vintage-car-car-motor-vehicle-vehicle-sky-automotive-design-family-car-classic-zastava-750-city-car-mountain-road-trip-landscape-compact-car-vehicle-door-classic-car-subcompact-car-1433087.jpg
Printed url without downloading


Unfortunately all 10 could not be downloaded because some images were not downloadable. 7 is all we got for this search filter!

Errors: 0


Everything downloaded!
Total time taken: 1.2559430599212646 Seconds

 これはURL文字列だけを抽出する作業が必要そう。

googleimagesdownload -nd -k "壁紙 夜空" -l 10 -es 1920,1080 -r labeled-for-reuse-with-modifications | grep -e '^Image URL: ' | sed -e 's/^Image URL: //g'

 これさえ入手できればwget, curlなどでダウンロード可能。

画像ファイル保存

googleimagesdownload -k "壁紙 夜空" -l 10 -es 1920,1080 -r labeled-for-reuse-with-modifications -o /tmp/work/wallpaper -n 
Item no.: 1 --> Item name = 壁紙 夜空
Evaluating...
Starting Download...
Completed Image ====> 1. pexels-photo-1047617.jpeg
Completed Image ====> 2. pexels-photo-262644.jpeg
Completed Image ====> 3. pexels-photo-991167.jpeg
Completed Image ====> 4. pexels-photo-531995.jpeg
Completed Image ====> 5. pexels-photo-532040.jpeg
Completed Image ====> 6. croatia-early-morning-red-vintage-car-car-motor-vehicle-vehicle-sky-automotive-design-family-car-classic-zastava-750-city-car-mountain-road-trip-landscape-compact-car-vehicle-door-classic-car-subcompact-car-1433087.jpg


Unfortunately all 10 could not be downloaded because some images were not downloadable. 6 is all we got for this search filter!

Errors: 0


Everything downloaded!
Total time taken: 6.262312412261963 Seconds
  • 6枚しか入手できていない……
  • ファイル名にスペースが入れられている……

 ライセンスの条件をとる。

mkdir -p /tmp/work/wallpaper/Yozora
googleimagesdownload -k "壁紙 夜空" -l 100 -d 1 -es 1920,1080 -o '/tmp/work/wallpaper/Yozora/1920_1080' -n > /tmp/work/wallpaper/Yozora/log.txt

 オフセットを指定して100番から200番をダウンロードしたかったが、100番のみダウンロードされた……。

$ googleimagesdownload -k "壁紙 夜空" -l 200 -of 100 -d 1 -es 1920,1080 -o '/tmp/work/wallpaper/Yozora/1920_1080' -n >> /tmp/work/wallpaper/Yozora/log.txt

 100枚ずついい感じのを選びながら削除して、というのを繰り返したかったのに……。

不満

  1. 名前が長い
  2. 環境変数パスに自動で通してくれない
  3. ヘルプが謎。バージョンが出ない。
  4. ディレイ
    • 同一サーバを対象にして他は同時がいい
  5. 重複チェック
    • 既存の画像ファイルはダウンロードしないようにして欲しい
    • マルチポスト除外(同一画像ファイルが異なるURLにある)
  6. ファイルサイズの上限を設けて欲しい
    • 1ファイルあたりの上限
    • 合計ファイルサイズ上限
  7. JSONデータにまとめて欲しい
    • URL, Path, 検索順
  8. ゼロ埋め
    • ファイル名の番号がゼロ埋めされていないため順番に表示できない
    • 番号とファイル名の間にスペースが埋め込まれる(シェルのメタ文字……)
  9. オフセットどう使うかわからん

所感

 スクレイピングさえしてくれればいい。

対象環境

  • Raspbierry pi 3 Model B+
  • Raspbian stretch 9.0 2018-11-13
  • python 2.7.13, pip 9.0.1
  • python3 3.5.3, pip3 9.0.1
$ uname -a
Linux raspberrypi 4.14.98-v7+ #1200 SMP Tue Feb 12 20:27:48 GMT 2019 armv7l GNU/Linux