当前位置: 首页 > news >正文

python爬虫番外篇 | Reuqests库高级用法(1)

文章目录

    • 1.会话对象(Session Objects)
    • 2.请求和响应对象(Request and Response Objects)
    • 3.准备好的请求(Prepared Requests)
    • 4.SSL证书验证
    • 5.客户端证书
    • 6.CA 证书
    • 7.正文内容工作流程(Body Content Workflow)
    • 8.keep-alive
    • 9.流式上传(Streaming Uploads)
    • 10.块编码的请求(Chunk-Encoded Requests)
    • 11.POST 多个多部分编码文件(POST Multiple Multipart-Encoded Files)

今天来介绍了一些 Requests 更高级的功能。

1.会话对象(Session Objects)

Session 对象允许您在 请求。它还会在从 会话实例,并将使用的连接池。所以如果您正在向同一主机(底层 TCP)发出多个请求连接将被重用,这可以带来显著的性能增加。urllib3Session 对象具有主 Requests API 的所有方法。让我们在请求之间保留一些 cookie:

s = requests.Session()s.get('https://httpbin.org/cookies/set/sessioncookie/123456789')
r = s.get('https://httpbin.org/cookies')print(r.text)'{"cookies": {"sessioncookie": "123456789"}}'

会话还可用于向请求方法提供默认数据。这是通过向 Session 对象上的属性提供数据来完成的:

s = requests.Session()
s.auth = ('user', 'pass')
s.headers.update({'x-test': 'true'})
#both 'x-test' and 'x-test2' are sent
s.get('https://httpbin.org/headers', headers={'x-test2': 'true'})

传递给请求方法的任何字典都将与 设置的会话级别值。方法级参数覆盖会话参数。
但请注意,方法级参数不会在请求,即使使用会话。此示例将仅发送 Cookie 使用第一个请求,但不使用第二个请求:

s = requests.Session()r = s.get('https://httpbin.org/cookies', cookies={'from-my': 'browser'})
print(r.text)
# '{"cookies": {"from-my": "browser"}}'r = s.get('https://httpbin.org/cookies')
print(r.text)
# '{"cookies": {}}'

如果要手动将 Cookie 添加到会话中,请使用 Cookie 实用程序函数来操作 。

会话也可以用作上下文管理器:

with requests.Session() as s:s.get('https://httpbin.org/cookies/set/sessioncookie/123456789')

这将确保会话在块一关闭就关闭已退出,即使发生了未处理的异常。with

从 dict 参数中删除值
有时,我们会希望从 dict 参数中省略会话级键。自 执行此操作时,只需在方法级别中将该键的值设置为参数。它将被自动省略。None

2.请求和响应对象(Request and Response Objects)

每当给朋友打电话时,我们都在做两个重大事项。首先,你正在构造一个对象,这个对象将是发送到服务器以请求或查询某些资源。其次,一旦 Requests 从服务器获得响应,就会生成一个对象。 该对象包含服务器返回的所有信息,以及还包含最初创建的对象。这是一个简单的请求从维基百科的服务器获取一些非常重要的信息:requests.get() Request Response Response Request

r = requests.get('https://en.wikipedia.org/wiki/Monty_Python')

如果我们想访问服务器发回给我们的标头,我们这样做:

r.headers{'content-length': '56170', 'x-content-type-options': 'nosniff', 'x-cache':
'HIT from cp1006.eqiad.wmnet, MISS from cp1010.eqiad.wmnet', 'content-encoding':
'gzip', 'age': '3080', 'content-language': 'en', 'vary': 'Accept-Encoding,Cookie',
'server': 'Apache', 'last-modified': 'Wed, 13 Jun 2012 01:33:50 GMT',
'connection': 'close', 'cache-control': 'private, s-maxage=0, max-age=0,
must-revalidate', 'date': 'Thu, 14 Jun 2012 12:59:39 GMT', 'content-type':
'text/html; charset=UTF-8', 'x-cache-lookup': 'HIT from cp1006.eqiad.wmnet:3128,
MISS from cp1010.eqiad.wmnet:80'}

但是,如果我们想获取我们发送给服务器的标头,我们只需访问 request,然后是请求的标头:

r.request.headers{'Accept-Encoding': 'identity, deflate, compress, gzip',
'Accept': '*/*', 'User-Agent': 'python-requests/1.2.0'}

3.准备好的请求(Prepared Requests)

每当我们收到一个对象时 从 API 调用或 Session 调用中,该属性实际上是所使用的属性。在某些情况下,可能希望做一些额外的事情在发送请求。简单的方法如下:request Prepared Request

from requests import Request, Sessions = Session()req = Request('POST', url, data=data, headers=headers)
prepped = req.prepare()# do something with prepped.body
prepped.body = 'No, I want exactly this as the body.'# do something with prepped.headers
del prepped.headers['Content-Type']resp = s.send(prepped,stream=stream,verify=verify,proxies=proxies,cert=cert,timeout=timeout
)
print(resp.status_code)

由于没有对对象执行任何特殊操作,因此立即准备并修改对象。然后将和其他参数一起发送。RequestPreparedRequestrequests.Session.


但是,上述代码将失去具有Requests 对象的一些优点。具体而言,-level 状态(如 cookie)将 不会应用于的请求。要获得该状态应用时,将 to 的调用替换为 的调用,如下所示:

from requests import Request, Sessions = Session()
req = Request('GET',  url, data=data, headers=headers)prepped = s.prepare_request(req)
# do something with prepped.body
prepped.body = 'Seriously, send exactly these bytes.'# do something with prepped.headers
prepped.headers['Keep-Dead'] = 'parrot'resp = s.send(prepped,stream=stream,verify=verify,proxies=proxies,cert=cert,timeout=timeout
)
print(resp.status_code)

当使用准备好的请求流时,请记住,它不会考虑环境。 如果使用环境变量来更改请求的行为,这可能会导致问题。 例如:中指定的自签名SSL证书将不予考虑。 结果被抛出。 可以通过将环境设置显式合并到会话中来绕过此行为:REQUESTS_CA_BUNDLESSL: CERTIFICATE_VERIFY_FAILED

from requests import Request, Sessions = Session()
req = Request('GET', url)prepped = s.prepare_request(req)
# Merge environment settings into session
settings = s.merge_environment_settings(prepped.url, {}, None, None, None)
resp = s.send(prepped, **settings)
print(resp.status_code)

4.SSL证书验证

Requests 验证 HTTPS 请求的 SSL 证书,就像 Web 浏览器一样。 默认情况下,SSL 验证处于启用状态,如果出现以下情况,Requests 将抛出 SSLError 无法验证证书:

requests.get('https://requestb.in')
requests.exceptions.SSLError: hostname 'requestb.in' doesn't match either of '*.herokuapp.com', 'herokuapp.com'

我没有在此域上设置SSL,因此会引发异常。非常好。不过,GitHub 会这样做:

requests.get('https://github.com')
<Response [200]>

可以将路径传递到具有受信任 CA 证书的 CA_BUNDLE 文件或目录:verify

requests.get('https://github.com', verify='/path/to/certfile')

或持久性:

s = requests.Session()
s.verify = '/path/to/certfile'

注意
如果设置为目录的路径,则必须已使用以下方法处理该目录 随 OpenSSL 提供的实用程序。verifyc_rehash

也可以通过环境变量指定此受信任 CA 列表。 如果未设置,将用作回退。REQUESTS_CA_BUNDLEREQUESTS_CA_BUNDLECURL_CA_BUNDLE

如果设置为 False,则请求也可以忽略验证 SSL 证书:verify

requests.get('https://kennethreitz.org', verify=False)
<Response [200]>

请注意,当设置为 时,请求将接受任何 TLS 服务器提供的证书,并将忽略主机名不匹配 和/或过期的证书,这将导致应用程序容易受到攻击 中间人 (MitM) 攻击。将 verify 设置为可能有用在本地开发或测试期间。verifyFalseFalse

默认情况下,设置为 True。该选项仅适用于主机证书。verifyverify

5.客户端证书

可以指定一个本地证书作为单个证书用作客户端证书文件(包含私钥和证书)或两者的元组文件的路径:

requests.get('https://kennethreitz.org', cert=('/path/client.cert', '/path/client.key'))
<Response [200]>

或持久性:

s = requests.Session()
s.cert = '/path/client.cert'

如果指定了错误的路径或无效的证书,则会收到 SSLError:

requests.get('https://kennethreitz.org', cert='/wrong_path/client.pem')
SSLError: [Errno 336265225] _ssl.c:347: error:140B0009:SSL routines:SSL_CTX_use_PrivateKey_file:PEM lib

警告
本地证书的私钥必须是未加密的。 目前,Requests 不支持使用加密密钥。

6.CA 证书

Requests 使用包 certifi 中的证书。这允许用户在不更改请求版本的情况下更新其受信任的证书。

在版本 2.16 之前,Requests 捆绑了一组它信任的根 CA, 来源于Mozilla信托商店。证书仅更新了每个请求版本一次。当未安装时,这导致了使用明显较旧的证书捆绑包时,证书捆绑包非常过时请求的版本。certifi

为了安全起见,我们建议经常升级 certifi!

7.正文内容工作流程(Body Content Workflow)

默认情况下,当发出请求时,将下载响应的正文马上。可以覆盖此行为并延迟下载响应 body,直到使用参数访问该属性:stream

tarball_url = 'https://github.com/psf/requests/tarball/main'
r = requests.get(tarball_url, stream=True)

此时,仅下载了响应标头和连接保持打开状态,因此允许我们将内容检索设置为有条件的:

if int(r.headers['content-length']) < TOO_LONG:content = r.content

可以使用和方法进一步控制工作流。 或者,可以从底层读取未解码的正文 urllib3 。
如果在发出请求时设置为,则“请求”不能 将连接释放回池,除非消耗了所有数据或调用 。这可能导致连接效率低下。如果发现自己部分阅读请求 使用时正文(或根本不阅读它们),应该在语句中发出请求,以确保它始终处于关闭状态:streamTruestream=Truewith

with requests.get('https://httpbin.org/get', stream=True) as r:# Do things with the response here.

8.keep-alive

好消息 — 多亏了 urllib3,在一个会话中 keep-alive 是 100% 自动的! 在会话中提出的任何请求都将自动重用适当的 连接!

请注意,只有在所有正文全部发生时,连接才会释放回池以供重复使用数据已被读取;请确保设置或读取对象的属性。streamFalsecontentResponse

9.流式上传(Streaming Uploads)

Requests 支持流式上传,允许发送大型流或文件,而不将它们读入内存。要流式传输和上传,只需提供一个 你身体的类似文件的物体:

with open('massive-body', 'rb') as f:requests.post('http://some.url/streamed', data=f)

警告
强烈建议以二进制文件打开文件模式。这是因为请求可能会尝试提供的标头,以及它是否执行此值 将设置为文件中的字节数。可能会出现错误如果以文本模式打开文件。Content-Length

10.块编码的请求(Chunk-Encoded Requests)

Requests 还支持对传出和传入请求进行分块传输编码。要发送块编码的请求,只需提供一个生成器(或任何没有的迭代器一个长度)对于你的身体:

def gen():yield 'hi'yield 'there'requests.post('http://some.url/chunked', data=gen())

对于分块编码响应,最好使用 循环访问数据。在将在请求中设置的理想情况,其中在这种情况下,您可以通过使用参数进行调用来逐块迭代。如果要设置块的最大大小, 可以将参数设置为任何整数。stream=Trueiter_contentchunk_sizeNonechunk_size

11.POST 多个多部分编码文件(POST Multiple Multipart-Encoded Files)

可以在一个请求中发送多个文件。例如,假设想要将图像文件上传到具有多个文件字段“images”的 HTML 表单:

<input type="file" name="images" multiple="true" required="true"/>

为此,只需将文件设置为以下元组的列表:(form_field_name, file_info)

url = 'https://httpbin.org/post'
multiple_files = [('images', ('foo.png', open('foo.png', 'rb'), 'image/png')),('images', ('bar.png', open('bar.png', 'rb'), 'image/png'))]
r = requests.post(url, files=multiple_files)
r.text
{...'files': {'images': 'data:image/png;base64,iVBORw ....'}'Content-Type': 'multipart/form-data; boundary=3131623adb2043caaeb5538cc7aa0b3a',...
}

警告
强烈建议以二进制文件打开文件 模式。这是因为请求可能会尝试提供的标头,以及它是否执行此值将设置为文件中的字节数。可能会出现错误 如果以文本模式打开文件。Content-Length

相关文章:

python爬虫番外篇 | Reuqests库高级用法(1)

文章目录 1.会话对象&#xff08;Session Objects&#xff09;2.请求和响应对象&#xff08;Request and Response Objects&#xff09;3.准备好的请求&#xff08;Prepared Requests&#xff09;4.SSL证书验证5.客户端证书6.CA 证书7.正文内容工作流程&#xff08;Body Conten…...

【链表OJ】常见面试题 3

文章目录 1.[环形链表II](https://leetcode.cn/problems/linked-list-cycle-ii/description/)1.1 题目要求1.2 快慢指针1.3 哈希法 2.[随机链表的复制](https://leetcode.cn/problems/copy-list-with-random-pointer/description/)2.1 题目要求2.2 迭代法 1.环形链表II 1.1 题目…...

Linux学习笔记9(Linux包管理)

目录 归档包管理 归档 查看归档包 解归档包 压缩包管理 Zip/unzip gzip/gunzip bzip2/bunzip2 源码包安装软件 三大步&#xff1a; 预备步骤&#xff1a;安装依赖的编译库 一、./configure --prefix/usr/local/nginx 二、make 三、make install 软件包安装 配置…...

论文阅读《Geometric deep learning of RNA structure》

引入了机器学习方法&#xff0c;通过少量的数据学习。只使用原子坐标作为输入。 预测RNA三维结构比预测蛋白质结构更困难。 设计了一个原子旋转等变评分器ARES&#xff0c;由每个原子的三维坐标和化学元素类型&#xff08;输入&#xff09;指定&#xff0c;ARES预测模型与未知真…...

宏集方案 | 传统建筑智能化改造,迈向物联新时代

前言 智能建筑涉及多个系统的集成&#xff0c;如照明、空调、安防等&#xff0c;这些系统的兼容性和协调运作是一大挑战。然而&#xff0c;传统的工业建筑和商业楼宇受早期设计的局限&#xff0c;多个控制系统间互不兼容&#xff0c;并且难以重新部署通信线缆。 针对传统建筑…...

如果服务器更改Web端口会减少被攻击的风险吗?

通过更改服务器的Web端口&#xff0c;是否能够显著降低被攻击的风险?首先&#xff0c;理解Web服务默认使用的端口是关键。HTTP协议通常使用80端口&#xff0c;而HTTPS则默认使用443端口。这些端口因其广泛认知而成为黑客攻击的首要目标。理论上&#xff0c;将Web服务迁移到非标…...

vim列编辑模式

在编辑文本时&#xff0c;经常会有这样的需求&#xff0c;对特定列进行进行批量编辑。比如批量注释一段代码&#xff0c;或者删除待定字符&#xff08;如一列空格&#xff09;。幸运的是VIM支持列编辑模式。 假设文本内容&#xff1a; Maximum length of a custom vocabulary…...

如何实现pxe安装部署

此实验环境&#xff1a;rhel7主机 一、kickstart自动化安装脚本 1、安装可视化图形 [rootlocalhost ~]# yum group install "Server with GUI" 2、关闭vmware dhcp功能&#xff08;编辑-虚拟网络编辑器&#xff09; 3、httpd 1、安装httpd服务 [rootlocalhost …...

机器学习常见模型

1、线性模型 线性模型是机器学习最基本的算法类型&#xff0c;它试图学到一个通过多个特征&#xff08;属性&#xff09;计算的线性组合来预测的函数&#xff0c;简单的线性回归形式如yaxb&#xff0c;其中&#xff0c;x代表特征&#xff0c;而y代表结果&#xff0c;一旦a和b的…...

【python案例】基于Python 爬虫的房地产数据可视化分析设计与实现

引言 研究背景与意义 房地产行业在我国属于支柱性产业&#xff0c;在我国社会经济发展中一直扮演着重要角色。房价问题&#xff0c;尤其是大中城市的房价问题&#xff0c;一直是政府、大众和众多研究人员关注的热点。如何科学地预测房价是房价问题的研究方向之一。随着互联网…...

如何在Python中诊断和解决内存溢出问题

python的内存溢出即程序在申请内存后未能正确释放&#xff0c;导致随着时间推移占用的内存越来越多&#xff0c;以下是一些可能导致内存溢出的原因&#xff1a; 1、循环引用&#xff1a;当对象之间形成循环引用&#xff0c;并且这些对象定义了__del__方法时&#xff0c;Python…...

什么是爬虫软件?这两个爬虫神器你必须要试试

爬虫软件概述 爬虫&#xff0c;又称为网络爬虫或网页爬虫&#xff0c;是一种自动浏览互联网的程序&#xff0c;它按照一定的算法顺序访问网页&#xff0c;并从中提取有用信息。爬虫软件通常由以下几部分组成&#xff1a; 用户代理&#xff08;User-Agent&#xff09;&#xf…...

记录|MVS和VM软件使用记录

目录 前言一、常用属性二、触发模式选择三、操作注意点四、录像、抓拍功能五、VM软件六、VM软件界面介绍七、VM软件运行间隔八、VM软件图像源九、VM软件相机管理十、获取图像十一、方案存储十一、相机拍摄彩图转换颜色转换快速匹配特征模板&#xff1a;运行参数 十二、位置修正…...

算法通关:014_1:用栈实现队列

文章目录 题目总结代码运行结果 题目 用栈实现队列 leetcode :232 总结 时间复杂度 平均下来每个方式是O(1) 代码 class MyQueue {public Stack<Integer> in;public Stack<Integer> out;//初始化public MyQueue() {in new Stack<>();out new Stack<…...

【C#】Random

在 C# 中&#xff0c;Random 类的实例通常用于生成随机数。在方法内部或外部创建 Random 实例主要影响的是实例的生命周期和性能。 在方法外部创建 Random 实例 生命周期&#xff1a;如果在类的成员变量中创建 Random 实例&#xff0c;那么这个实例的生命周期将与类的实例相同…...

MongoDB简介及其在Java中的应用

什么是MongoDB&#xff1f; MongoDB是一个基于分布式文件存储的数据库&#xff0c;由C语言编写。它旨在为Web应用提供可扩展的高性能数据存储解决方案。MongoDB结合了关系数据库和非关系数据库&#xff08;NoSQL&#xff09;的特点&#xff0c;是功能最丰富、最像关系数据库的…...

JSON-LD上下文将属性映射到RDF IRIs示例

为了更清晰地说明JSON-LD上下文是如何将属性映射到RDF IRIs&#xff0c;我们可以基于提供的上下文规范&#xff0c;举一个完整的JSON-LD数据实例&#xff0c;并展示它是如何转换为RDF三元组的。 示例上下文 {"context": {"foaf": "http://xmlns.com…...

Spring的监听机制详解

Spring的监听机制详解 讲在前面 对Spring框架&#xff0c;大家都已不陌生&#xff0c;它给我们提供了很多功能&#xff0c;包括IoC、AOP、事务管理等。其中&#xff0c;Spring的事件监听机制是一项非常重要的功能&#xff0c;它允许开发人员定义和处理自定义事件&#xff0c;并…...

Cache结构

Cache cache的一般设计 超标量处理器每周期需要从Cache中同时读取多条指令&#xff0c;同时每周期也可能有多条load/store指令会访问Cache&#xff0c;因此需要多端口的Cache L1 Cache&#xff1a;最靠近处理器&#xff0c;是流水线的一部分&#xff0c;包含两个物理存在 指…...

国产版Sora复现——智谱AI开源CogVideoX-2b 本地部署复现实践教程

目录 一、CogVideoX简介二、CogVideoX部署实践流程2.1、创建丹摩实例2.2、配置环境和依赖2.3、上传模型与配置文件2.4、开始运行 最后 一、CogVideoX简介 智谱AI在8月6日宣布了一个令人兴奋的消息&#xff1a;他们将开源视频生成模型CogVideoX。目前&#xff0c;其提示词上限为…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...