試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

Pythonでurllibを使用してファイルをローカルに保存する

Webページの内容を開いて処理を行う」のurllibモジュールを使用すると、ファイルをローカルにダウンロード保存することが簡単にできる。

関数を使用する方法

#! /usr/bin/python
# -*- encoding: utf-8 -*-

import urllib
import sys
import os

url = "http://www.python.jp/pub/doc_jp/html-2.4.tar.bz2"

try:
  (filename, headers) = urllib.urlretrieve(url, "/tmp/%s" % os.path.basename(url))
except IOError:
  print u"保存に失敗しました".encode("utf-8")
  sys.exit(1)
urllib.urlcleanup()  # キャッシュの削除

print u"ファイル名: %s".encode("utf-8") % filename
print "-" * 80
print u"HTTPヘッダ:".encode("utf-8")
for l in str(headers).splitlines():
  print l

この例ではPythonのドキュメントの日本語訳(HTML版)を/tmp/以下に保存する。
urlretrieve()関数にはURLとローカル上に保存する場所を指定する。
戻り値のタプルの内、2番目の値はHTTPヘッダが格納される(HTTPの場合)。

URLopener系クラスを使用する方法

#! /usr/bin/python
# -*- encoding: utf-8 -*-

import urllib
import sys
import os

class MyURLopener(urllib.FancyURLopener):
  version = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)"  # User-Agent:
  def open_unknown(self, given_url, data):
    print u"URLではないため、処理できません: %s".encode("utf-8") % given_url
    sys.exit(1)

url = "http://www.python.jp/pub/doc_jp/html-2.4.tar.bz2"
#url = "hoge://www.python.jp/pub/doc_jp/html-2.4.tar.bz2"

opener = MyURLopener({})

try:
  (filename, headers) = opener.retrieve(url, "/tmp/%s" % os.path.basename(url))
except IOError:
  print u"取得に失敗しました".encode("utf-8")
  sys.exit(1)
opener.cleanup()  # キャッシュの削除

print u"ファイル名: %s".encode("utf-8") % filename
print "-" * 80
print u"HTTPヘッダ:".encode("utf-8")
for l in str(headers).splitlines():
  print l

FancyURLopenerもしくはURLopenerクラス、およびそれらの子クラスを使用する方法では、メンバ関数retrieve()を使用する。

関連記事:

参考URL: