注意: 本記事はドキュメント・公開情報をもとにした評価記事です。コード例はシミュレーションです。
3行要約
- HTTP通信における冗長なボイラープレートコードを排除し、人間が読みやすい直感的なAPIを提供する。
- Python標準のurllibとは比較にならないほど短いコードで、認証・JSON処理・セッション維持を完結できる。
- 外部APIとの連携を伴う全Python開発者は導入すべきだが、非同期処理(async)が必須な高負荷システムには向かない。
📦 この記事に関連する商品(楽天メインで価格確認)
Dell U2723QE広い作業画面で公式ドキュメントとコードを並べて開発効率を最大化できる
※アフィリエイトリンクを含みます
結論から: このツールは「買い」か
結論から言うと、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/requests | httpx | urllib3 |
|---|---|---|---|
| 主な用途 | 一般的な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)






