Curl は、HTTP クライアントとして使用されるコマンド ライン ユーティリティです。コマンドラインから HTTP リクエストを行う場合によく使われます。 cURL を使用すると、Web スクレイピング用のスクリプトを作成したり、サイトの健全性をチェックしたり、コマンド ラインからファイルをダウンロードしたりできます。
非常にシンプルで、多くのプログラミング言語で使用できます。この記事では、cURL とは何か、および Python 内での cURL の使用方法について説明します。

cURLとは何ですか?
Web サイト によると、cURL は「クライアント URL」の略です。これは、HTTP、HTTPS、FTP、IMAP などのさまざまなアプリケーション層ネットワーク プロトコルを使用してデータを転送するためのコマンド ライン ツールおよびライブラリです。
これは非常に人気があり、ラジオ、テレビ、ルーター、プリンター、コンピューターなどのデバイスにわたって 100 億を超えるインストールで使用されています。 cURL は完全に無料でオープンソースです。そのソース コードは GitHub で入手できます。

cURL の使用例
cURL は非常に便利で多用途です。 cURL の最も一般的な使用例を以下に示します。このリストはすべてを網羅しているわけではありませんが、以下は最も一般的なケースのほんの一部です。
- API のテスト : API が正しく機能するかどうかをチェックし、特定のリクエストに対して正しいデータを返すことができます。さらに、API の速度、つまりリクエストに対する応答の速さを確認するためにも使用できます。 API の健全性を定期的にチェックし、何か問題が発生した場合にアラートを送信するスクリプトを作成できます。
- Web スクレイピング : Web サイトからデータを自動的に抽出することもできます。 cURL は、多くのプログラミング言語と組み合わせて、また Bash コマンドとして使用できます。 cURL を使用すると、Web サイトからデータを動的に取得できます。応答 HTML から、必要なデータを解析して抽出できます。 Web スクレイピングに興味がある場合は、データのスクレイピングを簡単にする Web Scraping API をチェックしてみてください。
- データのダウンロード: cURL を使用すると、リクエストの応答をファイルに保存できます。これらの応答は、API リクエストからのデータまたはサーバーからのファイルである可能性があります。事実上、応答をファイルに書き込むことにより、ファイルがダウンロードされたことになります。 cURL はコマンドライン ツールであるため、このプロセスを自動化して、一度に大量のファイルをダウンロードできます。

Python で cURL を使用する方法 (PycURL)
PycURL のインストール
Python で cURL を使用するには、PycURL ライブラリを使用します。 PycURL は、cURL ライブラリへの Python インターフェイスです。すでに高速な cURL ライブラリ上に薄いラッパーを作成します。これにより、PycURL は、urllib や request などのリクエストを行う際に他のライブラリよりも高速になります。 PycURL を使用するには、まず PycURL をインストールする必要があります。詳細な手順はここにありますが、インストールする簡単な方法は pip を使用することです。
pip install PycURL
Ubuntu 22.04 では、PycURL をインストールする前に追加のツールをインストールする必要がありました。 pip を使用して PycURL をインストールする前に、次のコマンドを使用します。
sudo apt install libcurl4-openssl-dev libssl-dev
単純な GET リクエストの作成
リクエストを行うには、コードを記述する Python スクリプトを作成することから始めます。テキスト エディタでファイルを開きます。ここでは Vim を使用しますが、お好きなものを使用してください。 Vim でファイルを開くには、以下のコマンドを使用します。
vim pycurl.py
ここで、
pycurl.py
コードを記述するファイルの名前ですが、ファイルには任意の名前を付けることができます。
次に、PycURL モジュールから cURL クラスをインポートします。
from pycurl import Curl
PycURLをインポートした後、ioからBytesIOをインポートします。これは、PycURL の応答を書き込むバッファを作成するために必要になります。
from io import BytesIO
次に、新しい Curl インスタンスをインスタンス化します。
c = Curl()
次に、BytesIO をインスタンス化して新しいバッファを作成します。 PycURL には、応答を保存するためのストレージ メカニズムが組み込まれていません。したがって、バッファを作成し、データを書き込む場所を指示する必要があります。
buffer = BytesIO()
バッファを作成したら、クライアント オブジェクトにオプションを設定できます。この場合、2 つのオプションを設定します。 1 つ目はリクエストする URL です。 2 番目は、応答本文を書きたい場所です。これを行うコードは次のとおりです。
c.setopt(c.URL, 'http://pycurl.io/')
c.setopt(c.WRITEDATA, buffer)
これを行うと、クライアント オブジェクトの Perform メソッドを呼び出してリクエストを実行し、close メソッドを呼び出してリクエストを閉じることができます。
c.perform()
c.close()
応答を取得するには、バッファ オブジェクトの
getvalue()
メソッドを呼び出し、それをデコードします。その後、それをコンソールに出力できます。
body = buffer.getvalue()
print(body.decode('iso-8859-1'))
ファイルは次のようになります。
from pycurl import Curl
from io import BytesIO
# Create a pycUrl instance
c = Curl()
buffer = BytesIO()
c.setopt(c.URL, 'http://pycurl.io/')
c.setopt(c.WRITEDATA, buffer)
# Make the request
c.perform()
# Close the connection
c.close()
body = buffer.getvalue()
print(body.decode('iso-8859-1'))
スクリプトを実行すると、次の出力が得られるはずです。
POSTリクエストを行う
POST リクエストを行うには、cURL クライアント オブジェクトの
POSTFIELDS
オプションを設定する必要があります。たとえば、JSON プレースホルダー API に対して POST リクエストを行うリクエストを次に示します。
from io import BytesIO
from json import dumps
from pycurl import Curl
# Create a pycUrl instance
c = Curl()
buffer = BytesIO()
# Create a data dictionary
data = {
'userId': 1,
'title': 'Lorem Ipsum',
'body': 'Dolor sit amet'
}
# Encode the data to json
encoded_data = dumps(data)
# Set request options
c.setopt(c.URL, 'https://jsonplaceholder.typicode.com/posts')
c.setopt(c.HTTPHEADER, ['Accept: application/json', 'Content-Type: application/json'])
c.setopt(c.POSTFIELDS, encoded_data)
c.setopt(c.WRITEDATA, buffer)
# Make the request
c.perform()
# Close the connection
c.close()
body = buffer.getvalue()
print(body.decode('iso-8859-1'))
上記のコードでは、リクエストの一部として送信するデータを含む辞書オブジェクトを作成しました。次に、データを JSON にエンコードし、エンコードされたデータに POSTFIELDS オプションを設定して、ペイロードとしてリクエストに添付して送信しました。また、ヘッダーを指定して、リクエストのコンテンツ タイプと受け入れられる応答のデータ タイプを指定しました。コードを実行すると、次のような応答が得られるはずです。

ファイルへの応答の書き込み
ファイル バッファを cURL WRITEDATA オプションに渡すこともできます。これにより、応答データがファイルに書き込まれます。次の例はその概念を示しています。
from pycurl import Curl
file_name = 'output.json'
# Opening the file in write mode
with open(file_name, 'wb') as f:
# Creating a Curl instance
c = Curl()
# Set request options
c.setopt(c.URL, 'https://jsonplaceholder.typicode.com/users/1')
c.setopt(c.HTTPHEADER, ['Accept: application/json'])
c.setopt(c.WRITEDATA, f)
# Make the request
c.perform()
# Close the connection
c.close()
print(f'Wrote output to {file_name}')
PycURL の代替案
PycURL は cURL ライブラリ上に薄い層のみを提供します。これにより、下位レベルの機能をより詳細に制御できるため、高度なカスタマイズが可能になります。
ただし、使用が難しくなるため、より上級の開発者を対象としています。多くの場合、PycURL のより簡単な代替手段が必要になることがあります。このセクションでは、代替案について説明します。
#1. その他の図書館
PycURL 以外にも、Python にはリクエストの作成に使用できるライブラリがあります。これらには、request ライブラリと urllib ライブラリが含まれます。どちらも pycURL に代わる、広告を掲載しやすい人気のあるものです。
#2. 他の言語
cURL には、他の言語で実装されたインターフェイスがあります。 cURL Web サイトを変換するための人気のある Web サイトは Curl Converter です。 cURL コンバーターを使用すると、実行したいリクエストに対して cURL コマンドを作成すると、そのコマンドが選択したプログラミング言語に自動的に変換されます。ターミナルで cURL コマンドを直接呼び出すことも、Bash スクリプトを作成することもできます。
最後の言葉
この記事では、cURL を紹介し、PycURL モジュールを使用して Python で cURL を使用する方法を説明しました。また、リクエスト モジュールやプログラムに異なる言語を一緒に使用するなど、PycURL の代替案についても説明しました。
次に、cURL コマンドの使用法をリアルタイムの例で確認します。