如何使用Python cURL?
Curl是一个用作HTTP客户端的命令行实用程序。它以在命令行中进行HTTP请求而受欢迎。cURL可用于编写网页抓取脚本,检查网站的健康状况,并从命令行下载文件。
它非常简单,并且可以在许多编程语言中使用。本文介绍了cURL是什么以及如何在Python中使用它。
cURL是什么?
根据website,cURL代表“client URL”。它是一个用于使用不同的应用层网络协议(如HTTP、HTTPS、FTP和IMAP)传输数据的命令行工具和库。
它非常受欢迎,在广播、电视、routers、打印机和计算机等设备上安装了超过100亿次。cURL完全免费且开源。它的源代码可在GitHub上找到。
cURL用途
cURL非常有用且多功能。下面列出了cURL的最受欢迎的用途。虽然列表不是详尽无遗的,但以下仅是一些最受欢迎的用例:
- 测试API:它可以检查API是否正确运行,返回给定请求的正确数据。此外,还可以用它来检查API的速度,即它对请求的响应速度有多快。您可以编写一个脚本定期检查API的健康状况,并在出现问题时发送警报。
- 网页抓取:它还可以自动从网站上提取数据。cURL可以与许多编程语言和Bash命令一起使用。使用cURL,您可以动态地从网站获取数据。从响应HTML中,您可以解析和提取所需的数据。如果您对网页抓取感兴趣,可以查看使抓取数据更容易的Geekflare 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之前必须安装其他工具。在尝试使用pip安装PycURL之前,请使用以下命令:
sudo apt install libcurl4-openssl-dev libssl-dev
进行简单的GET请求
要发出请求,首先创建一个Python脚本来编写代码。用text editor.打开文件,我将使用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()
创建了缓冲区后,我们可以在客户端对象上设置选项。在这种情况下,我们想要设置两个选项;第一个是我们请求的 URL。第二个是我们要写入响应正文的位置。以下是代码:
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
# 创建一个 pycUrl 实例
c = Curl()
buffer = BytesIO()
c.setopt(c.URL, 'http://pycurl.io/')
c.setopt(c.WRITEDATA, buffer)
# 发起请求
c.perform()
# 关闭连接
c.close()
body = buffer.getvalue()
print(body.decode('iso-8859-1'))
执行脚本后,应该会得到以下输出:
发起 POST 请求
要发起 POST 请求,你需要设置 cURL 客户端对象的 POSTFIELDS
选项。例如,下面是一个向 JSON Placeholder API 发起 POST 请求的示例。
from io import BytesIO
from json import dumps
from pycurl import Curl
# 创建一个 pycUrl 实例
c = Curl()
buffer = BytesIO()
# 创建一个数据字典
data = {
'userId': 1,
'title': 'Lorem Ipsum',
'body': 'Dolor sit amet'
}
# 将数据编码为 JSON
encoded_data = dumps(data)
# 设置请求选项
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)
# 发起请求
c.perform()
# 关闭连接
c.close()
body = buffer.getvalue()
print(body.decode('iso-8859-1'))
在上面的代码中,我创建了一个带有作为请求一部分发送的数据的字典对象。接下来,我将数据编码为 JSON,并将其作为负载附加到请求中,方法是将 POSTFIELDS 选项设置为编码数据。我还指定了头部以指定请求内容类型和接受的响应数据类型。当你运行代码时,应该会得到这样的响应。
将响应写入文件
你也可以将文件缓冲传递给 cURL 的 WRITEDATA 选项。这将把响应数据写入文件。下面的示例说明了这个概念:
from pycurl import Curl
file_name = 'output.json'
# 以写模式打开文件
with open(file_name, 'wb') as f:
# 创建一个 Curl 实例
c = Curl()
# 设置请求选项
c.setopt(c.URL, 'https://jsonplaceholder.typicode.com/users/1')
c.setopt(c.HTTPHEADER, ['Accept: application/json'])
c.setopt(c.WRITEDATA, f)
# 发起请求
c.perform()
# 关闭连接
c.close()
print(f'将输出写入 {file_name}')
PycURL 的替代方案
PycURL只是在cURL库之上提供了一个薄薄的封装层。这使它非常可定制,因为您对更低级别的特性有更多的控制。
然而,它也更难使用,因此更适用于高级开发者。通常情况下,您可能需要一个比PycURL更简单的替代方案。在本节中,我们将讨论这些替代方案。
#1. 其他库
除了PycURL之外,Python还有其他可以用于发起请求的库。其中包括requests库和urllib库。它们都是流行且更简单的PycURL替代方案。
#2. 其他语言
cURL在其他语言中有实现的接口。一个常用的用于转换cURL网站的网站是Curl Converter。使用cURL转换器,您可以编写一个cURL命令来发起请求,并且它会自动将您的命令转换为任何选择的编程语言。您也可以直接在终端中调用cURL命令或编写一个Bash脚本。
最后的话
在本文中,我介绍了cURL并解释了如何使用PycURL模块在Python中使用它。我们还讨论了PycURL的替代方案,例如requests模块和完全使用不同语言编写程序。