当前位置: 首页 > 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;其提示词上限为…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

安卓基础(Java 和 Gradle 版本)

1. 设置项目的 JDK 版本 方法1&#xff1a;通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分&#xff0c;设置 Gradle JDK 方法2&#xff1a;通过 Settings File → Settings... (或 CtrlAltS)…...

使用SSE解决获取状态不一致问题

使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件&#xff0c;这个上传文件是整体功能的一部分&#xff0c;文件在上传的过程中…...

WEB3全栈开发——面试专业技能点P7前端与链上集成

一、Next.js技术栈 ✅ 概念介绍 Next.js 是一个基于 React 的 服务端渲染&#xff08;SSR&#xff09;与静态网站生成&#xff08;SSG&#xff09; 框架&#xff0c;由 Vercel 开发。它简化了构建生产级 React 应用的过程&#xff0c;并内置了很多特性&#xff1a; ✅ 文件系…...

DAY 26 函数专题1

函数定义与参数知识点回顾&#xff1a;1. 函数的定义2. 变量作用域&#xff1a;局部变量和全局变量3. 函数的参数类型&#xff1a;位置参数、默认参数、不定参数4. 传递参数的手段&#xff1a;关键词参数5 题目1&#xff1a;计算圆的面积 任务&#xff1a; 编写一…...