【Python入門】urllibを使ってファイルをダウンロードしよう

この記事では、Pythonのurllibパッケージの使い方について解説したいと思います。

Pythonでインターネットにアクセスしたい
インターネットからファイルをダウンロードしたい

この記事ではこのように考えている初心者に向けて、

  • urllibとは
  • GET、POSTの違い
  • HTMLファイル、ファイルをダウンロードする方法

についての解説をします。urllibパッケージについての知識を深めていきましょう!

本記事を読む前に、Pythonがどんなプログラミング言語なのかをおさらいしておきたい人は次の記事を参考にしてください。

→ Pythonとは?特徴やできること、活用例をわかりやすく簡単に解説

なお、その他のPythonの記事についてはこちらにまとめています。

目次

urllibとは

urllibはURLにアクセスしたり、インターネット上のリソースを取得することができるパッケージです。urllibには4つのモジュールが含まれています。

公式ドキュメントによると、

urllib.requestURLを開いて読むためのモジュール
urllib.errorurllib.requestが発生させる例外
urllib.parseURLをパースするためのモジュール
urllib.robotparserrobots.txtファイルをパースするためのモジュール

と書かれていますが、urllibでは主にurllib.requestを使うことが多いです。urllib.requestでは、Webサイトにあるデータにアクセスすることが出来ます。これらの機能を使うためにはWebサービスの基本的な設計モデルであるRESTについても知っておく必要があります。

GET、POSTの違い

先程話したRESTは、

  • ステートレスなクライアント/サーバプロトコル
  • すべての情報(リソース)に適用できる「よく定義された操作」のセット
  • リソースを一意に識別する「汎用的な構文」
  • アプリケーションの情報と状態遷移の両方を扱うことができる「ハイパーメディアの使用」

という原則が作られています。(Wikipediaより)

中でも2番目の項目では、GET、POST、PUT、DELETEなどの名前の小さな操作用のセットが定義されています。urllibでもこれらのセットを使ってインターネット上のリソースを取得していきます。

通常はGETやPOSTなどのメソッドを使ってブラウザなどからサーバーにリクエストを送信しますが、やや混同しやすい部分ですので注意が必要です。基本的に、GETは何かを取得するとき、POSTは何かを新しく登録するときに使われます。

またブラウザとWebサーバーで通信をする場合は、GETではURLにデータを追加して送りますがPOSTではHTTPリクエストのメッセージボディ(本文)にデータを追加して送信をしています。

何のことかよくわからないかもしれませんが、urllibなどのインターネットを介した通信では必須とされる知識なのでぜひ覚えておきましょう!

HTMLファイルをダウンロードする方法

それではまずはHTMLファイルをダウンロードしてみましょう。こちらのコードをご覧ください。

import urllib.request

data = urllib.request.urlopen("http://example.com/")
html = data.read()
print(html)
data.close()

実行結果

b'<!doctype html>n<html>n<head>n    <title>Example Domain</title>nn    <meta charset="utf-8" />n    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />n    <meta name="viewport" content="width=device-width, initial-scale=1" />n    <style type="text/css">n    body {n        background-color: #f0f0f2;n        margin: 0;n        padding: 0;n        font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;n        n    }n    div {n        width: 600px;n        margin: 5em auto;n        padding: 50px;n        background-color: #fff;n        border-radius: 1em;n    }n    a:link, a:visited {n        color: #38488f;n        text-decoration: none;n    }n    @media (max-width: 700px) {n        body {n            background-color: #fff;n        }n        div {n            width: auto;n            margin: 0 auto;n            border-radius: 0;n            padding: 1em;n        }n    }n    </style>    n</head>nn<body>n<div>n    <h1>Example Domain</h1>n    <p>This domain is established to be used for illustrative examples in documents. You may use thisn    domain in examples without prior coordination or asking for permission.</p>n    <p><a href="http://www.iana.org/domains/example">More information...</a></p>n</div>n</body>n</html>n'

まずはurllib.requestをimportします。

その後はurlopenメソッドでURLを指定して、readメソッドとprint関数でHTMLファイルの中身を表示させています。

「n」は改行を意味していますが、これを改行に置換してみると、

b'<!doctype html><html><head>    <title>Example Domain</title>

    <meta charset="utf-8" />
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <style type="text/css">
    body {
        background-color: #f0f0f2;
        margin: 0;
        padding: 0;
        font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
        
    }
    div {
        width: 600px;
        margin: 5em auto;
        padding: 50px;
        background-color: #fff;
        border-radius: 1em;
    }
    a:link, a:visited {
        color: #38488f;
        text-decoration: none;
    }
    @media (max-width: 700px) {
        body {
            background-color: #fff;
        }
        div {
            width: auto;
            margin: 0 auto;
            border-radius: 0;
            padding: 1em;
        }
    }
    </style>    
</head>

<body>
<div>
    <h1>Example Domain</h1>
    <p>This domain is established to be used for illustrative examples in documents. You may use this
    domain in examples without prior coordination or asking for permission.</p>
    <p><a href="http://www.iana.org/domains/example">More information...</a></p>
</div>
</body>
</html>
'

このように見やすくなりましたね。

また、urlopenメソッドではGET通信を使ってHTMLデータを取得しています。

ファイルをダウンロードする方法

先程のHTMLファイルをダウンロードしたコードを少し変えれば、ファイルもダウンロードすることが出来ます。こちらのコードをご覧ください。

import urllib.request

url = "http://example.com/"
urllib.request.urlretrieve(url, './ex.html')

このコードを実行してみれば、ex.htmlという名前のファイルが、実行されているディレクトリの配下に、指定したURLからダウンロードされると思います。このようにファイルをダウンロードするだけであればたった3行のコードを実行するだけで実現させることが出来ます。

まとめ

今回は

  • 簡単なインターネットの決まりごと
  • urllibを使ってファイルをダウンロードする方法

について解説をしてきました。

想像よりも簡単にインターネットからファイルをダウンロード出来たのではないでしょうか。urllibには他にも様々なメソッドが用意されています。Pythonでファイルをダウンロードする方法を忘れてしまったときは、ぜひまたこの記事をご覧ください!

この記事を書いた人

侍エンジニア塾は「人生を変えるプログラミング学習」をコンセンプトに、過去多くのフリーランスエンジニアを輩出したプログラミングスクールです。侍テック編集部では技術系コンテンツを中心に有用な情報を発信していきます。

目次