Anki用画像調達 スクレイピング(google画像検索画面のスクショ)の改造方法

Ankiに載せる画像をスクレイピングという方法でネットから集めるプログラムを見つけた。

Pythonという言語を使う。

このプログラムはMac環境かつPython2環境のため、WinかつPtyhon3環境で動作するよう試行錯誤した記録の必要部分を以下に記した。というかやった当時のメモ。

 

 

やった人のスペック

Excelの関数は多少使えるがマクロは使ったことない

コマンドプロンプトの存在は知っているがうまく打ち込めた試しがない

Pythonという言語の名前すら知らない

・もちろんJavaC言語も言語の名前しか知らない

Pythonを知らない状態からこのプログラム動かすまで30-50時間かかりました。

 

 

github.com

 

 

こちらのページを素直に上からやってみる。

 

データをダウンロードした。

 

 

pythonの環境構築

 

パスの設定方法

 

www.javadrive.jp

techacademy.jp

 

さっぱりわからないが、c:\users\名前

ここ以外探す気がないとのこと。

今のフォルダの状態をスクショしてどれだけ散らかっても片付けられるようにしてから

bulk_screen_capture.pyをいれた。

 

もともとはアンダーバーではなくハイフンだったがWindows環境では区切り文字扱いっぽいのですべてアンダーバーに書きかえた。

 

 

 

 

 

python bulk_screen_capture.py -h

f:id:yoshiharay:20210912125055p:plain

-h

なんとか表示できた。

 

以下がオプションの単語リスト。


Options:
  -h, --help            show this help message and exit
  -d DIR, --dir=DIR     Directory to write captured images.
  -j JS_BEFORE_SAVE, --js-before-save=JS_BEFORE_SAVE
                        Eval js file before save mainly to scroll to element
  -f, --force-save      Overwrite existing file if exists
  -p PREFIX, --prefix=PREFIX
                        Prefix for filename
  -w WINDOW, --window=WINDOW
                        Window size. 1280x720 by default.
  -e ENGINE, --engine=ENGINE
                        Image search engine to use one of dict_keys(['google',
                        'google_unsafe', 'bing', 'bing_unsafe'])
  -s, --show            Do not hide chrome browser
  --sleep=SLEEP         Sleep duration on each take

 

ようやくhelpが読めました。

一週間かかりました。

 

 

とはいえなんかもう少しないのか。

note.nkmk.me

import sys
import pprint

pprint.pprint(sys.path)

f:id:yoshiharay:20210912131129p:plain

path

もうわけがわからないので、とりあえず

add_img~~~

before_scroll~~~

bulk_screen~~~

sample.tsv

をまんまユーザーのフォルダに放り込んで

 

python bulk_screen_capture.py -d collection.media -p "google-img--" -j before_scroll.js -w 720x720 sample.tsv

 

(.pyだけはハイフンをアンダーバーにかえた)

 

 

だめ

 

どうもwindows環境はエンコードが別らしい

 

qiita.com

 

f:id:yoshiharay:20210912144129p:plain

code1

とはいえ問題の部分にエンコード?ないので読む

for file in arges

ファイル名を読む部分かな

 

konprogrammer.hatenablog.com

 

上のスクショで言うところの117行目に,

        retrieve_snapshot_for_words(driver, get_words_from_file(file), encoding="utf-8_sig")

としたらエラーは減ったが

まだ

    mkdir_p(Options.dir)

でつっかかる

eng-entrance.com

 

わけがわからない。

以下を追加し、 encoding="utf-8_sig"は全て消した

blog.tsukumijima.net

ちょっと進んだ。

AttributeError: type object '_io.StringIO' has no attribute 'StringIO'

 

image = Image.open(StringIO.StringIO(screen))

ここかな

先人もここでつまづいたよう。

これはpillowという画像編集するやつ

 Image.open( 画像を開く

この中身のStringIOがpython3以降だとエラーになるらしい

 

StringIO→BytesIO

に全部書き換え

に伴い

import StringIO

import six
import io 
from io import BytesIO

 

また


def save_snapshot(driver, word, idx):

のあとの

if Options.js_before_save:

のあとの

 image = Image.open(BytesIO.BytesIO(screen))

 image = Image.open(io.BytesIO(screen))

そんなものはないとエラーが出たので書き換えた

techacademy.jp

 

 

ところで、

python bulk_screen_capture.py -d collection.media -p "google-img--" -j before_scroll.js -w 720x720 sample.tsv

-d collection.media

は、スクショ保存するフォルダ(collection.media)を指示する(-d)

だが、

そもそもcollection.mediaとは?

これはAnkiにメディアファイルが含まれていると自動的にここを参照するデフォルトフォルダらしい

Ankiをダウンロードしたが自分でデッキを作っていないので、AnkiWebから適当に音声と画像が付いたデッキをダウンロードしたところcollection.mediaが

\Users\名前\AppData\Roaming\Anki2\ユーザー 1

という深いよくわからない階層にみつかった。

しかしいままでの四苦八苦した感じだと

c:\users\名前

にないといけないのでは?

 

 

 

と思ったが、なくてもいけた。

python bulk_screen_capture.py -d collection.media -p "google-img--" -j before_scroll.js -w 720x720 sample.tsv

f:id:yoshiharay:20210912172453p:plain

image1

勝手にディレクトリ作ってくれた。

確かにディレクトリが無ければ作るし、既にあったら作らないってコードあった。

なるほど。

 

tsvはエクセルファイルっぽい。

test.csvは以下の単語が入っている。

 

tactic    戦術、戦法、作戦
backfire    計画などが裏目に出る、エンジン・車がさか火を起こす
catastrophic    壊滅的な、大異変の、最悪の

 

f:id:yoshiharay:20210912172905p:plain

image2

あ、これ追番ないやつだ

追番もファイル名につくと思ってたけどちがうのかな?

 

まあいっか

試しに自分でgoogle検索した

f:id:yoshiharay:20210912173223p:plain

image3

 

なんかちょっと違うな。

 

一応怖いので、作者様がサンプルに置いておいてくれた画像も確認した。

違う。よかった。

f:id:yoshiharay:20210912173451p:plain

image4

 

私やり遂げました。

pythonという単語すら知らなかったが、一週間30-40時間かければ以下ができるようになった。

  • 環境の導入
  • 多少構文が読める
  • プログラムの起動のさせ方がわかる
  • 間違えた部分が多少わかる
  • 間違いの検索方法が四苦八苦すればなんとかできる

プロの方々から見れば苦笑いか怒られそうなもの。

しかし満足です。

 

 

 

 

 

 

将来の自分のためにまとめておこう

 

 

pythonをダウンロードする。

chromedriverをダウンロードする。

github.com

f:id:yoshiharay:20210912174126p:plain

画像1

ここからダウンロードする。

フォルダ開く。

bulk-screen-capture.py は

bulk_screen_capture.py へ。

c:\users\名前にダウンロードデータから以下をコピー

 add_img~~~

 before_scroll~~~

 bulk_screen~~~

 sample.tsv(単語が端の列に順番に並んだエクセル)

bulk_screen_capture.pyをメモ帳で開き、四苦八苦した修正を入れていく。

コマンドプロントを立ち上げる

python bulk_screen_capture.py -d collection.media -p "google-img--" -j before_scroll.js -w 720x720 sample.tsv

と入れてエンター

終わり。

 

コマンドプロントでミスったりpythonとかのプログラム?を終了したくなったら

Ctrl+Z+エンター

 

 

 

 

ちなみに1000語だいたい40分くらいでした。

 

 

 

 

 

 

 

ようやくひと段落。