注意: 本記事はドキュメント・公開情報をもとにした評価記事です。コード例はシミュレーションです。

3行要約

  • HTTP通信における冗長なボイラープレートコードを排除し、人間が読みやすい直感的なAPIを提供する。
  • Python標準のurllibとは比較にならないほど短いコードで、認証・JSON処理・セッション維持を完結できる。
  • 外部APIとの連携を伴う全Python開発者は導入すべきだが、非同期処理(async)が必須な高負荷システムには向かない。

📦 この記事に関連する商品(楽天メインで価格確認)

Dell U2723QE

広い作業画面で公式ドキュメントとコードを並べて開発効率を最大化できる

楽天で価格を見る Amazonでも確認

※アフィリエイトリンクを含みます

結論から: このツールは「買い」か

結論から言うと、PythonでHTTP通信を行うなら「requestsを使わない理由がない」と言えるほど、信頼性と生産性が高いライブラリです。 私がSIer時代からフリーランスのAIエンジニアになった今まで、数百のプロジェクトを見てきましたが、HTTP通信の9割以上はrequestsで構成されています。 「買い」かと言われれば、オープンソースなので無料ですが、学習コストと実装時間を考慮すれば、標準ライブラリを自作するよりも圧倒的に「安い」投資になります。

特にAPIを多用する現在の開発環境において、requestsが提供する「Sessionオブジェクトによるコネクションプーリング」や「自動的なJSONデコード」は、実装ミスを減らすための生命線です。 ただし、最近のFastAPIなどの非同期フレームワークと組み合わせる場合は、同期ライブラリであるrequestsがボトルネックになる可能性があります。 その1点を除けば、Pythonエンジニアの武器庫に入れておくべき必須のツールです。

このツールが解決する問題

requestsが登場する以前、PythonでHTTPリクエストを投げるには標準ライブラリの urllib.request を使うのが一般的でした。 しかし、urllibは低レイヤーに近い設計だったため、単純なGETリクエストを送るだけでも数行のコードが必要になり、POSTでJSONを送るとなるとエンコード処理でコードが埋め尽くされました。 さらに、Basic認証やプロキシ設定、Cookieの維持などは、専門的な知識がないと実装が困難で、コードの可読性を著しく低下させていました。

requestsは、これらの「機械向けの処理」を「人間向けのAPI」へと抽象化しました。 例えば、Cookieを保持したまま複数のリクエストを送る際、urllibではCookieJarを手動で管理する必要がありますが、requestsでは Session オブジェクトを作るだけで内部的に処理されます。 AI開発の現場でも、LLMのAPIやベクターデータベースと通信する際、独自のSDKが提供されていない場合はrequestsを使って自作するのが最も安定します。 開発者が「通信の仕組み」に頭を悩ませるのではなく、「通信で何を得るか」に集中できる環境を作ってくれるのが、このツールの最大の功績です。

実際の使い方

インストール

pip install requests

インストールは数秒で終わります。 依存関係も urllib3 や certifi など最小限に抑えられており、環境を汚す心配もほとんどありません。 プロダクション環境では、意図しないバージョンアップによる破壊的変更を防ぐため、requests==2.31.0 のようにバージョンを固定するのが私の鉄則です。

基本的な使用例

import requests

# GETリクエストの送信
# 標準ライブラリと違い、paramsを渡すだけでクエリパラメータを自動生成
params = {"q": "python requests", "page": 1}
response = requests.get("https://api.example.com/search", params=params)

# ステータスコードの確認。200以外なら例外を投げる便利なメソッド
response.raise_for_status()

# JSONのパース(これだけで辞書型として扱える)
data = response.json()
print(data["results"][0]["title"])

このコードの美しさは、response.json() というメソッド1つで、Content-Typeの確認からデコードまで完結している点にあります。 urllibなら、レスポンスを読み込んでから json.loads(response.read().decode('utf-8')) と書く必要がありましたが、requestsなら1行です。

応用: 実務で使うなら

実務、特にAIエージェントの開発などでAPIを連続して叩く場合は、Session オブジェクトと Timeout 設定が不可欠です。

import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

def create_api_session():
    session = requests.Session()

    # リトライ戦略の設定(500系エラーやタイムアウト時に自動再試行)
    retries = Retry(total=3, backoff_factor=1, status_forcelist=[500, 502, 503, 504])
    session.mount("https://", HTTPAdapter(max_retries=retries))

    # 共通のヘッダー(APIキーなど)をセット
    session.headers.update({"Authorization": "Bearer YOUR_TOKEN"})

    return session

session = create_api_session()

try:
    # タイムアウト設定は必須。指定しないと無限に待機してシステムが死ぬ
    response = session.post(
        "https://api.openai.com/v1/chat/completions",
        json={"model": "gpt-4", "messages": [{"role": "user", "content": "Hi"}]},
        timeout=(3.0, 30.0)  # (接続タイムアウト, 読み取りタイムアウト)
    )
    result = response.json()
except requests.exceptions.Timeout:
    print("APIの応答が遅すぎます。後で再試行してください。")
except requests.exceptions.RequestException as e:
    print(f"予期せぬエラーが発生しました: {e}")

この「リトライ」「タイムアウト」「セッション共通化」の3点セットを組み込むだけで、API連携の堅牢性は劇的に向上します。 特にAI案件ではAPIのレスポンスが不安定なことが多いため、backoff_factor(失敗するたびに待機時間を伸ばす設定)は必須と言えるでしょう。

強みと弱み

強み:

  • API設計が極めて直感的で、ドキュメントを読み込まずともコードが書ける。
  • Sessionオブジェクトによるコネクションプーリングが強力。100回連続でリクエストを送る場合、新規接続を繰り返すより約2倍速くなるケースもある。
  • エラーハンドリング(raise_for_status)やJSON処理など、実務で「やりたいこと」がメソッドとして用意されている。
  • 世界で最も使われているライブラリの一つであり、Stack OverflowやGitHubでの解決策が豊富。

弱み:

  • 同期ライブラリであるため、asyncio を用いた非同期処理の中で使うと、スレッドをブロックしてしまう。
  • urllib3 をラップしているため、極限のパフォーマンス(マイクロ秒単位の最適化)が必要な場合は、直接 urllib3 や httpx を触る必要がある。
  • 標準ライブラリではないため、外部ライブラリの持ち込みが禁止されている一部のレガシーなエンタープライズ環境では使えない。

代替ツールとの比較

項目psf/requestshttpxurllib3
主な用途一般的なAPI連携・スクレイピング非同期(async)通信低レイヤーのHTTP制御
APIの使いやすさ最高(直感的)高(requests互換)中(やや冗長)
非同期対応なしあり(標準対応)なし
実行速度高速高速最速(オーバーヘッド最小)
信頼性圧倒的(デファクト)急上昇中非常に高い

結論としての使い分け:

  • 通常のスクリプトやバッチ処理なら requests。
  • FastAPI環境や、大量のAPIを並列で叩く必要があるなら httpx。
  • 他のライブラリの開発者で、最小限の依存関係でHTTPを扱いたいなら urllib3。

料金・必要スペック・導入前の注意点

requestsはMIT Licenseで提供されており、個人・商用問わず完全に無料で利用可能です。 ハードウェアスペックへの要求はほぼゼロに等しく、Raspberry Piのような非力な環境でも問題なく動作します。 ただし、並列リクエストを大量に送る場合は、OS側のファイル記述子(ファイルディスクリプタ)の制限に引っかかる可能性があるため、OS側のチューニング(ulimit -n の変更など)が必要になる場合があります。

導入前の注意点として、timeout 引数を省略しないことを強く推奨します。 requestsのデフォルトではタイムアウトが設定されておらず、相手サーバーが反応を返さない場合に、プログラムが永遠に停止してしまうリスクがあります。 27インチ4Kモニター(Dell U2723QEなど)を使っているなら、左半分に公式ドキュメント、右半分にVS Codeを開いて作業することをお勧めします。 特に複雑な認証(OAuth2など)を扱う際は、ドキュメントの「Advanced Usage」のセクションを熟読する必要があります。

私の評価

私の評価は ★5.0(満点)です。 Pythonエンジニアとして、このライブラリに助けられなかった日はありません。 AI開発において、自作のプロンプトエンジニアリングツールを作る際も、まずはrequestsでプロトタイプを作成します。 そのコードの可読性の高さは、チーム開発においてコードレビューのコストを大幅に下げてくれます。

もちろん「非同期非対応」という弱点はありますが、それはrequestsの役割ではありません。 「シンプルでエレガント」というコンセプトを10年以上守り続けている点は驚異的です。 特定のGPU(RTX 4090など)をぶん回すような重いAI処理の合間に、軽量かつ確実にデータを取得してくるその姿は、まさに縁の下の力持ち。 もしあなたがPython初学者なら、標準ライブラリを学ぶ前にrequestsを触るべきです。その方がHTTP通信の本質を早く理解できます。

よくある質問

Q1: requestsは非同期(async/await)で使えますか?

いいえ、requestsは同期ライブラリです。非同期環境で使いたい場合は httpx を使うか、aiohttp を検討してください。どうしてもrequestsを使いたい場合は、run_in_executor などでスレッドを分ける必要があります。

Q2: 認証情報を安全に扱うにはどうすればいいですか?

APIキーなどは直接コードに書かず、環境変数(.env ファイル)から読み込むのが定石です。requestsでは、auth 引数に (user, pass) のタプルを渡すだけでBasic認証ができるほか、カスタムヘッダーにトークンを仕込むのも容易です。

Q3: requestsを導入するとバイナリサイズが大きくなりますか?

いいえ、requests自体は非常に軽量なライブラリです。依存関係を含めても数メガバイト程度ですので、AWS Lambdaなどのサーバーレス環境にデプロイする際も、パッケージサイズを圧迫することはありません。


1. X投稿用ツイート本文 (TWEET_TEXT) 2. アフィリエイト商品情報 (AFFILIATE_CONTEXT)

3. SNS拡散用ハッシュタグ (HASHTAGS) 4. SEOタグ (SEO_TAGS) 5. URLスラッグ (SLUG)