Web刮擦涉及从网站上提取数据,以进行数据分析,研究和自动化等任务。尽管Python提供了用于发送HTTPS请求和执行刮擦的库,但通过Pycurl使用curl可以更有效。在本教程中,我们将演示如何使用Python卷曲来刮擦网页。我们将提供示例并将其性能与其他流行的库(例如请求,HTTPX和AIOHTTP)进行比较。
在研究Python集成之前,必须了解卷曲基础知识。您可以直接在终端中使用curl命令来执行诸如进行获取和发布请求之类的任务。
示例卷曲命令:
# 获取请求
curl -X GET "https://httpbin.org/get"
# 发表请求
curl -X POST "https://httpbin.org/post"
要在Python中使用Curl,我们需要Pycurl库,该库为Curl库提供了Python接口。
安装pycurl:
pip install pycurl
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请求通常需要自定义标题或身份验证。以下是用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'))
使用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请求...。
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'))
在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在处理异步任务方面脱颖而出,提供了管理异步请求的有效工具。
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.com!
评论: 0