与Python一起使用卷发的指南

评论: 0

Web刮擦涉及从网站上提取数据,以进行数据分析,研究和自动化等任务。尽管Python提供了用于发送HTTPS请求和执行刮擦的库,但通过Pycurl使用curl可以更有效。在本教程中,我们将演示如何使用Python卷曲来刮擦网页。我们将提供示例并将其性能与其他流行的库(例如请求,HTTPX和AIOHTTP)进行比较。

卷发和python入门

在研究Python集成之前,必须了解卷曲基础知识。您可以直接在终端中使用curl命令来执行诸如进行获取和发布请求之类的任务。

示例卷曲命令:

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

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

1.png

2.png

安装所需的库

要在Python中使用Curl,我们需要Pycurl库,该库为Curl库提供了Python接口。

安装pycurl:

pip install pycurl

用pycurl提出HTTP请求

Pycurl在Python中提供了对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请求发送数据很常见。使用Pycurl,使用Postfields选项。这是与Pycurl提出发布请求的示例:

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请求通常需要自定义标题或身份验证。以下是用pycurl设置自定义标头的示例:

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响应

使用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'))  # 解码并打印响应主体

3.png

校正后的代码将URL调整为https://example.com,解决协议问题。它重复了配置请求,执行并处理错误的过程,就像初始摘要中一样。成功执行后,响应主体再次被解码和打印。这些片段突出显示了使用Pycurl在HTTP请求...

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提供了许多高级选项来控制HTTP请求行为,例如处理cookie和超时。以下是一个用pycurl演示高级选项的示例。

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,请求,HTTPX和AIOHTTP的比较

在Python中使用HTTP请求时,四个受欢迎的库是Pycurl,请求,HTTPX和AIOHTTP。每个都有其优点和劣势。以下是一个比较,可帮助您为需要选择合适的工具:

特征 PycURL Requests HTTPX AIOHTTP
易用性 缓和 很容易 简单的 缓和
表现 高的 缓和 高的 高的
异步支持 是的 是的
是的 有限的 是的 是的
协议支持 广泛(支持许多协议) HTTP/HTTPS HTTP/HTTPS, HTTP/2, WebSockets HTTP/HTTPS, WebSockets

比较分析表明,Pycurl提供了高性能和灵活性,使其适用于需要详细管理HTTP请求的高级用户。另一方面,请求和HTTPX更适合更简单,更直观的方案。 AIOHTTP在处理异步任务方面脱颖而出,提供了管理异步请求的有效工具。

比较分析表明,Pycurl提供了高性能和灵活性,使其适用于需要详细管理HTTP请求的高级用户。另一方面,请求和HTTPX更适合更简单,更直观的方案。 AIOHTTP在处理异步任务方面脱颖而出,提供了管理异步请求的有效工具。

评论:

0 评论