2015/03/21

[Python]指定した文字列でフォルダを作成し、指定したURLのファイルをダウンロードし保存する。

我ながら長ったらしくかつわかりにくいタイトルになってしまったと思っているが、[Python]Webページのタイトル・画像URLを取得する。の続きである。
前記事ではURLを与えると変数titleにそのページのタイトル、リストimglistに正規表現に合致する画像URLが格納されるようにした。
この記事のタイトルの言わんとすることは、titleという名前のフォルダを作成し、そのフォルダにimglistに格納されている画像URLから画像をダウンロードし、titleフォルダに保存する、ということだ。

さっそく中身に入る。

#画像保存フォルダ作成
title = title.encode('shift_jis')
try:
  os.mkdir(title)
  os.chdir(title)
  print u"フォルダを作成しました。"
except:
  print u"フォルダを作成できませんでした。処理を中止します。"
  sys.exit()

まずはtitleの文字コードをshift_jisに変更する。
こうしないと(少なくともWindowsでは)文字化けが発生してしまうようだ。他OSについては所有していないのでよくわからない。
titleという名前のフォルダを作成し、そのフォルダへ移動する。
titleにフォルダ名に使えない文字が含まれていたり、そのフォルダが既に存在していたりするとエラーを吐くので、それをexceptでキャッチしその旨を表示するようにした。
エラーを吐いた場合、その時点でプログラムを終了する(sys.exit())。

そしていよいよ画像ファイルをダウンロードし保存する。

#画像ダウンロード
i = 1
for imgurl in imglist:
  savepath = os.path.join(os.getcwd(), os.path.basename(imgurl))
  urllib.urlretrieve(imgurl, savepath)
  print str(i)+u"枚目ダウンロード完了"
  i+=1
print u'ダウンロードが完了しました。'

まず、ダウンロードした枚数を表示するために変数iを用意する。
そしてfor文でimglistからURLを取り出す。(imgurl)
for文内ではまずファイルの保存パスを決める。ファイルはtitleフォルダ(先ほどtitleフォルダに移動しているので、カレントディレクトリとなる。すなわちos.getcwd()。)内にサーバー側の画像ファイル名でそのまま保存する。
画像ファイル名はos.path.basename(imgurl)を使い、画像URLの末尾を取り出して得る。
(basename(path)についてはリファレンスを確認。)
つまり保存するファイルのパスはos.getcwd()とos.path.basename(imgurl)を結合したものになるが、os.getcwd() + os.path.basename(imgurl)としてもうまくいかない。(カレントディレクトリの名前+ファイル名の文字列をファイル名とすることになってしまう。)
そこで、os.path.join(os.getcwd(), os.path.basename(imgurl))としてパスを表現する。(同様にos.path.joinについてはリファレンスを確認。)

ファイルの保存にはurllib.urlretrieve関数を用いた。
第1引数に保存する画像のURL(imgurl)、第2引数に保存するパス(savepath)を与えればよい。
そして「○枚目ダウンロード完了」と表示する。もちろんこれは必要ないが、実行した時に「○枚目ダウンロード完了」と表示が増えていくのがいかにもプログラミングした感があってうれしいから書いてみた。

以上でとりあえず目的のプログラムは完成した。
使っていていくつか問題も見つけたので、自分で使う分には不都合ないが、今後修正することも考えたい。

0 件のコメント:

コメントを投稿