pythonで連番ファイルダウンローダ
つくったので公開。CUIアプリ。本体は81行くらい。実はGUIバージョンもあって、そっちはTkinterとthreadモジュールを使っているものなんだけど、219行もあるのでそのうち。はてなダイアリーにファイル添付機能があるとプログラムの公開が楽にできるのになあ、、、
#! /usr/bin/python import os, sys, time, urllib class getter(urllib.URLopener): """ usage ex) url : http://www.whateverYouWant.co.jp fileprefix : image start : 0 end : 10 place : 3 extensions : [".jpg", ".bmp"] /------------ url ------------\/fileprefix\/start~end with place\/extensions\ http://www.WhateverYouWant.co.jp/image 001 ~ 010 .jpg this class's method 'go', in this example, first try to get "image001.jpg". if fail, it will try to get "image001.bmp" """ def __init__(self): urllib.URLopener.__init__(self) self.url = "" self.fileprefix = "" self.extensions = [""] self.start = 0 self.end = 0 self.place = 0 self.waittime = 3 self.savedir = "." def wait(self): for n in range(self.waittime): print ".", time.sleep(1) print "" # newline def putplace(self, num): """ ex) if self.place == 3, putplace(23) => "023" == 4, putplace(23) => "0023" """ s = str(num) while len(s) < self.place: s = "0" + s return s def error_fix(self): if self.url[-1] != "/": self.url += "/" if self.savedir[-1] != "/": self.savedir += "/" if self.place < 0: self.place = 0 if not os.path.exists(self.savedir): print "create directory %s" % self.savedir os.mkdir(self.savedir) def get(self, directory): self.savedir = directory self.error_fix() for i in range(self.start, self.end + 1): for ext in self.extensions: src = "%s%s%s%s" % (self.url, self.fileprefix, self.putplace(i), ext) dst = "%s%s%s%s" % (self.savedir, self.fileprefix, self.putplace(i), ext) print "%s ..." % src, try: self.retrieve(src, dst) print "get", self.wait() break except IOError: print "fail", self.wait() continue def status(self): return {"url":self.url, "fileprefix":self.fileprefix, "extensions":self.extensions, "start":self.start, "end":self.end, "place":self.place, "waittime":self.waittime, "savedir":self.savedir} def vip2dget(dir, start, end): vip2d = getter() vip2d.url = "http://up2.viploader.net/pic2d/src/" vip2d.fileprefix = "viploader2d" vip2d.extensions = [".jpg", ".gif", ".bmp", ".png"] vip2d.start = start vip2d.end = end vip2d.place = 6 vip2d.get(dir) def vipget(dir, start, end): vip = getter() vip.url = "http://up2.viploader.net/pic/src/" vip.fileprefix = "viploader" vip.extensions = [".jpg", ".gif", ".bmp", ".png"] vip.start = start vip.end = end vip.place = 6 vip.get(dir) def vipkbget(dir, start, end): vipkb = getter() vipkb.url = "http://up2.viploader.net/bg/src/" vipkb.fileprefix = "vlbg" vipkb.extensions = [".jpg", ".gif", ".bmp", ".png"] vipkb.start = start vipkb.end = end vipkb.place = 6 vipkb.get(dir) if __name__ == '__main__': import os, sys if len(sys.argv) != 5: print "usage %s alt start end dir" % sys.argv[0].split("\\")[-1] print "alt: vip, vip2d, vipkb" sys.exit(0) func_obj = lambda : None if sys.argv[1] == "vip": func_obj = vipget elif sys.argv[1] == "vip2d": func_obj = vip2dget elif sys.argv[1] == "vipkb": func_obj = vipkbget s = int(sys.argv[2]) e = int(sys.argv[3]) d = sys.argv[4] func_obj(d, s, e)