目的
Pythonから、ダウンローダーであるIrvineを使ってファイルをダウンロードする。
背景
Pythonのrequetsで、ファイルダウンロードしていたら、いろんな種類のエラーにからまれた。
ダウンロードは、ダウンローダーにお願いしたい。
環境
- Windows11 バージョン22H2(OSビルド22621.963)
- Python3.9.1
- Irvine 1.3.0.126 & DMScript 0.3.12
Irvineのセットアップ
- 窓の杜 Irvineをダウンロードしてきて、インストールする(irvine.exeのパスは「c:\Program1\irvine1_3_0\irvine.exe」とする)
-
Irvineの設定を参考に設定する
- 特に重要なのはUser-Agentぐらいだと思う
ダウンロードが終了したらIrvineを閉じる設定
- irvineを起動する
- メニューの[ツール]-[オプション設定]を選ぶ
- [スクリプト]タブを選び、[新規作成]ボタンをクリックする
- [オプション設定]が選択された状態で、[次へ]ボタンをクリックする
- イベントの[OnDeactivateQueue]を選び、[次へ]ボタンをクリックする
- [ファイル名(拡張子は不要です)]に、[doneclose]を入力する
- [キャプション]に、[すべて終了時にIrvineを終了]を入力する
- [完了]ボタンをクリックする
- notepadで編集中になるので、以下の内容に書き換える(末尾の参考ブログから転記、guidは作者のguidをそのまま使用しても問題ないと思う)
doneclose.dms
/*
スクリプト初期化データ
guid={3FD7CA4D-BB58-4E4E-B1EF-E66AA72E9685}
caption=全て終了時にIrvineを終了
version=0
hint=
event=OnDeactivateQueue
match=
author=
synchronize=0
*/
function OnDeactivateQueue(irvine){
//すべてのダウンロード終了イベント
irvine.ExecuteAction('actFileClose');
}
- notepadを保存して閉じる
- [オプション設定]の[更新]ボタンをクリックする
- [スクリプト]タブのイベント[OnDeactivateQueue]にキャプション[すべて終了時にIrvineを終了]が増えているので、チェックONする
使い方
- GitからSource code(zip)をダウンロードして、展開する
- 展開したパスが「c:\Git\traning\」とすると、「C:\Git\traning\python\Web_scraping\irvineHelper.py」にIrvineHelperクラスがある
- 「irvineHelper.py」ファイルを好きな場所にコピーして使う
- 以下のコードを実行すると、Irvineが起動して、画像を2つダウンロードする設定が行われる
サンプルコード
from irvineHelper import *
# テスト画像のURL
image_url_list = [
'https://・・・/画像1.png',
'https://・・・/画像2.png',
]
test_target = IrvineHelper(image_url_list)
test_target.download()
- 注意としては、Irvineを起動したときに、選択されているフォルダがゴミ箱にならないようにすること
- ゴミ箱が選択されていると、ゴミ箱にダウンロードファイルが設定される
コードの説明
- クラスやメソッドの説明はdocstringを参照(以下はPyCharmでIrvineHelperクラスを表示した例)
- IrvineHelperクラスのインスタンスを作るときに、list_pathのファイルにURLリストが書き込まれる(1レコードは20フィールドでタブ区切り)
irvineHelper.py 128行目~143行目
elif isinstance(value_object, list):
value_object = copy.deepcopy(value_object)
download_file_name_list = copy.deepcopy(download_file_name_list)
with open(list_path, 'w', encoding='utf-8') as work_file:
buff = ''
for absolute_path, file_name in zip_longest(value_object, download_file_name_list):
buff += absolute_path + '\t'
if download_path:
buff += download_path
buff += '\t'
if file_name:
buff += file_name
buff += '\t' * 17
buff += '\n'
work_file.write(buff)
self.value_object = IrvineHelperValue(exe_path, list_path)
- コマンドラインでlist_pathを引数にしてIrvineを起動する
irvineHelper.py 148行目~159行目
def download(self):
"""
irvineを起動して、終了されるのを待つ
:return:
"""
cmd = self.value_object.exe_path
cmd += ' '
cmd += self.value_object.list_path
proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
self.running = True
proc.wait()
self.running = False
- 起動したIrvineにlist_pathのURLリストが読み込まれてダウンロードが始まる
- Irvineが終了するとPythonに処理が戻る
- list_pathは、初期値が以下になっている
irvineHelper.py 79行目
list_path: str = r'./irvine_download_list.txt'
おわりに
URLがわかっているのに、requetsでダウンロードできない時に、使えるかもしれません。
試していないので、URLにDataURIが混ざると、どうなるかわかりません。
IrvineにDataURIを設定できなかったので、たぶんDataURIは無視されると思います。
関連リンク
参考サイト
- 窓の杜 Irvine
- Irvine Uploader
- Irvine Part36スレ
ドキュメント
- Irvine公式
- Irvineマニュアル
- IrvineまとめWiki
- Irvineの設定