PythonでWebサーバーのデータを取得するには?Requestsの使い方

PythonでWebサーバーのデータを取得するにはどうすればいいの?
Requestsライブラリの使い方が知りたい

みなさんは、インターネットで確認できる情報をプログラムで扱いたいと思ったことはありませんか?たとえば、お気に入りのサイトに新着記事がでたら知りたい、お気に入りの画像を収集したいなど。

そこで今回は、Requestsライブラリを使ってWebページを取得したり、画像を取得したりするコードを紹介します。

Requestsライブラリを応用すれば「スクレイピング」や「クローリング」も行えます。今回はそれらの方法についてわかりやすく解説していますので、ぜひ参考にしてください!

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

目次

PythonのRequestsライブラリとは

Requestsライブラリは、Webサーバーからデータを取得するためのライブラリです。

Webサーバーからデータを取得するなら、Pythonの標準ライブラリで用意されているurllib2モジュールでも可能です。しかし、urllib2モジュールは、丁寧に手続きを踏んでいく(昔ながらの)作法で使う必要があり、Pythonらしくないと考えられています。

そこで、PythonらしくWebサーバーからデータを取得するために、Requestsライブラリが開発されました。

Requestsライブラリをインストールする

では、Requestsライブラリをインストールして、早速Webサーバーからデータを取得してみましょう。

と言っても、ターミナルから以下のコマンドを入力するだけです。

pip install requests

どんどん進みましょう。

RequestsライブラリでWebサーバーからデータを取得する

HTMLを取得する

以下のコードで、HTMLデータを取得して保存できます。

2つの方法でHTMLデータを保存するコードになっています。

import requests

r = requests.get('https://www.yahoo.co.jp')

with open("test-text.html", "wb") as f:
    f.write(r.text.encode(r.encoding))

with open("test-content.html", "wb") as f:
    f.write(r.content)

初めに保存したtest-text.htmlは、テキスト形式のr.textを保存したデータになっており、出力する際はエンコーディングを指定しないと文字化けする場合があります。

エンコーディングは、encodingプロパティで調べられます。

次に保存したtest-content.htmlは、バイナリ形式のr.contentを保存したデータになっています。

画像を取得する

続いて、画像の保存方法も紹介しましょう。

import requests

# getの引数には好きな画像のURLを書いてください。
# 以下は侍のロゴ画像のURLです。
r = requests.get('https://www.sejuku.net/blog/wp-content/uploads/2017/10/voice_logo.png')

with open("voice_logo.png", "wb") as f:
    f.write(r.content)

エラーチェックも行う

ところで、URLを誤った場合やWebサーバーが応答しなかった場合はどうなるでしょうか。

気になったので実験してみました。

import requests

r = requests.get('https://www.sejuku.net/blog/wp-content/uploads/2017/10/voice_logo_NG.png')

with open("voice_logo_NG.png", "wb") as f:
    f.write(r.content)

このコードを実行すると、無事にvoice_logo_NG.pngが保存されます。これは隠し画像でも見つかったか!?とWindows標準のペイントで開いてみると…。

python-request01

あれ??と思って、テキストエディタで見てみると、以下のように表示されました。

<!DOCTYPE html>
<!--[if IE 8]><html class="ie8"><![endif]-->
<!--[if IE 9]><html class="ie9"><![endif]-->
<!--[if gt IE 8]><!--> <html lang="ja"
    itemscope
    itemtype="http://schema.org/WebSite"
    prefix="og: http://ogp.me/ns#" > <!--<![endif]-->

<head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# article: http://ogp.me/ns/article#">
    <!-- Comment -->
<!-- Google Tag Manager -->
(省略)

これはHTMLデータですね…。

ためしにブラウザで「https://www.sejuku.net/blog/wp-content/uploads/2017/10/voice_logo_NG.png」にアクセスしてみましょう。

python-request02

なるほど、404エラーのページが返されたので、そのデータを保存してしまったというわけですね。

この問題を解決するには、HTTPステータスコードを確認するとよいでしょう。

import requests

r = requests.get('https://www.sejuku.net/blog/wp-content/uploads/2017/10/voice_logo_NG.png')

try:
    r.raise_for_status()

    with open("voice_logo_NG.png", "wb") as f:
        f.write(r.content)
except requests.exceptions.HTTPError:
    print("Webサーバからデータを取得できません。")

先ほどのコードに、r.raise_for_status()を追加しました。

このメソッドは、HTTPステータスコードが200番台以外のときに例外を発生させますので、try-exceptで例外を処理する方針です。

その他のリクエスト方法は?

ここまでで、Webサーバーとの通信はrequests.get()しか使っていません。requests.get()は、その名のとおりHTTP通信のGETに対応しています。

HTTP通信には、GETのほかに、POST、PUT、DELETE、HEAD、OPTIONSがあります。

そしてRequestsにも、それぞれに対応するメソッド(post()、put()、delete()、head()、options())が用意されていますので、HTTP通信でできることはすべてできると言えるでしょう。

取得したデータを解析する

Requestsで取得したデータ(r.content)がHTMLデータの場合は、中身を解析して必要なデータを抽出したいところです。しかし残念ながら、HTMLデータの解析はRequestsライブラリの守備範囲を超えていますので、他のライブラリを使いましょう。

私は、BeautifulSoupを使うことをオススメします。

RequestsとBeautifulSoupを使ってHTMLデータを解析する方法については、以下の記事で説明していますので、次はこの記事をご覧ください!

まとめ

今回は、Requestsライブラリをインストールして、HTMLデータと画像データを保存する方法を説明しました。

また、画像データを保存したつもりが、HTMLデータが保存されていることがあり、それを判別するためにHTTPステータスコードを確認する方法も説明しました。

ここまでがRequestsライブラリの基本中の基本ですので、ここまで実際に動かしてみて、なんと簡単なことか!と思っていただければ幸いです。

それでは!

この記事を書いた人

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

目次