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

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表&#xff0c;若其中包含环&#xff0c;则输出环的入口节点。 若其中不包含环&#xff0c;则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...