Python之Requests库使用总结

概述
Requests是python中一个很Pythonic的HTTP库,用于构建HTTP请求与解析响应

Requests开发哲学

Beautiful is better than ugly.(美丽优于丑陋)
Explicit is better than implicit.(直白优于含蓄)
Simple is better than complex.(简单优于复杂)
Complex is better than complicated.(复杂优于繁琐)
Readability counts.(可读性很重要)
安装
直接安装

pip install requests

简单上手

导入模块

import requests

发送请求

#get
r = requests.get('http://httpbin.org/get')#post
r = requests.post('http://httpbin.org/post', data = {'key':'value'})

通过requests.get或post方法实际发出一个http请求,返回一个response对象,http://httpbin.org是一个可以测试http请求的网站

处理响应

r.text  #返回响应内容主体,Requests 会自动解码来自服务器的内容r.content  #返回二进制的响应内容主体r.json() #处理json的响应内容,返回解码后的dict

构造请求

Requests中requests.get或post这些方法实际都是通过requests.request(method, url, **kwargs)实现的,主要返回response对象,下面主要介绍这个方法的参数

method -- Request对象的请求方法.
url -- 请求的URL.
params -- (可选) 请求的URL查询字符串中要发送的字典或字节.
data -- (可选) 字典或者元组列表[(key, value)] (form-encoded), 字节, 或者文件对象包含在请求主体中发生,主要是post put使用.
json -- (可选) 包含请求主体中的json数据.
headers -- (可选) HTTP首部(请求/通用/实体首部),字典形式.
cookies -- (可选) Dict 或者 CookieJar对象包含在首部cookie字段发送.
files -- (可选) “名称”:类文件对象(或{“名称:file-tuple}”)的字典,用于分段编码上传。 file-tuple可以是2元组(“ filename”,fileobj),3元组(“ filename”,fileobj,“ content_type”)或4元组(“ filename”,fileobj,“ content_type”,custom_headers), 其中,“ content-type”是一个字符串,用于定义给定文件的内容类型,而custom_headers是一个类似dict的对象,其中包含要为该文件添加的其他标题。
auth -- (可选)  用于Basic/Digest/Custom HTTP 认证,元组类型.
timeout (float or tuple) -- (可选)超时时间,在放弃请求之前,等待服务器发送数据的秒数,以浮点数或(连接超时,读取超时)元组为单位.
allow_redirects (bool) -- (可选)布尔值。 启用/禁用GET / OPTIONS / POST / PUT / PATCH / DELETE / HEAD重定向。 默认为True。
proxies -- (可选)字典,代理设置
verify -- (可选)布尔值(在这种情况下,它控制我们是否验证服务器的TLS证书)或字符串(在这种情况下,它必须是要使用的CA捆绑包的路径)。 默认为True。
stream -- (可选) 如果为False,则将立即下载响应内容。
cert -- (可选) 如果为String,则为ssl客户端证书文件(.pem)的路径。 如果是元组,则(“证书”,“密钥”)配对。

GET请求 

requests.get(url, params=None, **kwargs)等价于requests.request('get', url, params=None,**kwargs),**kwargs即上面支持的可选参数

payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.get("http://httpbin.org/get", params=payload)#即向http://httpbin.org/get?key2=value2&key1=value1请求

POST请求
requests.post(url, data=None, json=None, **kwargs)等价于requests.request('post', url, data=None, json=None, **kwargs),**kwargs即上面支持的可选参数

POST提交请求,数据一般是放在HTTP报文主体中,数据编码主要有以下三种方式并在请求首部Content-Type 中指定

application/x-www-form-urlencoded :最常见post提交数据的方式,以form表单形式提交数据。
application/json :以json串提交数据。
multipart/form-data :一般使用来上传文件。

#application/x-www-form-urlencoded,一般form提交payload = {'key1': 'value1', 'key2': 'value2'}r = requests.post("http://httpbin.org/post", data=payload)#application/json,如果使用 json 参数直接传递dict,就会被自动编码等同于json.dumps(payload)。如果使用data参数传递json.dumps(payload),与json参数不同在于前者有Content-Type,后者无payload = {'key1': 'value1', 'key2': 'value2'}r = requests.post("http://httpbin.org/post", json=payload)#multipart/form-data 传文件url = 'http://httpbin.org/post'files = {'file': open('report.xls', 'rb')}r = requests.post(url, files=files)

定制请求头

如果想为请求添加 HTTP 头部,只要简单地传递一个 dict 给 headers 参数就可以了

headers = {'user-agent': 'my-app/0.0.1'}r = requests.get('http://httpbin.org/get', headers=headers)

注意的是如果headers中包含Cookie会覆盖使用cookies参数时传入的dict

传入Cookie

直接将字典类型的cookies传入到cookies参数即可

cookies = dict(cookies_are='working')r = requests.get('http://httpbin.org/get',cookies=cookies)

处理响应

requests方法返回一个response对象

响应内容主体

r = requests.get('http://httpbin.org/get')r.text  #返回响应内容主体,Requests 会自动解码来自服务器的内容r.content  #返回二进制的响应内容主体r.json() #处理json的响应内容,返回解码后的dict

注意:有的中文网站使用r.text时,返回的内容为乱码,实际是自动解码错误了,解决办法主要有

#先返回二进制内容,再根据实际的编码解码r.content.decode("utf-8")#不知道具体编码形式时,可以使用下面方法自动解码r.encoding = r.apparent_encodingr.text

获取响应头部

1.响应头部信息

r.headers

2.获取此响应的原始请求的头部

r.request.headers

响应状态

1.返回状态码

r.status_code

2.响应是400或500类就抛出HTTPError异常

r.raise_for_status()

3返回状态原因

r.reason

 响应内容编码

r.encoding     #从HTTP报文header中猜测的响应内容的编码方式r.apparent_encoding  #从内容中分析响应内容的编码方式(备选编码方式,一般从html<meta>标签中属性charset获取)

需要注意的是

r.encoding:如果header中不存在charset,则认为编码是ISO-8859-1
r.text根据r.encoding显示网页内容
r.apparent_encoding:根据网页内容分析处的编码方式可以看做是r.encoding的备选
其它方法与属性
response对象其它的方法与属性参考,具体可以查看官网地址http://cn.python-requests.org/zh_CN/latest/api.html#requests.Response

apparent_encoding:由html chardet属性表示的编码
close():关闭连接,一般不用
content:二进制内容主体
cookies:返回CookieJar对象
elapsed:从发送请求到响应到达之间经过的时间
encoding:决定.text的编码,从头部获取
headers:响应的头部信息,以字典形式
history:是一个 Response 对象的列表,为了完成请求而创建了这些对象。这个对象列表按照从最老到最近的请求进行排序。主要用在重定向中
is_permanent_redirect:如果此响应是重定向的永久版本之一,则为True。
is_redirect:如果此响应是自动处理后格式正确的HTTP重定向,则为true
links:返回响应的已解析头链接(如果有)。
ok:如果status_code小于400,则返回True。
request:这个响应的原始request对象
url:响应的最终URL
会话对象
有时候可能需要多个请求才能完成任务的情况,比如模拟登录后的请求操作,如果单独用requests去请求的话,就需要将最初的请求响应的cookie或header保存下来并且在后面的请求中都加入,这样比较麻烦。

所以requests提供了个Session对象,用来让你能够跨请求保持某些参数,它也会在同一个 Session 实例发出的所有请求之间保持 cookie,并且向同一主机发送多个请求,底层的 TCP 连接将会被重用,从而带来显著的性能提升。

1.跨请求保持一些 cookie

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

2.属性的合并

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

注意的是,只有对象属性才能合并,方法层的参数覆盖则会覆盖

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

3.前后文管理器

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

这样就能确保with区块退出后会话能被关闭,即使发生了异常也一样

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/216592.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

回顾【数学基础】找出断层,继续前进, 使用chatGPT学习并解决实际问题:微积分

已经学过的算术、代数、几何。跳过。 从微积分开始 想象一下&#xff0c;你在画一条曲线&#xff0c;或者在一个大草地上奔跑。微积分就是一种数学工具&#xff0c;帮助我们了解这条曲线的形状&#xff0c;或者你奔跑的方式。 微分&#xff08;就像研究曲线上的每一小点&…

FFmpeg的AVIOPROBE

文章目录 定义 可能你一直有疑问&#xff0c;ffmpeg的avformat是怎么提前知道码流是编码格式或者容器&#xff1f;恭喜你&#xff0c;看到这里&#xff0c;你找到答案了&#xff0c;在这里&#xff0c;ffmpeg通过这些probe函数来提前获取码流的编码格式。 看到下面的avs2_prob…

C++1114新标准——统一初始化(Uniform Initialization)、Initializer_list(初始化列表)

系列文章目录 C11&14新标准——Variadic templates&#xff08;数量不定的模板参数&#xff09; C11&14新标准——Uniform Initialization&#xff08;统一初始化&#xff09;、Initializer_list&#xff08;初始化列表&#xff09; 文章目录 系列文章目录1. 定义2. I…

装饰者模式(Decorator Pattern)

1 什么是装饰者模式&#xff1f; 1.1 Head First Design Pattern 定义 装饰者模式动态地将责任附加到对象上。若要扩展功能&#xff0c;装饰者提供了比继承更有弹性的替代方案。 1.2 大佬博客 设计模式是什么鬼&#xff08;装饰&#xff09; 2 装饰者模式 2.1 基本介绍 …

Goby 漏洞发布| 亿赛通电子文档安全管理系统 LinkFilterService 接口权限绕过漏洞

漏洞名称&#xff1a;亿赛通电子文档安全管理系统 LinkFilterService 接口权限绕过漏洞 English Name&#xff1a;Esafenet Electronic Document Security Management System LinkFilterService API Permission Bypass Vulnerability CVSS core: 9.3 影响资产数&#xff1a;…

MySQL BinLog 数据还原恢复

博文目录 文章目录 查看状态查看 binlog 开关及存储路径查看 binlog 配置 如 存储格式 binlog_format查看当前还存在的日志查看当前正在使用的日志 切换日志确定日志确定日志文件日志格式改写日志简要说明确定日志位置以事件为单位查看日志分析日志 还原数据 查看状态 查看 b…

智能优化算法应用:基于花授粉算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于花授粉算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于花授粉算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.花授粉算法4.实验参数设定5.算法结果6.参考文…

设计模式(2)--对象创建(1)--抽象工厂

1. 意图 提供一个创建一系列相关或相互依赖对象的接口&#xff0c;而无需指定它们具体的类。 2. 四种角色 抽象产品(Product)、具体产品(Concrete Product)、抽象工厂(Abstract Factory)、具体工厂(Concrete Factory)。 3. 优点 3.1 分离了具体的类。Client只需使用抽象工厂类…

解析代理IP在跨境电商和社媒营销中的关键作用

跨境电商和社媒营销领域的从业者深知&#xff0c;代理IP的价值愈发凸显。在推广营销的过程中&#xff0c;频繁遇到因IP关联而封禁账号的情况&#xff0c;或因使用不安全IP而导致异常问题。 这些问题促使人们开始高度重视代理IP的作用。但实际上&#xff0c;代理IP究竟是何物&a…

(数据结构)单链表的定义

#include<stdio.h> typedef struct LNode {int data;struct LNode* next; }LNode,*LinkList; //LNode为结构体类型&#xff0c;LinkList为指向单链表的指针 //初始化一个空的单链表 void InitList(LinkList L) {L NULL; //空表&#xff0c;暂时没有任何节点 } //判断单…

SCUM私人服务器搭建部署教程

以下是搭建SCUM私服的步骤&#xff1a; 1. 下载并安装SteamCMD。SteamCMD是一个命令行工具&#xff0c;用于从Steam下载和更新游戏服务器。你可以从Steam官网下载并安装它。 2. 创建一个文件夹来存储服务器文件。在你的计算机上创建一个文件夹&#xff0c;用于存储SCUM服务器文…

面试拼多多前端开发岗,已拿到offer,这些知识点该放出来了

一面&#xff1a; CSS 1.盒模型 2.css文件中开头加*号/上下盒子重叠问题&#xff08;为正值如何/负值如何&#xff09; 3.伪类和伪元素的了解&#xff0c;伪类有什么作用 JS 4.原型链 5.继承 6.为什么3.tostring()会报错 7.var先使用会怎样 8.函数表达式和函数声明有…

MistralAI发布全球首个MoE大模型-Mixtral 8x7B,创新超越GPT-4

引言 MistralAI&#xff0c;一家法国的初创企业&#xff0c;近期在AI界引发了轰动&#xff0c;刚刚发布了全球首个基于MoE&#xff08;Mixture of Experts&#xff0c;混合专家&#xff09;技术的大型语言模型——Mistral-8x7B-MoE。这一里程碑事件标志着AI技术的一个重要突破…

第一次提交代码到git仓库

本地搭建VUE项目&#xff0c;相关配置后&#xff0c;需要把项目代码推到github仓库上。 领导建好仓库后&#xff0c;在vscode执行以下命令&#xff0c;把项目推上去。 git init // 1. 初始化项目文件夹git add . // 2. 将所有文件添加到暂存区git commit -m "first co…

flex布局,换行的元素上下设置间距

要生成的效果图如下&#xff1a; display:flexflex-direction: row;flex-wrap: wrap;当我们使用弹性盒子布局后&#xff0c;默认元素是没有外边距的&#xff0c;紧挨着样式就有点丑&#xff0c;如果想使换行后&#xff0c;元素的外边距有个距离&#xff0c;可以用如下方法解决…

【无标题】树莓派 4B 多串口配置

0. 实验准备以及原理 0.1 实验准备 安装树莓派官方系统的树莓派 4B&#xff0c;有 python 环境&#xff0c;安装了 serial 库 杜邦线若干 屏幕或者可以使用 VNC 进入到树莓派的图形界面 0.2 原理 树莓派 4B 有 UART0&#xff08;PL011&#xff09;、UART1&#xff08;mini UAR…

散点图,何须图,折线图混放在一个echarts

散点图&#xff0c;何须图&#xff0c;折线图混放在一个echarts option {tooltip: {trigger: axis,axisPointer: {type: cross,crossStyle: {color: #999}}},legend: {data:[盒须图1,盒须图2,折线图,散点图]},xAxis: [{type: category,data: [周一,周二,周三,周四,周五,周六…

【Linux】tmux简单使用

它允许你在一个终端窗口中创建多个终端会话&#xff0c;并在它们之间进行切换。以下是tmux的一些主要用途和功能&#xff1a; 多窗口&#xff1a; Tmux允许你在一个终端中创建多个窗口。每个窗口可以包含一个或多个终端会话&#xff0c;你可以轻松地在这些窗口之间切换。面板分…

学习数据结构第一步(必看)——初识集合框架

一&#xff0c;学习数据结构前置知识 目录 一&#xff0c;学习数据结构前置知识 二&#xff0c;什么是数据结构&#xff1f; 1.什么是数据结构&#xff1f; 2.容器背后对应的数据结构 3.相关Java知识 4.什么是算法&#xff1f; 三&#xff0c;什么是集合&#xff1f; …

【lombok】从easyExcel read不到值到cglib @Accessors(chain = true)隐藏的大坑

背景: 在一次使用easyExcel.read 读取excel时&#xff0c;发现实体类字段没有值&#xff0c;在反复测试后&#xff0c;发现去掉Accessors(chain true)就正常了&#xff0c;为了验证原因&#xff0c;进行了一次代码跟踪 由于调用链路特别长&#xff0c;只列举出部分代码&#x…