PythonのHTTPクライアントなライブラリはいくつかあったが、どれがよさそうかを自分なりに決めたかった時のメモ。使い勝手は書いていない。
TL;DR (選び方)
調べた後で awasome-pythonを見ればよいと気が付いたので途中で投げた。
- HTTP1.1のリクエストを楽に送りたい、情報が豊富なのを選びたい→ requests
- HTTP2とか非同期IOとかほしい→ httpx
- libcurl好き、速度重視→ PycURL
- 依存嫌い、インターネットがなく外部ライブラリの利用が困難なのにHTTPクライアントを必要とする残念な環境な場合→ urllib
requestsはどこでもおススメに上がっているぐらい有名で、公式ドキュメントで言及されるほどなので、requestsが使えるとしばらくは困らないはず。
機能比較
最新バージョンで使えれば o、頑張れば出来る場合は△、できない場合は x にしている。
ドキュメントを斜め読みした程度で実際に使って試したわけではない。依存があったり、バージョンが古いと使えない場合もあるが、そこまでは面倒見切れない
| |urllib|requests|httpx|PycURL|
|---|---|---|---|---|---|
|multipart-form|△|o|o|?|
|非同期API|x|x|o|?|
|TLS v1.3|o|o|o|?|
。
urllib.request
概要
標準ライブラリ。内部では http.client を使っている。
古くはurllib, urllib2などがあったが、色々あって細分化してurllib.requestsに戻ってきた感じ。
インストール
不要
メモ
urllibは比較的泥臭く書く必要があったり、HTTP特有の機能が使えなかったりと、ほぼbytesでしか扱えないので、bytes/strの意識が必要。
multipartなファイル送信は頑張ればできる。過去に書いている。
独自の証明書を扱ったり通信に使うバージョンを選びたい場合、Pythonのsslのドキュメントを確認する。
TLS 1.3はOpenSSL1.1.1以降を導入していれば利用可能だが、SSLContextを使うようなら注意。
requests
概要
http.clientのドキュメントでもおすすめされるライブラリ。内部ではurllib3が使われている。
有名なライブラリ。HTTP1.xであればこれでよい。HTTP2とか非同期APIが欲しい場合は他を選ぶ必要がありそう。
他にもrequestsを拡張したライブラリがある。twistedを使いasync/await
をサポートする requests-threadsや、concurrent.futuresを使ったrequests-futuresなど。
httpx
概要
HTTP2サポートを謳うライブラリ。要Python 3以上。同期・非同期に対応。
2020年にv1.0を出したいらしいが、2020/10/26 時点ではv1.0に到達していない。
2021/04/07 追記: 「2021年にv1.0を出したい」に代わっている。活動はしているようだ。
requestsをインスパイアしているそうでrequestsっぽいAPIになっている。
- multipart-file-encoding: https://www.python-httpx.org/advanced/#multipart-file-encoding
PycURL
概要
libcurlのpython binding。libcurlに依存。requestsと比べて速いらしい
その他
見つけたがおススメできないそうにないもの。なぜダメかとか。
- hyper: http2サポートを謳っていたが、最近の活動があまりない。httpxに取って代わられた感がある。
- http.client(標準ライブラリ): urllib(標準ライブラリ)の内部で使われている。これを扱う人はここを見ないと思う。
- urllib/urllib2(標準ライブラリだった): 古の産物。urllib.request等に置き換わった。古いコードをメンテナンスする以外で利用する理由はない。
- urllib3: 標準っぽい名前だがサードパーティライブラリ。requestsでは物足りない場合に検討。
- urlgrabber: yumで使っていたものをライブラリ化したらしい。内部でPycURLを使っている。インタフェースはurllibと似ている。ミラーサイトを使った取得が行えるurlgrabber.mirrorなど歴史を感じる。今回はご縁が無かった。