zh
English
Español
Tiếng Việt
Deutsch
Українська
Português
Français
भारतीय
Türkçe
한국인
Italiano
Gaeilge
اردو
Indonesia
Polski 网络抓取包括从网站中提取数据用于分析、研究或自动化。在本 cURL Python 教程中,您将通过实际示例学习如何使用 PycURL 执行网络请求。我们还将展示如何将一个典型的 curl 请求转换为 Python 请求,并与 Requests、HTTPX 和 AIOHTTP 等库进行比较。
理解这一概念对 Python 集成至关重要,因此让我们从基础知识开始。您可以直接在终端中使用 Python cURL 命令来执行 GET 和 POST 请求等任务。
cURL 命令示例
# 获取请求
curl -X GET "https://httpbin.org/get"
# 发表请求
curl -X POST "https://httpbin.org/post"
要使用 cURL,请安装 Python PycURL 库。
安装:
pip install pycurl
在 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 发送数据--即用 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 请求通常需要认证令牌或自定义头信息。如果知道如何使用 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 解析和处理各种 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 请求的错误是使用外部集成的一个重要方面。下面是一个使用 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、保持适当的请求流,尤其是执行强大的错误处理的重要性。
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 请求转换 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'))
在使用 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