Python requestsを理解して活用しよう
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を使用します。
まず、上記サイトを参照して下記項目を調べましょう。
- リクエスト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スクレイピングなどにご活用ください。