"The Starry Night" by Vincent van Gogh |
ところがこのサイト、高解像度で見られるのは非常にいいことなのですが、肝心のダウンロードができない。せっかく高解像度なんですから保存できてもいいはずなのに、だけどできない。Google Mapなんかは常に最新の情報に更新しなければならないので、ダウンロードに制限をかけているのは合理性があるんですけど、絵画とか全く更新する必要がないでしょう。著作権も切れてるのに。よく分からないです。
ということで、なければ自分でなんとかしようという精神で、1時間くらいでちゃっちゃとPythonでスクリプト組んでダウンロードするようにしてみました。即興で組んだのでいろいろ粗い面はありますけど、そこら辺は勘弁してください。
#!/usr/bin/env python #-*- coding: utf-8 -*- import sys import re import urllib2 import random from PIL import Image def usage(): print "%s [URL]" % sys.argv[0] return 1 def get_id(url): response = urllib2.urlopen(url) if response.code != 200: raise TypeError data = response.read() return re.search( r'<div id="microscope" data-microId="(.+)">', data).group(1) def get_filename(x, y): return "%i_%i.jpg" % (x, y) def download_image(target_id, x, y, z): urllist = [ "http://lh3.ggpht.com/", "http://lh4.ggpht.com/", "http://lh5.ggpht.com/", "http://lh6.ggpht.com/" ] base_url = random.choice(urllist) url = "%s%s=x%i-y%i-z%i" % (base_url, target_id, x, y, z) try: response = urllib2.urlopen(url) except urllib2.HTTPError: return False with file(get_filename(x, y), "wb") as fp: fp.write(response.read()) return True def download_and_get_max_x(target_id, x, z): result = download_image(target_id, x, 0, z) if result: return download_and_get_max_x(target_id, x+1, z) else: return x def download_and_get_max_y(target_id, y, z): result = download_image(target_id, 0, y, z) if result: return download_and_get_max_y(target_id, y+1, z) else: return y def combine_images(name, max_x, max_y): x_size = 512 y_size = 512 result = Image.new("RGB", (max_x*x_size, max_y*y_size)) for y in range(max_y): for x in range(max_x): image = Image.open(get_filename(x, y)) result.paste(image, (x*x_size, y*y_size)) result.save(name) def main(): if len(sys.argv) == 1: return usage() depth = 3 target_addr = sys.argv[1] target_id = get_id(target_addr) max_x = download_and_get_max_x(target_id, 0, depth) max_y = download_and_get_max_y(target_id, 1, depth) for y in range(1, max_y): for x in range(1, max_x): download_image(target_id, x, y, depth) combine_images("result.png", max_x, max_y) if __name__ == "__main__": sys.exit(main())
使い方は簡単で、
$ python artproject.py http://www.googleartproject.com/museums/tate/mariana-248のようにURLを指定してあげると勝手に取得して結合してくれます。こんな感じで:
"Mariana" by John Everett Millais |
余談
- もともとの動機としては高解像度な絵画の壁紙が欲しくて、いろいろと探し回ったわけですが、どうもGoogle Art Projectしか高解像度の絵画が載っていないので仕方なくといった次第です。
- 利用はどうやらGoogle's Terms of Serviceに準じているようです。ざっと見した感じだとダウンロードを禁止する条項はないですし著作権も切れているので全く問題ないように思えるんですが、もし警告とかきたらチキンですから遠慮無く取り下げます。ご了承ください。
- このネタを題材に時間があればHTMLのスクレイピング、パケット解析についての入門記事を書いてみたいです。
- なんだかんだ言ってちゃんと実物見たほうが綺麗。ミレイの作品は以前東京に行ったときにBunkamuraで見ました。Bunkamuraはそういう催し物よくやっていて、そこらへんが東京羨ましかったり
2 件のコメント:
ileCzer 3興味深く記事を読ませていただきました。本当にありがとうございます。
記事中内のコードですが、次のエラーが出て困っております。
もしよければ、ご教授願えませんでしょうか。
AttributeError: 'NoneType' object has no attribute 'group'
コメントが遅くなって申し訳ありません。
このようなエラーが出るということは、どうやらソースコードに変更がなされたようです。
申し訳ありませんが今回の記事はもう古い記事になってしまったようですので、
新しく解析していただけると幸いです。
コメントを投稿