Pythonプログラミングで画像を連番保存できると何かと便利です。
どうもヨスケです。
最近記事の更新が滞っており大変申し訳ありません。
本業の方で昇格と異動が決まってから、
現職場での仕事やりきりと次職場での業務引継ぎで忙殺されております。
ただ、元気にプログラミングの勉強は続けております!
今回は、ウェブスクレイピングで画像を一括ダウロードできるプログラム作成を目標にして取り組みました。
プログラミング初心者がザツいコーディングをして遊ぶ記事です。
一応、動作をすることは確認しておりますが、
間違いなどご容赦ください。
Webスクレイピングでサイトの画像を一括ダウンロードしたい
自分の画像をアップしているクラウド上のアルバムからダウンロードして
スライドショーを作る。
たくさんの画像を一括ダウンロードしたい。
一つ一つ手作業で右クリック⇒「画像を保存」をしていると大変です。
プログラムを実行すれば一回で済むようになると嬉しい。
連番のファイル名で画像を保存する
今回は手始めに、ダウンロードしたい画像ファイルのURLが
連番で置かれているようなウェブサイトの画像を一括でダウンロードできるような
プログラムを作ります。
https://xxxxxxxx/*********/1.jpg
https://xxxxxxxx/*********/2.jpg
・・・・
https://xxxxxxxx/*********/1000.jpg
処理の流れを設計する
プログラムの処理の流れを設計します。必要な処理を書き出します。
・保存先フォルダを指定する。(作成する)
・ダウンロード元の画像urlを連番で生成する
・連番で生成された画像のURLに順番にアクセスし、画像情報を取得する。
・生成したURLリソースがうまく取得できなかったら例外処理
抜けとかいろいろありますが、個人的に楽しむならこんな感じで◎
Python サンプルコード
以下のようなプログラムになりました。
import requests
import os, time
# 保存先のフォルダを指定
save_dir = './renban_image'
# 画像の基本URLを指定
base_url = 'https://xxxxxxx/*******/{0}.jpg'
# 順番に画像をダウンロードして保存する
def download_all():
# 保存フォルダがなければ作る
if not os.path.exists(save_dir):
os.mkdir(save_dir)
# 1~1000番まで連番で画像をダウンロード
for id in range(1,1000):
download_file(id)
#1秒待ちます。大切。
time.sleep(1)
# id番目の画像をダウンロードする
def download_file(id):
# 名前は1000番まで
url = base_url.format(id%1000, id)
save_file = save_dir + '/' + str(id) + '.jpg'
# URLのリソースを取得
res = requests.get(url)
print(url)
# URLリソースの取得チェック
if not res.ok:
print("失敗:", res.status_code)
return
# ファイルに保存
with open(save_file, 'wb') as fp:
fp.write(res.content)
print("save:", save_file)
# メイン処理
if __name__ == '__main__':
download_all()
保存先のフォルダ名を指定するとフォルダ作成をしてくれます。
②「base_url」
1枚目の画像が置かれているurlになります。
③{0}の部分
1~1000まで切り替えながらダウンロードと保存を繰り返します。
まとめ、注意点と改善が必要なところ
画像の一括ダウンロードができるようになりました。
ただし、ウェブ上にある画像には無断転載や2次使用の禁止されているものが
たくさんありますので、ダウンロードする前に必ずご確認ください。
また、今回のプログラムについては、
ダウンロード元のURLの構成が連番になっているなど、
いくつか制約条件があります。
アップされている画像の枚数も考えずダウンロードを
トライするような処理ですので、改善の余地はまだまだあります。
ウェブサイトのURL構造を解析⇒画像ファイルを探してダウンロード。。。
なんていう処理が書けるかわかりませんが、
今後書けるようになれたら、またご紹介します。
これまで作成したPythonプログラムについても、
以下の記事でまとめていますので、そちらも参考にしてみてください。
もしよろしければ、ブログランキングについても
ポチっとしていただければ嬉しいです。