okpy

Pythonエンジニア兼テックリーダーが、多くのプロジェクトとチーム運営から得た実践的な知識を共有するブログです。

Webからのデータ取得、まだ標準ライブラリで消耗してる? Python Requestsでスマートに解決!

Webからのデータ取得、まだ標準ライブラリで消耗してる? Python Requestsでスマートに解決!

📝 TL;DR (3行要約)

PythonRequestsは、WebサイトやAPIとの通信(HTTP通信)を驚くほど簡単にするためのライブラリです。Web上のデータを取得したり、フォームにデータを送信したりする作業を、人間が読んで理解しやすい直感的なコードで実現できます。複雑なネットワーク設定や手順を気にすることなく、数行のコードでWebと対話できるのが最大の利点です。


1. 🤔 一体Requestsとは何?(核心的な役割と主な使用例)

核心的な役割: あなた専用の超優秀なインターネット司書 📚

Pythonを学び始めると、プログラムからWebサイトの情報にアクセスしたくなる瞬間が必ず訪れます。例えば、「天気予報サイトから明日の天気を自動で取得したい」とか、「好きなニュースサイトの最新記事の見出しを一覧にしたい」といった具合です。

このとき、私たちのプログラムはインターネットの世界に「この情報ください!」とお願い(リクエスト)を送り、相手のサーバーから「はい、どうぞ」と返事(レスポンス)をもらう必要があります。この一連のやり取りをHTTP通信と呼びます。

Pythonには元々urllibという標準ライブラリがあり、このHTTP通信を行うことができます。しかし、urllibは少し手続きが複雑で、初心者にとっては「ただWebページの内容が欲しいだけなのに、こんなに色々書かないといけないの?」と感じてしまうかもしれません。まるで、巨大な図書館で目的の本を探すのに、たくさんの申請書類を自分で書かなければならないようなものです。

そこで登場するのがRequestsライブラリです。

Requestsは、この面倒な手続きをすべて引き受けてくれる、超優秀で親切な司書さんのような存在です。あなたは司書さんに「この住所(URL)にある本(Webページ)が欲しいんだけど」と伝えるだけでOK。司書さん(Requests)は、必要な手続きをすべて裏側で済ませて、あなたが求めていた本そのもの(Webページの内容)をスマートに手渡してくれます。

つまり、Requestsの核心的な役割は、開発者がHTTP通信の複雑さを意識することなく、人間にとって自然で読みやすいコードでWebと対話できるようにすることなのです。

主な使用例: こんな時に大活躍! ✨

Requestsの役割が「優秀な司書」だと分かると、どんな場面で活躍するのかが具体的に見えてきます。

  1. Web APIからのデータ取得 (JSONデータの活用) Webサービスの中には、開発者がプログラムからデータを使いやすいように、専用の窓口(API)を用意してくれているものがたくさんあります。天気予報、株価、地図情報、翻訳サービスなどがその代表例です。これらのAPIは、多くの場合JSONという形式でデータを返してくれます。 Requestsを使えば、こうしたAPIにアクセスしてデータを取得し、それをPythonの辞書やリストとして簡単に扱うことができます。例えば、「東京の現在の天気を教えて」と天気予報APIにリクエストを送り、返ってきた気温や天気の情報をプログラムで利用する、といったことが驚くほどシンプルに実現できます。これは、Requestsが最も輝く使用例の一つです。

  2. 簡単なWebスクレイピングの第一歩 Webスクレイピングとは、Webサイトから自動的に情報を抽出する技術のことです。例えば、ECサイトから特定商品の価格を定期的にチェックしたり、ニュースサイトからヘッドラインを収集したりするのに使われます。 本格的なスクレイピングでは、取得したHTMLの中から目的の情報を探し出す別のライブラリ(例えばBeautifulSoup)が必要になりますが、その大元となるHTMLコンテンツを取得してくるという最初の重要なステップをRequestsが担当します。RequestsでWebページを丸ごと手に入れ、そこから宝探しを始める、というイメージです。

  3. Webフォームへのデータ送信 Webサイトのログインや検索機能のように、私たちがブラウザで情報を入力して「送信」ボタンを押す操作も、Requestsで自動化できます。プログラムからIDとパスワードをログインフォームに送信したり、検索ボックスにキーワードを送って検索結果のページを取得したりすることが可能です。これにより、定期的なレポート作成の自動化など、業務効率化にも繋がります。

このように、RequestsはWeb上の情報とプログラムを繋ぐための、強力かつ不可欠な「最初の扉」の役割を果たしてくれるのです。


2. 💻 インストール方法

RequestsPythonの標準ライブラリではないため、別途インストールが必要です。しかし、心配は無用です。Pythonのパッケージ管理ツールであるpipを使えば、コマンド一発で簡単にインストールできます。

ターミナル(WindowsならコマンドプロンプトPowerShell)を開いて、以下のコマンドを実行してください。

pip install requests

これだけで、あなたのPython環境にRequestsライブラリが追加され、すぐに使えるようになります。


3. 🛠️ 実際に動作するサンプルコード

百聞は一見に如かず。Requestsがいかにシンプルで強力か、実際に動くコードで体感してみましょう。

ここでは、JSONPlaceholderという、開発者がテスト用に自由に使えるダミーAPIを利用します。このAPIにアクセスして、架空のブログ投稿データ(IDが1番の投稿)を取得し、そのタイトルと本文を表示するプログラムを作成します。

以下のコードをコピーして、get_post.pyのような名前で保存し、実行してみてください。

import requests

# データを取得したいAPIのURL
# ここでは「投稿IDが1のデータ」を指定
url = "https://jsonplaceholder.typicode.com/posts/1"

print(f"🔄 データを取得中: {url}")

try:
    # GETリクエストを送信 (タイムアウトを5秒に設定)
    response = requests.get(url, timeout=5)

    # ステータスコードが200番台(成功)でなかった場合に例外を発生させる
    response.raise_for_status()

    # --- 通信成功時の処理 ---
    print("✅ データ取得成功!")

    # レスポンスのステータスコードを表示
    print(f"ステータスコード: {response.status_code}")

    # レスポンスボディをJSON形式からPythonの辞書に変換
    post_data = response.json()

    # 取得したデータからタイトルと本文を取り出して表示
    print("\n--- 取得した投稿データ ---")
    print(f"タイトル: {post_data['title']}")
    print(f"本文:\n{post_data['body']}")
    print("--------------------------")


except requests.exceptions.RequestException as e:
    # ネットワーク接続エラーやタイムアウトなど、リクエストに関するエラー全般をキャッチ
    print(f"❌ エラーが発生しました: {e}")

実行結果の例:

🔄 データを取得中: https://jsonplaceholder.typicode.com/posts/1
✅ データ取得成功!
ステータスコード: 200

--- 取得した投稿データ ---
タイトル: sunt aut facere repellat provident occaecati excepturi optio reprehenderit
本文:
quia et suscipit
suscipit recusandae consequuntur expedita et cum
reprehenderit molestiae ut ut quas totam
nostrum rerum est autem sunt rem eveniet architecto
--------------------------

いかがでしょうか? たったこれだけのコードで、Web上のAPIサーバーと通信し、意味のあるデータを取得・表示することができました。


4. 🔍 コードの詳細説明

上記のサンプルコードが何をしているのか、少し詳しく見ていきましょう。一行ずつではなく、意味のある塊(チャンク)ごとに解説します。

1. ライブラリのインポートとURLの準備

import requests

url = "https://jsonplaceholder.typicode.com/posts/1"
  • import requests: まずは、これから使うRequestsライブラリをプログラムに読み込みます。これがおまじないの第一歩です。
  • url = "...": 次に、どこにデータを取りに行くかを指定します。この文字列が、インターネット上の情報の住所(URL)になります。今回は、JSONPlaceholderの「posts」というデータ群の中の「1番」のデータを指しています。

2. リクエストの送信とエラーハンドリングの骨格

try:
    response = requests.get(url, timeout=5)
    response.raise_for_status()
    
    # ... (成功時の処理) ...

except requests.exceptions.RequestException as e:
    print(f"❌ エラーが発生しました: {e}")
  • try...except: これはエラーハンドリングのための構文です。インターネット通信は、相手サーバーの都合や自分のネットワーク環境によって、必ず成功するとは限りません。tryブロックの中の処理で何か問題が起きた場合に、プログラムがクラッシュするのではなく、exceptブロックの処理を実行するようにしています。これにより、より安定したプログラムになります。
  • response = requests.get(url, timeout=5): ここがRequestsライブラリの心臓部です。requests.get()関数は、指定したurlに対して「情報をください」というGETリクエストを送信します。
    • timeout=5: もしサーバーからの応答が5秒以上ない場合は、通信を諦めてエラー(タイムアウト)とする、という重要な設定です。これを設定しないと、応答のないサーバーに対してプログラムが永遠に待ち続けてしまう可能性があります。
  • response.raise_for_status(): 通信自体は成功しても、サーバー側が「そのページは存在しないよ(404 Not Found)」や「アクセス権がないよ(403 Forbidden)」といったエラーを返してくることがあります。このメソッドは、HTTPステータスコードが4xx(クライアントエラー)や5xx(サーバーエラー)だった場合に、自動的に例外を発生させてくれます。これにより、正常な応答(200 OKなど)が得られた場合のみ、後続の処理に進むことができます。

3. 成功時のレスポンス処理

print("✅ データ取得成功!")
print(f"ステータスコード: {response.status_code}")

post_data = response.json()

print(f"タイトル: {post_data['title']}")
print(f"本文:\n{post_data['body']}")
  • responseオブジェクト: requests.get()が成功すると、サーバーからの返事(レスポンス)が詰まったresponseオブジェクトが返ってきます。このオブジェクトには、ステータスコードやコンテンツ本体など、様々な情報が含まれています。
  • response.status_code: HTTPステータスコードが格納されています。200であれば「成功」を意味します。デバッグの際に非常に役立ちます。
  • post_data = response.json(): これがRequestsの魔法の一つです。APIから返ってきたデータは、元々はただの文字列(JSON形式のテキスト)ですが、.json()メソッドを呼び出すだけで、Pythonで非常に扱いやすい辞書リストの形に自動で変換してくれます。
  • post_data['title']: 辞書形式になったデータから、'title'というキーを指定して、対応する値(投稿のタイトル)を取り出しています。Pythonの基本的な辞書の操作と同じように扱えるのが、Requestsの素晴らしい点です。

5. ⚠️ 注意点またはヒント

Requestsは非常に使いやすいライブラリですが、初心者が陥りがちな罠や、知っておくと便利なヒントがいくつかあります。ここでは、特に重要なものを2つ厳選して紹介します。

  1. ヒント: タイムアウトは必ず設定しよう! ⏳ サンプルコードでも触れましたが、timeoutパラメータの指定は非常に重要です。インターネットは常に安定しているとは限りません。相手のサーバーが落ちていたり、ネットワークが不安定だったりすると、リクエストへの応答が全く返ってこないことがあります。 timeoutを指定しないと、あなたのプログラムは応答を健気に待ち続け、フリーズしたかのように見えてしまいます。経験則として、外部のWebサービスにアクセスする際は、必ずtimeout(例えばtimeout=10のように秒数を指定)を設定する癖をつけましょう。これは、あなたのプログラムを予期せぬトラブルから守るための、簡単で効果的な保険です。

  2. 注意点: 相手は人間じゃない! User-Agentを設定しよう 🤖 Webサイトによっては、プログラムからの自動アクセス(ボットやクローラー)を制限している場合があります。Requestsがリクエストを送る際、デフォルトでは「私はPythonのRequestsというプログラムです」というような情報(User-Agent)をサーバーに送ります。 これを見てサーバーが「プログラムからのアクセスは禁止!」と判断し、アクセスをブロックしてしまうことがあります。 そんな時は、headersパラメータを使って、自分が一般的なWebブラウザであるかのように見せかけることができます。

    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
    }
    response = requests.get(url, headers=headers, timeout=5)
    

    このようにheadersを渡すことで、サーバーからのアクセス拒否を回避できる場合があります。ただし、スクレイピングを行う際は、必ずサイトの利用規約robots.txtなど)を確認し、サーバーに過度な負荷をかけないよう、節度を持って利用しましょう。


6. 🔗 一緒に見ておくと良いライブラリ

Requestsの学習が一通り終わったら、次はこのライブラリと組み合わせて使うことで真価を発揮するライブラリを学んでみましょう。

  • BeautifulSoup4 (bs4) 🍲 Requestsが「Webページという料理の材料(HTML)を市場から仕入れてくるシェフ」だとしたら、BeautifulSoup4は「その材料を調理して、美味しい部分(必要な情報)だけを綺麗にお皿に盛り付けるシェフ」です。 Requestsで取得したHTMLは、タグなどが入り混じった複雑なテキストデータです。BeautifulSoup4は、このHTMLを解析し、CSSセレクタやタグ名を使って、特定のニュース記事のタイトルや、商品の価格といった、目的のデータをピンポイントで簡単に抽出できるようにしてくれます。Webスクレイピングを本格的に行うなら、RequestsBeautifulSoup4は最強のコンビです。

7. 🎉 まとめ

今回は、PythonでWebと対話するための必須ライブラリRequestsについて学びました。

  • Requestsは、HTTP通信を人間にとって分かりやすいコードで実現するためのライブラリです。
  • requests.get(url)で簡単にWeb上の情報を取得できます。
  • .json()メソッドを使えば、APIから返ってきたJSONデータをPythonの辞書に一発で変換できます。
  • timeoutの設定やエラーハンドリングは、安定したプログラムを作る上で欠かせません。

Requestsを使いこなせれば、あなたのPythonプログラムの可能性はインターネット全体に広がります。世界中のWebサービスやデータが、あなたのプログラムの部品になるのです。

最後に、今日学んだことを定着させるための挑戦課題です。ぜひ試してみてください!

  1. 別のデータを取得してみよう: サンプルコードで使ったJSONPlaceholderには、投稿(/posts)以外にも、ユーザー情報(/users)や、コメント(/comments)などのデータがあります。URLの末尾を"/users/1""/posts/1/comments"などに変えて、どのようなデータが取得できるか試してみましょう。

  2. 公開されているAPIを叩いてみよう: 世の中には、無料で使える面白いAPIがたくさんあります。例えば、郵便番号から住所を検索するAPIや、ランダムな猫の画像を取得するAPIなどです。興味のあるAPIを探して、Requestsで実際にデータを取得してみてください。きっと、プログラミングの楽しさが倍増するはずです!

この記事が、あなたのPythonライフをより豊かにする一助となれば幸いです。Happy Coding!