Anki用画像調達 スクレイピング(google画像検索画面のスクショ)の改造方法
Ankiに載せる画像をスクレイピングという方法でネットから集めるプログラムを見つけた。
Pythonという言語を使う。
このプログラムはMac環境かつPython2環境のため、WinかつPtyhon3環境で動作するよう試行錯誤した記録の必要部分を以下に記した。というかやった当時のメモ。
やった人のスペック
・Excelの関数は多少使えるがマクロは使ったことない
・コマンドプロンプトの存在は知っているがうまく打ち込めた試しがない
・Pythonという言語の名前すら知らない
Pythonを知らない状態からこのプログラム動かすまで30-50時間かかりました。
こちらのページを素直に上からやってみる。
データをダウンロードした。
pythonの環境構築
パスの設定方法
さっぱりわからないが、c:\users\名前
ここ以外探す気がないとのこと。
今のフォルダの状態をスクショしてどれだけ散らかっても片付けられるようにしてから
bulk_screen_capture.pyをいれた。
もともとはアンダーバーではなくハイフンだったがWindows環境では区切り文字扱いっぽいのですべてアンダーバーに書きかえた。
python bulk_screen_capture.py -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が読めました。
一週間かかりました。
とはいえなんかもう少しないのか。
import sys
import pprint
pprint.pprint(sys.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だけはハイフンをアンダーバーにかえた)
だめ
とはいえ問題の部分にエンコード?ないので読む
for file in arges
ファイル名を読む部分かな
上のスクショで言うところの117行目に,
retrieve_snapshot_for_words(driver, get_words_from_file(file), encoding="utf-8_sig")
としたらエラーは減ったが
まだ
mkdir_p(Options.dir)
でつっかかる
わけがわからない。
以下を追加し、 encoding="utf-8_sig"は全て消した
ちょっと進んだ。
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))
そんなものはないとエラーが出たので書き換えた
ところで、
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
勝手にディレクトリ作ってくれた。
確かにディレクトリが無ければ作るし、既にあったら作らないってコードあった。
なるほど。
tsvはエクセルファイルっぽい。
test.csvは以下の単語が入っている。
tactic 戦術、戦法、作戦
backfire 計画などが裏目に出る、エンジン・車がさか火を起こす
catastrophic 壊滅的な、大異変の、最悪の
あ、これ追番ないやつだ
追番もファイル名につくと思ってたけどちがうのかな?
まあいっか
試しに自分でgoogle検索した
なんかちょっと違うな。
一応怖いので、作者様がサンプルに置いておいてくれた画像も確認した。
違う。よかった。
私やり遂げました。
pythonという単語すら知らなかったが、一週間30-40時間かければ以下ができるようになった。
- 環境の導入
- 多少構文が読める
- プログラムの起動のさせ方がわかる
- 間違えた部分が多少わかる
- 間違いの検索方法が四苦八苦すればなんとかできる
プロの方々から見れば苦笑いか怒られそうなもの。
しかし満足です。
将来の自分のためにまとめておこう
pythonをダウンロードする。
chromedriverをダウンロードする。
ここからダウンロードする。
フォルダ開く。
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分くらいでした。
ようやくひと段落。