「Pythonでcurlと同じことがしたい」
「Pythonでcurlコマンド並の速度を実現したい」
「Requestsより高速なWebアクセスを行いたい」
このような場合には、PycURLがオススメです。
この記事では、PycURLについて解説しています。
本記事の内容
- PycURLとは?
- PycURLのシステム要件
- PycURLのインストール
- PycURLの動作確認
それでは、上記に沿って解説していきます。
PycURLとは?
PycURL は、 libcurlへのPython インターフェースです。
ざっくり言うと、PycURLはcurlコマンドと同じモノと言えます。
curlは、libcurlを本体としたコマンドラインツールです。
それのPython版が、PycURLとなります。
つまり、curlと同じようなことがPycURLで実現できます。
また、Webアクセスと言えば、PythonライブラリではRequestsが存在しています。
Requestsと比較すると、PycURLには次の利点があります。
- 数倍速い(可能性がある)
- HTTP以外のプロトコルへの対応
- 多機能(暗号化、認証オプションの選択肢が多い)
しかし、PycURLはインストールがRequestsよりも複雑です。
その点では、PycURLは中級者以上を対象にしているかもしれません。
以上、PycURLについて説明しました。
次は、PycURLのシステム要件を確認します。
PycURLのシステム要件
現時点(2022年3月)でのPycURLの最新バージョンは、7.45.1となります。
この最新バージョンは、2022年3月13日にリリースされています。
PycURLのシステム要件は、以下。
- OS
- Python
- libcurl
- curl-config
それぞれを下記で説明します。
OS
サポートOSに関しては、以下となっています。
- Windows
- Linux
macOSは、対象外のようです。
Linuxで動くなら、macOSも問題なさそうですけどね。
また、今回はLinuxを対象にして検証を進めています。
WindowsとLinuxのインストールは、かなり異なります。
Python
サポート対象となるPythonのバージョンは、以下となっています。
- Python 3.5
- Python 3.6
- Python 3.7
- Python 3.8
- Python 3.9
- Python 3.10
以下は、Python公式開発サイクルです。
バージョン | リリース日 | サポート期限 |
3.6 | 2016年12月23日 | 2021年12月23日 |
3.7 | 2018年6月27日 | 2023年6月27日 |
3.8 | 2019年10月14日 | 2024年10月 |
3.9 | 2020年10月5日 | 2025年10月 |
3.10 | 2021年10月4日 | 2026年10月 |
Python公式開発サイクルと比較すると、PycURLは守備範囲が広いと言えます。
でも、我々としてはPython 3.7以降を利用しましょう。
libcurl
libcurlが必須となります。
libcurlが存在していないと、PycURLは動きません。
そして、システム要件として次のバージョンが指定されています。
libcurl 7.19.0 or better.
libcurlの有無は、次のコマンドで確認できます。
curlは、libcurlに依存しています。
curl -V
上記を実行して以下のように表示されれば、libcurlはインストール済みと言えます。
$ curl -V curl 7.68.0 (x86_64-pc-linux-gnu) libcurl/7.68.0 OpenSSL/1.1.1f zlib/1.2.11 brotli/1.0.9 libidn2/2.3.0 libpsl/0.21.0 (+libidn2/2.3.0) libssh/0.9.3/openssl/zlib nghttp2/1.41.0 librtmp/2.3 Release-Date: 2020-01-08 Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtmp rtsp scp sftp smb smbs smtp smtps telnet tftp Features: AsynchDNS brotli GSS-API HTTP2 HTTPS-proxy IDN IPv6 Kerberos Largefile libz NTLM NTLM_WB PSL SPNEGO SSL TLS-SRP UnixSockets
libcurl(curl)が未インストールなら、curlをインストールしましょう。
Ubuntuであれば、デフォルトでインストール済みのはずです。
あと、バージョンも指定されています。
バージョンに関しては、通常は意識する必要はありません。
curl-config
curl-configについては、次の記事で説明しています。
curl-configのインストールは、必須です。
PycURLはcurl-configを使って、libcurlが利用するSSLライブラリを特定しています。
以上、PycURLのシステム要件を説明しました。
次は、PycURLをインストールします。
PycURLのインストール
検証は、次のバージョンのPythonで行います。
$ python -V Python 3.10.2
まずは、現状のインストール済みパッケージを確認しておきます。
$ pip list Package Version ---------- ------- pip 22.0.4 setuptools 60.9.3 wheel 0.36.2
次にするべきことは、pipとsetuptoolsの更新です。
pipコマンドを使う場合、常に以下のコマンドを実行しておきましょう。
python -m pip install --upgrade pip setuptools
では、PycURLのインストールです。
PycURLのインストールは、以下のコマンドとなります。
pip install pycurl
PycURLのインストールは、少しだけ時間がかかります。
終了したら、どんなパッケージがインストールされたのかを確認します。
$ pip list Package Version ---------- ------- pip 22.0.4 pycurl 7.45.1 setuptools 60.9.3 wheel 0.36.2
PycURLには、依存するパッケージが存在していません。
この結果を見ると、PycURLの既存環境への導入は容易と言えます。
ただし、これはPythonライブラリの依存関係上の話になります。
PycURLはcurl-config関連で、エラーが発生しやすいようです。
その場合は、次のようなエラーメッセージとなります。
error: subprocess-exited-with-error
これだけではよくわからないので、エラー内容をよく見ます。
そうすると、以下のような文言を確認できます。
Could not run curl-config: [Errno 2] No such file or directory: 'curl-config'
これは、「curl-config」コマンドが利用できないというエラーです。
そのため、事前にcurl-configはインストールしておきます。
パスが通っていることも確認しておきましょう。
以上、PycURLのインストールについて説明しました。
次は、PycURLの動作確認を行います。
PycURLの動作確認
PycURLを使って、HTTPレスポンスステータスコードを取得してみましょう。
import pycurl from io import BytesIO TARGET_URL = "https://example.com/" buffer = BytesIO() c = pycurl.Curl() c.setopt(c.URL, TARGET_URL) c.setopt(c.WRITEDATA, buffer) c.perform() # HTTP response code print('Status: %d' % c.getinfo(c.RESPONSE_CODE)) # getinfo must be called before close. c.close()
上記コードを実行すると、次のような結果となります。
Status: 200
次のようにアクセス先を変更します。
TARGET_URL = "https://example.com/notfund"
変更して実行した結果は、以下。
Status: 404
問題ありませんね。
以上、PycURLの動作確認を説明しました。