google image download実行時におけるUnicodeDecodeErrorの対処方法

##0. はじめに
Tensorflow等で画像認識させるために学習用の画像を収集するには、google image downloadが非常に便利です。

pipで取得できるgoogle image downloadでは現時点(2020/06)時点では正常に画像収集ができないため、修正版のgoogle image downloadを取得しました。
しかし、取得したpythonファイルを実行したところ、UnicodeDecodeErrorが出たため、その対処方法を備忘録として残します。

ちなみに本内容で触れませんが、google imade downloadで101枚以上の画像を収集する際は別途chromedriverが必要です。

##1. 環境
macOS Catalina 10.15.3
Python 3.5.3
pip 20.1.1


##2. pipでインストール
pipでgoogle image downloadをインストールできます。

```
pip install google_images_download
```

しかし、現時点(2020/06)で実行しても、正常に画像集取ができません。

```
~ $ ./google_images_download/google_images_download.py --keywords "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: 1.4127511978149414 Seconds

```

##3. 修正版インストール
下記で修正版のgoogle image downloadが公開されているのでgit cloneで取得します。
https://github.com/Joeclinton1/google-images-download/tree/patch-1

取得したpythonファイルを実行すると、下記のエラーが出てしまいました。

```
~ $ python ./gid-joeclinton/google_images_download/google_images_download.py -k cat

Item no.: 1 --> Item name = cat
Evaluating...
Starting Download...
Traceback (most recent call last):
  File "./gid-joeclinton/google_images_download/google_images_download.py", line 1019, in <module>
    main()
  File "./gid-joeclinton/google_images_download/google_images_download.py", line 1008, in main
    paths,errors = response.download(arguments)  #wrapping response in a variable just for consistency
  File "./gid-joeclinton/google_images_download/google_images_download.py", line 844, in download
    paths, errors = self.download_executor(arguments)
  File "./gid-joeclinton/google_images_download/google_images_download.py", line 962, in download_executor
    items,errorCount,abs_path = self._get_all_items(raw_html,main_directory,dir_name,limit,arguments)    #get all image items and download images
  File "./gid-joeclinton/google_images_download/google_images_download.py", line 765, in _get_all_items
    image_objects = self._get_image_objects(page)
  File "./gid-joeclinton/google_images_download/google_images_download.py", line 754, in _get_image_objects
    object_decode = bytes(object_raw, "utf-8").decode("unicode_escape")
UnicodeDecodeError: 'unicodeescape' codec can't decode byte 0x5c in position 123085: \ at end of string

```


##4. UnicodeDecodeError対処方法
google_images_download.pyを修正しました。
bytes.decode()のerror引数に"ignore"を追加しました。

```
   # Getting all links with the help of '_images_get_next_image'
    def _get_image_objects(self,s):
        start_line = s.find("AF_initDataCallback({key: \\'ds:1\\'") - 10
        start_object = s.find('[', start_line + 1)
        end_object = s.find('</script>', start_object + 1) - 4
        object_raw = str(s[start_object:end_object])
        object_decode = bytes(object_raw, "utf-8").decode("unicode_escape","ignore")
        image_objects = json.loads(object_decode)[31][0][12][2]
        image_objects = [x for x in image_objects if x[0]==1]
        return image_objects
```
URLErrorなどで取得できない画像もありますが、これで正常に画像収集ができるようになりました。

```
$ python ./gid-joeclinton/google_images_download/google_images_download.py -k cat

Item no.: 1 --> Item name = cat
Evaluating...
Starting Download...
Completed Image ====> 1.XXXX.png
Completed Image ====> 2.XXXX.jpg

〜省略〜

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

Errors: 35


Everything downloaded!
Total errors: 35
Total time taken: 173.5407509803772 Seconds

```

##5. おわりに
出ているerrorを無視しただけの対応ですが、目的である画像収集はできているので、原因を追求するのは一旦やめました。時間があるときに原因調査してしかるべき対応で対処したいと思います。