使用 Python 的 cURL 指南

评论: 0

网络抓取包括从网站中提取数据用于分析、研究或自动化。在本 cURL Python 教程中,您将通过实际示例学习如何使用 PycURL 执行网络请求。我们还将展示如何将一个典型的 curl 请求转换为 Python 请求,并与 Requests、HTTPX 和 AIOHTTP 等库进行比较。

如何在 Python 中使用 cURL 命令

理解这一概念对 Python 集成至关重要,因此让我们从基础知识开始。您可以直接在终端中使用 Python cURL 命令来执行 GET 和 POST 请求等任务。

cURL 命令示例

# 获取请求
curl -X GET "https://httpbin.org/get"

# 发表请求
curl -X POST "https://httpbin.org/post"

1.png

2.png

安装所需程序库

要使用 cURL,请安装 Python PycURL 库。

安装:

pip install pycurl

使用 PycURL 进行 HTTP 请求

在 Python 中使用 curl 可以详细控制 HTTP 请求。下面的示例演示了如何使用 PycURL 发送 GET 请求:

import pycurl
import certifi
from io import BytesIO

# 创建一个字节对象以保存响应数据
buffer = BytesIO()

# 初始化卷曲对象
c = pycurl.Curl()

# 设置HTTP获取请求的URL
c.setopt(c.URL, 'https://httpbin.org/get')

# 设置缓冲区以捕获输出数据
c.setopt(c.WRITEDATA, buffer)

# 为SSL/TLS验证设置通往CA捆绑文件的路径
c.setopt(c.CAINFO, certifi.where())

# 执行HTTP请求
c.perform()

# 关闭卷曲对象以释放资源
c.close()

#从缓冲区检索响应的内容
body = buffer.getvalue()

# 解码并打印响应主体
print(body.decode('iso-8859-1'))

处理 POST 请求

用 POST 发送数据--即用 curl 发送 Python 请求--很常见。使用 PycURL 库时,请使用 POSTFIELDS 选项。下面是一个用 PycURL 发送 POST 请求的例子:

import pycurl
import certifi
from io import BytesIO

# 创建一个字节对象以保存响应数据
buffer = BytesIO()

# 初始化卷曲对象
c = pycurl.Curl()

# 设置HTTP POST请求的URL
c.setopt(c.URL, 'https://httpbin.org/post')

# 设置要发布的数据
post_data = 'param1="pycurl"¶m2=article'
c.setopt(c.POSTFIELDS, post_data)

# 设置缓冲区以捕获输出数据
c.setopt(c.WRITEDATA, buffer)

# 为SSL/TLS验证设置通往CA捆绑文件的路径
c.setopt(c.CAINFO, certifi.where())

# 执行HTTP请求
c.perform()

# 关闭卷曲对象以释放资源
c.close()

# 从缓冲区检索响应的内容
body = buffer.getvalue()

# 解码并打印响应主体
print(body.decode('iso-8859-1'))

处理自定义 HTTP 标头

HTTP 请求通常需要自定义标头或身份验证。处理自定义标头:HTTP 请求通常需要认证令牌或自定义头信息。如果知道如何使用 Python curl json 解析技术,就能高效地处理自定义头信息:

import pycurl
import certifi
from io import BytesIO

# 创建一个字节对象以保存响应数据
buffer = BytesIO()

# 初始化卷曲对象
c = pycurl.Curl()

# 设置HTTP获取请求的URL
c.setopt(c.URL, 'https://httpbin.org/get')

# 设置自定义HTTP标头
c.setopt(c.HTTPHEADER, ['User-Agent: MyApp', 'Accept: application/json'])

# 设置缓冲区以捕获输出数据
c.setopt(c.WRITEDATA, buffer)

# 为SSL/TLS验证设置通往CA捆绑文件的路径
c.setopt(c.CAINFO, certifi.where())

# 执行HTTP请求
c.perform()

# 关闭卷曲对象以释放资源
c.close()

# 从缓冲区检索响应的内容
body = buffer.getvalue()

# 解码并打印响应主体
print(body.decode('iso-8859-1'))

处理 XML 响应

处理 XML 响应 在使用 XML 解析和处理各种 API 时,处理 XML 响应是必不可少的。下面是一个用 PycURL 处理 XML 响应的例子:

# 导入必要的库
import pycurl  # 提出HTTP请求的库
import certifi  # SSL证书验证库
from io import BytesIO  # 处理字节流的库
import xml.etree.ElementTree as ET  # 解析XML的库

# 创建一个缓冲区以保存响应数据
buffer = BytesIO()

# 初始化卷曲对象
c = pycurl.Curl()

# 设置HTTP获取请求的URL
c.setopt(c.URL, 'https://www.google.com/sitemap.xml')

# 设置缓冲区以捕获输出数据
c.setopt(c.WRITEDATA, buffer)

# 为SSL/TLS验证设置通往CA捆绑文件的路径
c.setopt(c.CAINFO, certifi.where())

# 执行HTTP请求
c.perform()

# 关闭卷曲对象以释放资源
c.close()

# 从缓冲区检索响应的内容
body = buffer.getvalue()

# 将XML内容解析为ElementTree对象
root = ET.fromstring(body.decode('utf-8'))

# 打印XML树根元素的标签和属性
print(root.tag, root.attrib)

处理 HTTP 错误

处理 HTTP 请求的错误是使用外部集成的一个重要方面。下面是一个使用 PyCURL 处理错误的示例:

import pycurl  # 导入pycurl库
import certifi  # 导入证书库
from io import BytesIO  # 导入字节来处理字节流

# 初始化卷曲对象
c = pycurl.Curl()

buffer = BytesIO()
# 设置HTTP请求的URL
c.setopt(c.URL, 'http://example.com')
c.setopt(c.WRITEDATA, buffer)
c.setopt(c.CAINFO, certifi.where())

try:
    # 执行HTTP请求
    c.perform()
except pycurl.error as e:
    # 如果在请求期间发生错误,请捕获Pycurl.Error异常
    errno, errstr = e.args  # 检索错误号和错误消息
    print(f'Error: {errstr} (errno {errno})')  # 打印错误消息和错误号码
finally:
    # 关闭卷曲对象以释放资源
    c.close()
    body = buffer.getvalue()
    print(body.decode('iso-8859-1'))  # 解码并打印响应主体

更正后的代码将 URL 调整为 https://example.com,解决了协议问题。之后,作者重复了与第一个代码片段相同的配置请求、执行请求和处理错误的步骤。执行成功后,再次解码并打印响应体。这就强调了在使用 PycURL 进行 HTTP 请求时,正确构造 URL、保持适当的请求流,尤其是执行强大的错误处理的重要性。

3.png

import pycurl  # 导入pycurl库
import certifi  # 导入证书库
from io import BytesIO  #导入字节来处理字节流

# 重新引导卷曲对象
c = pycurl.Curl()

buffer = BytesIO()
# 更正使用HTTPS的URL
c.setopt(c.URL, 'https://example.com')
c.setopt(c.WRITEDATA, buffer)
c.setopt(c.CAINFO, certifi.where())

try:
    # 执行更正后的HTTP请求
    c.perform()
except pycurl.error as e:
    # 如果在请求期间发生错误,请捕获Pycurl.Error异常
    errno, errstr = e.args  # 检索错误号和错误消息
    print(f'Error: {errstr} (errno {errno})')  # 打印错误消息和错误号码
finally:
    # 关闭卷曲对象以释放资源
    c.close()
    body = buffer.getvalue()
    print(body.decode('iso-8859-1'))  # 解码并打印响应主体

高级 cURL 功能

在使用 cURL 请求转换 Python 时,cURL 提供了许多高级选项来控制 HTTP 行为,例如处理 cookie 和超时,这一点很有用。下面的示例演示了在 Python 中运行 curl 命令的高级选项。

import pycurl  #导入pycurl库
import certifi  # 导入用于SSL证书验证的认证库
from io import BytesIO  # 导入字节来处理字节流

# 创建一个缓冲区以保存响应数据
buffer = BytesIO()

# 初始化卷曲对象
c = pycurl.Curl()

# 设置HTTP请求的URL
c.setopt(c.URL, 'http://httpbin.org/cookies')

# 通过设置特定的键值对启用cookie
c.setopt(c.COOKIE, 'cookies_key=cookie_value')

# 为请求设置30秒的超时
c.setopt(c.TIMEOUT, 30)

# 设置缓冲区以捕获输出数据
c.setopt(c.WRITEDATA, buffer)

# 为SSL/TLS验证设置通往CA捆绑文件的路径
c.setopt(c.CAINFO, certifi.where())

# 执行HTTP请求
c.perform()

# 关闭卷曲对象以释放资源
c.close()

# 从缓冲区检索响应的内容
body = buffer.getvalue()

# 使用UTF-8编码来解码响应主体并打印
print(body.decode('utf-8'))

PycURL、Requests、HTTPX 和 AIOHTTP 的比较

在使用 Python 处理 HTTP 请求时,有四个库非常流行:PyCurl、Requests、HTTPX 和 AIOHTTP。它们各有优缺点。下面是一个比较,可帮助您根据需要选择合适的工具:

特点 PycURL 要求 HTTPX AIOHTTP
易于使用 中度 非常简单 简单 中度
性能 中度
异步支持 没有 没有
流媒体 有限公司
协议支持 广泛(支持多种协议) HTTP/HTTPS HTTP/HTTPS、HTTP/2、WebSockets HTTP/HTTPS, WebSockets

高级用户会喜欢 HTTP 命令提供的自定义控件;他们会发现 PycURL 的性能超出预期。另一方面,Requests 和 HTTPX 更适合更简单、更直观的应用场景。AIOHTTP 在处理异步任务方面表现突出,为管理异步请求提供了有效的工具。

正如您所看到的,您的选择可以根据项目的范围而改变--灵活性与速度。在高级情况下,PycURL 即使不是唯一的选择,也是首选。

结论

如果在进行 HTTP 请求时,性能和底层控制是你优先考虑的因素,那么 PycURL 是一个可靠的选择。学习如何在 Python 中使用 cURL 可能不是最适合初学者的途径,但它能释放更抽象的库通常隐藏的强大功能。从 web scraping 和 XML 处理到管理自定义标头和 Cookie,PycURL 都能精确处理。不过,对于更简单的任务、异步工作流或易用性,Requests、HTTPX 和 AIOHTTP 等库可能更合适。

评论:

0 评论