Python requestsを理解して活用しよう

プログラミング 公開日: 更新日:
ブックマーク
Python requestsを理解して活用しよう
Pythonで使われるHTTPライブラリであるrequestsに関する記事です。requestsとは何か。 標準ライブラリurllib.request モジュールとrequestsとの違いを解説します。 次に使い方について詳しく解説します。 最後にrequestsを使い、Webサイトのデータを取得する方法を説明します。

requestsを使うとWebデータの操作ができます。
特に使われるのはWebスクレイピングやWebAPIを使ったデータの取得などです。
WebサイトにはHTMLやXMLが使われており、そのようなデータの取り扱いを容易にするライブラリです。

requestsはWebデータを操作できるライブラリ

requestsとは

requestsとはHTTPライブラリです。HTTPとは、自分とWebサーバーとのHTML等の情報を送受信するためのプロトコル(約束)になります。HTTPにはデータの参照や更新などのメソッドが用意されています。

そのHTTPメソッドを操作しやすくしたものがHTTPライブラリになります。公式の言葉を借りると「Requestsは人が使いやすいように作られた、エレガントでシンプルなPythonのHTTPライブラリです。」

urllib.requestとrequestsの違い

PythonにはHTTPライブラリの標準モジュールとしてurllib.requestがあります。
もちろん上記のurllib.requestでもWebデータ操作はできますが、多くの場合、requestsを使用したほうが楽にプログラミングができます。

urllib.requestでは参照先をオープンする、HTTPメソッドリクエストを送る、データをデコードする、参照先を閉じる、といった一連の流れを記述する必要があります。
上記の処理をrequestsで記述すると、「参照先を指定してHTTPメソッドリクエストを送る」のみです。

例として、テスト用としてよく使われるサイト「httpbin.org」に対してデータ取得のGETメソッドのリクエストを送って、そのレスポンスを表示する処理をそれぞれ書いてみます。

urllib.requestの場合

import urllib.request
 
url = 'https://httpbin.org/get'
 
r = urllib.request.Request(url)
 
with urllib.request.urlopen(r) as response:
    body = response.read()
    print(body.decode('utf-8'))

requestsの場合

import requests
 
url = 'https://httpbin.org/get'
 
r = requests.get(url)
 
print(r.text)

どうでしょうか。requestsの方が簡単かつ直感的な記述かと思います。

requestsの使い時

WebスクレイピングやWebAPIを使いWebからデータを取得したいときによく使います。

requestsの使い方

requestsのインストール

requestsはサードパーティーライブラリですので使用するにはインストールが必要です。
コードを書く前にまずインストールをしましょう。

pipでインストールの場合

pip install requests

condaでインストールの場合

conda install requests

requestsの使い方

requestsの使い方について説明します。まずHTTPメソッドについて説明します。
HTTPメソッドには下記のようなものがあります。

GET :サーバーから情報を取得
POST :サーバーへ情報を登録
PUT :サーバーの情報を更新
DELETE :サーバーの情報を削除

これらの操作をする際の記述例が下記です。

import requests
 
# GETメソッド
requests.get('操作先のURL')
# POSTメソッド
requests.post('操作先のURL')
# PUTメソッド
requests.put('操作先のURL')
# DELETEメソッド
requests.delete('操作先のURL')

requests.getの使い方

上記のような操作の中でも、よく使われるGETの使い方を今回はさらに説明します。

requests.getは次のように記述します。

response=requests.get(url, params=None, **kwargs)

主な引数と戻り値は下記になります。

引数

url :参照先(必須)
params:リクエストパラメーター
以下\*\*kwargs例
timeout:リクエストのタイムアウト設定時間
headers:ヘッダ情報。認証等で使用

戻り値

text:レスポンスの内容
status\_code:ステータスコード
※ステータスコードについて
200:成功
400番台:失敗(リクエスト側に原因)
500番台:失敗(サーバー側に原因)

例として「httpbin.org」にGETリクエストを送り、レスポンスを受け取ります。
(今回はヘッダ情報は不要なので記述していません。)

import requests
 
url = 'https://httpbin.org/get'
 
response = requests.get(url,params={'key':'value'},timeout=1)
 
print(response.status_code)
print(response.text)
 
結果
200
{
  "args": {
    "key": "value"
  },
  "headers": {
    "Accept": "*/*",
    "Accept-Encoding": "gzip, deflate",
    "Host": "httpbin.org",
    "User-Agent": "python-requests/2.28.1",
    "X-Amzn-Trace-Id": "Root=1-6326cdeb-137ef90e3b17df1232c0243d"
  },
  "origin": "60.114.76.122",
  "url": "https://httpbin.org/get?key=value"
}

WebAPIからデータを取得してみよう

次にrequestsを使いWebAPIにリクエストを送り、郵便番号から住所を取得してみましょう。
今回は下記APIを使用します。

郵便番号検索API - zipcloud

まず、上記サイトを参照して下記項目を調べましょう。

  • リクエストURL
  • リクエストパラメーター
  • レスポンス内容

調べた項目を踏まえプログラムを記述してみましょう

import requests
 
# URL, パラメータの指定
url = 'https://zipcloud.ibsnet.co.jp/api/search'
params = {'zipcode': '7830060'}  #ここに調べたい郵便番号を記述
 
response = requests.get(url, params=params)
 
print(response.text)
 
レスポンス全文
{
    "message": null,
    "results": [
        {
             "address1": "高知県",
             "address2": "南国市",
             "address3": "蛍が丘",
             "kana1": "コウチケン",
             "kana2": "ナンコクシ",
             "kana3": "ホタルガオカ",
             "prefcode": "39",
             "zipcode": "7830060"
        }
    ],
    "status": 200
}

urlにリクエストURLを、paramsにリクエストパラメーター{'zipcode': '7830060}を格納しrequests.get()を実行します。response.textでレスポンスを表示しています。
サイトに示されているレスポンス内容が返ってきました。

エラーハンドリング

最後に、requestsを使用する際のエラーハンドリングについて、簡単に触れておきます。

外部にリクエストを送るため、例外をきちんとキャッチし、適切に対処することは非常に重要です。

例えば、APIのURLを間違えていた場合、接続できず例外が発生します。
その際、処理を適切に書いていなかった場合、エラーが発生し、その時点で処理が終了してしまいます。

下記のように例外をキャッチし、適切に処理を書くことで、予期せず処理が終了することを避けることができます。

import requests

try:
    response = requests.get('https://api.example.com/search', timeout=3)
    response.raise_for_status()
    print(response.text)
except requests.exceptions.HTTPError as errh:
    print("HTTPError")
except requests.exceptions.ConnectionError as errc:
    print("ConnectionError")
except requests.exceptions.Timeout as errt:
    print("Timeout")
except requests.exceptions.RequestException as err:
    print("RequestException")

まとめ

requestsを使うことによりPythonらしい直観的な記述が可能になります。
WebAPIへのリクエストやWebスクレイピングなどにご活用ください。

TECH PLAYでは、ITに関わる様々なイベント・勉強会・講演会・交流会・カンファレンス・セミナーなどの情報を集約し掲載しています。

テクノロジーと共に成長しよう、
活躍しよう。

TECH PLAYに登録すると、
スキルアップやキャリアアップのための
情報がもっと簡単に見つけられます。

面白そうなイベントを見つけたら
積極的に参加してみましょう。
ログインはこちら

タグからイベントをさがす