前提
コマンドサンプルはWindows+Anaconda環境で実行したものです。
またアカウント名など一部パスは伏字にしていますので、各環境に合わせて読み替えてください。
結論
先に結論からお伝えしておくと、Google画像検索の仕様変更により、公式ツールのスクレイピングがうまく動かなくなっているのが原因です。
公式のGigHubにパッチのPRを投げている方がいましたので、そちらのソースをダウンロードしてから実行すれば、正常に動作させることができます。
Google Image Downloadが動かない!
Tensorflowなどを使って画像認識をさせたいなと思い、学習用の画像を収集しようと
https://qiita.com/too-ai/items/4fad0239b8b3c465fe6d
https://qiita.com/Ikko_Kojima/items/4d943c60ff5e886a0544
このあたりのページを参考に、Google Image Downloadを使って画像を収集しようとしたのですが
(base) PS C:\Users\*\Downloads\img> googleimagesdownload -k cat
Item no.: 1 --> Item name = cat
Evaluating...
Starting Download...
Unfortunately all 100 could not be downloaded because some images were not downloadable. 0 is all we got for this search filter!
Errors: 0
Everything downloaded!
Total errors: 0
Total time taken: 0.609447717666626 Seconds
このように、エラーにならず、ディレクトリも作成される(実行環境の下に downloads\ KEYWORD
)のにその下にファイルは一つも保存されていないという結果になりました。
何が原因か不明でしたが、とりあえず中を見てみるかと、
pip install google_images_download
ではなく
git clone https://github.com/hardikvasa/google-images-download.git
を実行してソースを取得して中身をのぞいてみました。
Pythonには不慣れですが、幸い、このソフトは実質実行ファイルは1つだけで構成されていたため、画面に出力されているキーワードをもとにソースを読み始めたところ、問題となっていたポイントはすぐに特定できました。
#714-724行目
def _get_next_item(self,s):
start_line = s.find('rg_meta notranslate')
if start_line == -1: # If no links are found then give an error!
end_quote = 0
link = "no_links"
return link, end_quote
else:
start_line = s.find('class="rg_meta notranslate">')
start_object = s.find('{', start_line + 1)
end_object = s.find('</div>', start_object + 1)
object_raw = str(s[start_object:end_object])
という箇所があるのですが、この辺のキーワードとして設定されている rg_meta notranslate
や {
が、現在の検索結果に見当たらず、画像データを正常に取得できなくなっています。
当初、自分でこのあたりのキーワードを調整すれば何とか出来るかな~と思ったのですが、もともとどんな状態で切り出してその後の処理に渡しているのかがわからず難航したので公式サイトを改めて確認したところ、パッチをプルリクエスト投げている方がいました。
パッチ
こちらのページのClone or Downloadのところから、URLを取得して git clone するかZIPをダウンロードして、ソースを取得して、そのソースを使って実行します。
私はgit cloneで取得しました。
C:\Users\*\Downloads\img>git clone https://github.com/Joeclinton1/google-images-download.git gid-joeclinton
Cloning into 'gid-joeclinton'...
remote: Enumerating objects: 13, done.
remote: Counting objects: 100% (13/13), done.
remote: Compressing objects: 100% (13/13), done.
remote: Total 621 (delta 7), reused 0 (delta 0), pack-reused 608
Receiving objects: 100% (621/621), 272.98 KiB | 718.00 KiB/s, done.
Resolving deltas: 100% (358/358), done.
同じフォルダ内に本家のソースがあったので、こちらのソースは gid-joeclinton
というフォルダを作成して保存。
したがって実行時にはそちらのソースを指定して実行
(base) PS C:\Users\*\Downloads\img> python .\gid-joeclinton\google_images_download\google_images_download.py
-k cat
Item no.: 1 --> Item name = cat
Evaluating...
Starting Download...
Completed Image ====> 1.Layer-1704-1920x840.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 2.An_up-close_picture_of_a_curious_male_domestic_shorthair_tabby_cat.jpg
Completed Image ====> 3.Thinking-of-getting-a-cat.png
Completed Image ====> 4.cat-10-e1573844975155.jpg
(中略)
Completed Image ====> 72.15276403_web1_190123-VNE-CatLeash.jpg
Completed Image ====> 73.CatsHaveFacialExpressionsButHardToRead_600.jpg
Completed Image ====> 74.Banner3.jpg
Unfortunately all 100 could not be downloaded because some images were not downloadable. 74 is all we got for this searc
h filter!
Errors: 26
Everything downloaded!
Total errors: 26
Total time taken: 120.21685576438904 Seconds
使い慣れた方ならすぐに思いつくのでしょうけど、パッチの方を直接ダウンロードさせてもらって使うという経験があまりなくて、すぐには思いつけなかったので、自分のメモを兼ねて書き留めておきました。
どなたかの参考になれば幸いです。
追記
こちらのパッチですが、PRのIssueの中で話がされていますが -l
オプションをつけても、100件以上の取得ができない状態の様です。
https://github.com/hardikvasa/google-images-download/pull/298
100未満の数字を指定する分にはうまく動くのですが、100より大きな数字を指定すると、エラーになって動きませんのでご注意ください。