Python requests HTTPメソッド

Python学習【365日チャレンジ!】160日目のマスターU(@Udemy11)です。

カエルの繁殖期が過ぎたのか、夜もあまりカエルの鳴き声が聞こえなくなってきました。

今度は朝から夕方までセミが鳴き続けるので、うるさくて仕方ないのですが、松尾芭蕉が聴いていた【岩に染み入る蝉の声】のようなセミの鳴き声だったらいいのにな〜と思ったりもします。

そんな優雅な生活を夢見ながら、今日もPythonを学習したいと思います。

昨日の復習

昨日は、HTTPメソッドでクライアントが要求する処理(GET,POST,PUT,DELETE)を伝えるurllibの使い方について学習しました。

GETメソッドについては、URLのあとに?をつけてその後にパラメーターを付け加えましたが、POST等の場合は、dataとしてパラメーターを読み込んで、要求をサーバーにリクエストしました。

POST、PUT、DELETEについては、リクエストのコードがほぼ同じで、 URLとmethodだけを変えるだけでした。

詳しくは、昨日の記事をごらんください。

今日は、requestsライブラリについて学習しましょう。。

requestsとは

requestsは、昨日学習したurllibよりも機能を付け加えたり、人がより直感的にわかりやすく使えるようにしたHTTPメソッドを扱える人気のあるサードパーティーのパッケージです。

urllibに比べると非常にシンプルなコードで済むので、urllibよりも利用されていて、代表的な活用方法は、Web上のデータを取得するWebスクレイピングです。

pipインストールでインストールしますが、AnacondaでPythonをインストールした場合はすでにインストールされているかもしれません。

インストールされていない場合は、pip install requestsでインストールするか、PycharmのPreferencesからインストールしておきましょう。

GET

それではそれぞれのメソッドを使うコードを書いていきますが、今回もhttps://httpbin.org/getを使ってリクエストを送信します。

import requests


payload = {'key': 'value1', 'key2': 'value2'}

r = requests.get('https://httpbin.org/get', params=payload)

print(r.status_code)
print(r.text)
print(r.json())

出力結果

200
{
  "args": {
    "key": "value1", 
    "key2": "value2"
  }, 
  "data": "", 
  "files": {}, 
  "form": {}, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Content-Length": "0", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.24.0", 
    "X-Amzn-Trace-Id": "Root=1-5f0daodbf-8e38720037865fa06ce11c0e"
  }, 
  "json": null, 
  "origin": "111.84.48.111", 
  "url": "https://httpbin.org/delete?key=value1&key2=value2"
}

{'args': {'key': 'value1', 'key2': 'value2'}, 'data': '', 'files': {}, 'form': {}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Content-Length': '0', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.24.0', 'X-Amzn-Trace-Id': 'Root=1-5f0daodbf-8e38720037865fa06ce11c0e'}, 'json': None, 'origin': '111.84.48.111', 'url': 'https://httpbin.org/delete?key=value1&key2=value2'}

urllibならwithステートメントでリクエストを送る必要がありました。

しかし、requestsを使えば、非常にシンプルなコードで済むので、6行目のように、URLのあとの引数params=にパラメーターを渡すだけでリクエストが完了します。

出力は、status_codetextjsonにしています。

status_codeは、HTTPのステータスコードのことで、リクエストに対してどのような結果が返されたかを次のような数字で表しています。

  • 100番台 案内のレスポンス(情報)
  • 200番台 正常処理のレスポンス(成功)
  • 300番台 リダイレクトメッセージ(転送)
  • 400番台 クライアントエラーのレスポンス(失敗)
  • 500番台 サーバーエラーのレスポンス(失敗)

サーバーがダウンしていて、サイトを見ることができないときなどは、501エラーなどが表示されるのをみたことがあるかと思います。

今回の出力結果は200なので、処理が成功したことがわかります。

あとは、テキストとJSONでリクエストの結果を出力しています。

POST

POSTも同じコードを使います。

import requests


payload = {'key': 'value1', 'key2': 'value2'}

r = requests.post('https://httpbin.org/post', params=payload)

print出力をしていませんが、requests.のあとをpostに変更するだけです。

もちろんhttp://httpbin.org/のあともpostに変更しています。

PUT

POSTに続き、PUTも同じコードでリクエストできます。

import requests


payload = {'key': 'value1', 'key2': 'value2'}

r = requests.put('https://httpbin.org/put', params=payload)

このコードもrequests.のあとをputに変更するだけです。

DELETE

最後にDELETEですが、これまたrequests.のあとをdeleteに変更するだけです。

import requests


payload = {'key': 'value1', 'key2': 'value2'}

r = requests.delete('https://httpbin.org/delete', params=payload)

めちゃくちゃ簡単なので、urllibよりもrequestsが使われているわけですね。

timeout

Webページを読み込む時にタイムアウトしてページを読み込めないことがあるかと思います。

いつまでもリクエストのレスパンスを待っていられないので、タイムアウトの時間を設定してエラーを起こして処理を中断させているのですが、requestsは、このタイムアウトも指定することができます。

import requests


payload = {'key': 'value1', 'key2': 'value2'}

r = requests.get('https://httpbin.org/get', params=payload, timeout=0.01)

このコードの場合、timeoutが0.01秒に設定されているので、その時間ではサーバーがレスポンスを返せないので、エラーが起こります。

timemout=1とすれば、1秒の処理時間があるので、サーバーがレスポンスを返して正常に処理が終了します。

もちろん複雑なリクエストの場合はもう少し時間がかかりますが、上記のようなシンプルなリクエストであれば、1秒もあればレスポンスを返せるということです。

使いみちは?

requestsの使い方を検索すると、真っ先に出てくるのが、Beautiful Soupなどの別パッケージと組み合わせたWebスクレイピングです。

サイトの情報をいちいち手動でコピーペーストしていては、あっという間に時間が過ぎてしまいます。

基本的にWebは情報が溢れかえっている分、お宝情報もたくさん埋もれています。
そんなお宝情報をかき集められるのがWebスクレイピングで、効率よく情報を集めて有効活用することができるわけです。

といいつつも具体的にどうやればいいのかは今後学習する必要があるので、まずはこんな使い方ができるということを理解しておきましょう。

それでは明日もGood Python!