at_yasu's blog

ロード的なことを

HPにある、リンクの貼られた画像をダウンロード

指定したHP上にあるリンクの貼られた画像をダウンロードするスクリプト。

画像上はサムネイル表示で、大きい画像へのリンクが貼られている場合があります。それをいちいちクリックして取り出すのが面倒なのでさくさくっと作成。

朝っぱらから、こんな物を作ってたので、頭が慣れていたせいか所要時間は30分程度。


使い方は簡単で、スクリプトの引数にURLを指定して実行すると、勝手にダウンロードします。

#!/usr/bin/env python2.5
#
# $Id: save_image.py 48 2008-11-07 12:42:49Z yasui $
import getopt
import sys,os,re
import urllib2

_REV = "$Id: save_image.py 48 2008-11-07 12:42:49Z yasui $"
_CLIENT = 'Mozilla/5.0'
_BASE_PATH = './'
_VERBOSE = True

def _getOpener():
    opener = urllib2.build_opener()
    opener.addheaders = [('User-agent', _CLIENT)]
    return opener

def saveFromURL(url):
    opener = _getOpener()
    f = os.path.basename(url)
    
    if _VERBOSE:
        print "save as %s for %s/%s" % (url, _BASE_PATH, f)
    fp = open(_BASE_PATH+'/'+f,'w')
    fp.write(opener.open(url).read())
    fp.close()

def getImageFromURL(url):
    a_tag_re = re.compile(r'<[aA][^hH]+[hH][rR][eE][fF]=[\'"]([^\'"]+)[\'"]')
    img_re   = re.compile(r'.+([jJ][pP][eE]?[gG]|[pP][nN][gG])$')
    str = _getOpener().open(url).read()
    for image_url in [e for e in a_tag_re.findall(str) if img_re.match(e)]:
        saveFromURL(image_url)


if __name__ == '__main__':
    usage = """usage: %s [hq] [-p save_directory] url
    -h  show this.
    -q  Quiet. Default is verbose.
    -d  save directory path. Default is './'
    url These are image in homepage.

    Version: %s
""" % (sys.argv[0], _REV)
    
    optlist,urllist = getopt.getopt(sys.argv[1:],'hqp:')
    if not urllist:
        print usage
        sys.exit(1)

    for opt,optarg in optlist:
        if opt == '-h':
            print usage
            sys.exit(0)
        elif opt == '-q':
            _VERBOSE = False
        elif opt == '-p':
            if not os.path.exists(optarg):
                print "%s is not found" % (optarg)
                print usage
                sys.exit(1)

            _BASE_PATH = optarg
        else :
            print "unknown option: %s" % (optarg)
            print usage
            sys.exit(1)
    
    for url in urllist:
        getImageFromURL(url)