Python Curl 示例

2025 年 1 月 11 日 | 阅读 9 分钟

在本教程中,我们将介绍一些 PycURL 编码示例,展示连接点的各种功能。

如演示部分所述,PyCURL 支持多种协议,并具有许多高级功能。但是,在我们的示例中,我们将使用 HTTP 函数来测试所有 REST API,使用 HTTP 最常用的方法:DELETE、PUT、GET 和 POST,以及其他几个示例。我们将用 Python 3 编写声明它们的语法,并解释它们的作用。

那么,我们开始吧!

示例 1:发送 HTTP GET 请求

PyCURL 的一个基本功能是使用其 URL 从给定服务器检索数据。这称为 GET 请求,因为会使用服务器的资源。

可以通过导入 BytesIO 模块并创建其对象来执行基本的 GET 请求。创建 CURL 对象以通过 URL 传输数据和文件。

使用 setopt() 函数设置目标 URL,该函数用于 setopt(option, value)。option 参数指定要设置的选项,例如 URL、WRITEDATA 等,value 参数指定为该特定选项提供的值。

从设置的 URL 检索到的数据随后作为字节写入 BytesIO 对象。然后使用 getvalue() 函数从 BytesIO 对象读取字节,并将其解码以在控制台中打印 HTML。

以下是如何执行此操作的示例

源代码

输出

Output of GET request:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<meta name="robots" content="index,nofollow">

<title>BeginnersGuide - Python Wiki</title>
<script type="text/javascript" src="/wiki/common/js/common.js"></script>

<script type="text/javascript">
<!--
var search_hint = "Search";
//-->
</script>


<link rel="stylesheet" type="text/css" charset="utf-8" media="all" href="/wiki/europython/css/common.css">
<link rel="stylesheet" type="text/css" charset="utf-8" media="screen" href="/wiki/europython/css/screen.css">
<link rel="stylesheet" type="text/css" charset="utf-8" media="print" href="/wiki/europython/css/print.css">
<link rel="stylesheet" type="text/css" charset="utf-8" media="projection" href="/wiki/europython/css/projection.css">

<!-- css only for MS IE6/IE7 browsers -->
<!--[if lt IE 8]>
   <link rel="stylesheet" type="text/css" charset="utf-8" media="all" href="/wiki/europython/css/msie.css">
<![endif]-->


<link rel="alternate" title="Python Wiki: BeginnersGuide" href="/moin/BeginnersGuide?diffs=1&show_att=1&action=rss_rc&unique=0&page=BeginnersGuide&ddiffs=1" type="application/rss+xml">


<link rel="Start" href="/moin/FrontPage">
<link rel="Alternate" title="Wiki Markup" href="/moin/BeginnersGuide?action=raw">
<link rel="Alternate" media="print" title="Print View" href="/moin/BeginnersGuide?action=print">
<link rel="Search" href="/moin/FindPage">
<link rel="Index" href="/moin/TitleIndex">
<link rel="Glossary" href="/moin/WordIndex">
<link rel="Help" href="/moin/HelpOnFormatting">
</head>

<body  lang="en" dir="ltr">
…
…
</body>
</html>

示例 2:检查 GET 响应的标头

您还可以使用 PyCURL 检索网站的响应标头。可以根据各种因素分析响应标头,例如,以确定响应发送了什么编码,以及该编码是否与服务器提供的编码一致。

在我们的示例中,我们将分析响应标头以找出不同的标头名称及其对应的值。

要分析响应标头,我们首先需要提取它们,我们使用 HEADERFUNCTION 选项进行此操作,并使用我们自定义的函数(在本例中为 display_header())显示它们。

我们提供我们希望查看其响应标头的网站的 URL;HEADERFUNCTION 将响应标头发送到 display_header() 函数,在该函数中进行适当的格式化。响应标头由预定义的标准解码,并分成它们对应的名称和值。名称和值之间的空格将被去除,然后全部转换为小写。

然后将响应标头写入 BytesIO 对象,传输给请求者,最后以适当的格式显示。

源代码

输出

****Using PycURLs to get Twitter Headers_****
Header values:-
{'cache-control': 'no-caches, no-stores, must-revalidate, pre-check=0, post-check = 0', 'content-length': '303055', 'content-type': 'text/html;charset=utf-8', 'date': 'Wed, 23 Oct 2015 13:54:11 GMT', 'expires': 'wed, 30 Mar 1986 06:00:00 GMT', 'last--modified': 'Wed, 25 Oct 2019 15:55:11 GMT', 'pragma': 'no-cache', 'servers': 'tsa_a', 'set-cookie': 'ct0=ec07cd52736f70d5f481369c1d76hh2d56; Max-Age=21600; Expires=Wed, 23 Oct 2019 19:54:11 GMT; Path=/; Domain=.twitter.com; Secure', 'status': '100 OK', 'strict-transport-security': 'max-ages=63113778519', 'x-connection-hash': 'ae7a9e8961269hjf00e5bde67a209e515f', 'x-content-type-options': 'nosniff', 'x-frame-option': - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
'DENY', 'x-response-time': '46', 'x-transaction': '00fc9fknk a008dc512', 'x-twitters-response-tags': 'BouncerCompliants', 'xs-ua-compatible': 'IE=edges, chrome=1', 'x-xsss-protection': '1'}
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 

在有多个具有相同名称的标头的情况下,将只存储最后一个标头值。要存储多值标头中的所有值,我们可以使用以下代码段

语法格式

示例 3:通过 HTTP POST 发送表单数据

POST 请求是将数据嵌入 HTTP 请求正文中发送到 Web 服务器的请求。当您上传文件或提交表单时,您实际上是将 POST 请求发送到指定服务器。

通过首先使用 setopt 函数设置 URL 来发送表单数据,可以使用 PyCURL 执行 POST 请求。提交的数据首先存储为字典(以键值对形式),然后使用 urllib.parse 模块中的 urlencode 函数进行 URL 编码。

我们在发送表单数据时使用 POSTFIELDS 选项,因为它会自动将 HTTP 请求方法设置为 POST 并处理我们的 pf_ 数据。

语法格式

注意:如果您希望指定另一种请求方法,您可以使用 CUSTOMREQUEST 选项来实现。在 crl_.CUSTOMREQUEST 后面的空引号中写入您选择的请求方法名称。

示例 4:使用 POST Multipart 上传文件

有多种方法可以使用 PyCURL 模拟 HTML 表单中的文件上传过程

如果要通过 POST 请求发送的数据在您的系统上的一个文件中,您首先需要设置要发送数据的 URL。然后,您将您的请求方法指定为 HTTPPOST,并使用文件上传选项上传所需文件中的内容。

源代码仅供参考(运行代码后,您将在您的系统中找到文件已更新)

注意:如果您想更改文件名或内容类型,可以通过对上述代码进行微小修改来实现

对于内存中的文件数据,POST 请求执行中的唯一变化是将 FORM_BUFFER 和 FORM_BUFFERPTR 用于 FORM_FILE,因为这些直接从内存中获取要发布的数据。

示例 5:使用 HTTP PUT 上传文件

PUT 请求与 POST 请求相似,除了可以通过在请求正文中上传文件。当您知道要创建或覆盖的对象的确切 URL 时,您将使用 PUT 请求。基本上,PUT 会用其他内容替换目标 URL 上当前存在的任何内容。

如果目标要上传的数据位于一个实际文件中,您首先需要设置目标 URL,然后上传并打开文件。然后,使用 READDATA 从文件中读取数据。在 cURL 对象使用该文件期间,该文件必须保持打开状态。

最后,使用 carryout 函数执行文件传输(上传),并完成 cURL 会话。最后,关闭最初为 CURL 对象打开的文件。

源代码仅供参考(运行代码后,您将在您的系统中找到文件已更新)

BytesIO 对象使用预定义的标准对数据进行编码。这是因为 READDATA 需要一个类似 IO 的对象,而编码后的数据对于 Python 3 是必不可少的。如果文件数据位于缓冲区中,PyCURL 的实现与上传实际文件中的数据相同,只是有微小的变化。该编码数据存储在缓冲区中,然后读取该缓冲区。数据传输完成,传输完成后,cURL 会话结束。

源代码仅供参考(运行代码后,您将在您的系统中找到文件已更新)

示例 6:发送 HTTP DELETE 请求

另一个重要且常用的 HTTP 方法是 DELETE。DELETE 方法要求服务器删除由目标 URL 标识的资源。可以使用 CUSTOMREQUEST 函数执行此操作,如以下代码示例所示

源代码仅供参考(运行代码后,您将在您的系统中找到文件已更新)

示例 7:写入文件

PyCURL 也可用于将响应保存到文件中。我们使用 open 函数打开文件,响应将作为文件对象返回。open 函数的结构是:open(file, mode)。file 参数表示要打开的文件路径和名称,mode 参数表示您要打开文件的模式。在我们的示例中,必须以二进制模式(例如 'wb')打开文件,以避免编码和解释响应。

源代码仅供参考(运行代码后,您将在您的系统中找到文件已更新)

结论

在本教程中,我们了解了 Python 的 PyCURL 接口。正如您所见,PyCURL 在如何抓取网络信息以及处理其他任务(如身份验证或 SSL 连接)方面为您提供了极大的灵活性。这是一个强大的工具,可以很好地与您的 Python 程序配合使用,尤其是在使用 PyCURL 时。PyCURL 与 Requests 和 Python 中其他流行的 HTTP 客户端相比,是一个更底层的包。它不像 requests 那么易于使用,但如果您需要并发连接,它的速度会快得多。

如果您想扩展您的网络抓取技能,可以尝试 ScrapingBee。其 API 使您可以抓取网站和搜索引擎结果。它可以为您处理各种无头实例并渲染 JavaScript,因此您可以抓取任何网站。

我们首先讨论了 PyCURL 的一些通用功能及其与 Python 中的 libcURL 库的重要性。然后我们了解了 PyCURL 在不同操作系统上的安装过程。

最后,我们通过了一些 PyCURL 的通用示例,这些示例演示了 PyCURL 提供的各种功能,例如 HTTP GET、POST、PUT 和 DELETE 方法。遵循本教程后,您应该能够获取由...