
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 スクレイピングに興味がある場合は、データのスクレイピングを容易にする etechjp.com Web Scraping API を確認してください。
- データのダウンロード: cURL を使用すると、要求の応答をファイルに保存できます。 これらの応答は、API 要求からのデータまたはサーバーからのファイルである可能性があります。 事実上、応答をファイルに書き込むことで、ファイルをダウンロードしたことになります。 cURL はコマンドライン ツールであるため、このプロセスを自動化して一度に多数のファイルをダウンロードできます。
Python で cURL を使用する方法 (PycURL)
PycURL のインストール
Python で cURL を使用するには、PycURL ライブラリを使用します。 PycURL は、cURL ライブラリへの Python インターフェイスです。 既に高速な cURL ライブラリに薄いラッパーを作成します。 これにより、PycURL は、urllib や requests などのリクエストを行うための他のライブラリよりも高速になります。 PycURL を使用するには、まずインストールする必要があります。 詳細な手順はこちらにありますが、インストールする簡単な方法は pip を使用することです。
pip install PycURL
Ubuntu 22.04 では、PycURL をインストールする前に追加のツールをインストールする必要がありました。 PycURL を pip でインストールする前に、次のコマンドを使用します。
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 にはリクエストの作成に使用できる他のライブラリがあります。 これらには、リクエスト ライブラリと urllib ライブラリが含まれます。 どちらも、pycURL に代わる人気のある簡単な代替手段です。
#2。 他の言語
cURL には、他の言語で実装されたインターフェースがあります。 cURL Web サイトを変換するための一般的な Web サイトは、Curl Converter です。 cURL コンバーターを使用して、作成したい要求に対して cURL コマンドを作成すると、コマンドが選択したプログラミング言語に自動的に変換されます。 端末で cURL コマンドを直接呼び出すか、Bash スクリプトを記述することもできます。
結論
この記事では、cURL を紹介し、PycURL モジュールを使用して Python で使用する方法を説明しました。 また、PycURL に代わるものについても説明しました。たとえば、要求モジュールや、プログラムでさまざまな言語を使用することなどです。
次に、cURL コマンドの使用法をリアルタイムの例で確認してください。