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

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

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

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

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

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

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でファイルをダウンロードする方法を忘れてしまったときは、ぜひまたこの記事をご覧ください!

「プログラミング、右も左もわからない…」という方にオススメ

cta_under_bnr

当プログラミングスクール「侍エンジニア」では、これまで6000人以上のエンジニアを輩出してきました。

その経験を通してプログラミング学習に成功する人は、「目的目標が明確でそれに合わせた学習プランがあること」「常に相談できる人がそばにいること」「自己解決能力が身につくこと」この3つが根付いている傾向を発見しました。

侍エンジニアは上記3つの成功ポイントを満たすようなサービス設計に磨きをかけております。

cta_under_bnr

「自分のスタイルや目的に合わせて学習を進めたいな」とお考えの方は、ぜひチェックしてみてください。

詳細はこちら

書いた人

侍テック編集部

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

おすすめコンテンツ

まずはここから!初心者でも1から学べるプログラミング入門カリキュラム

転職成功で受講料0円!あなたもプログラミングを学んでエンジニアデビュー