介绍

requstes官方文档

Requests 是⽤Python语⾔编写,基于urllib,采⽤Apache2 Licensed开源协议的 HTTP 库。它⽐ urllib 更加⽅便,可以节约我们⼤量的⼯作,完全满⾜HTTP测试需求。

1. 安装

pip install requests

2. 请求方式

GET: 请求指定的页面信息,并返回实体主体。

HEAD: 只请求页面的首部。

POST: 请求服务器接受所指定的文档作为对所标识的URI的新的从属实体。

PUT: 从客户端向服务器传送的数据取代指定的文档的内容。

DELETE: 请求服务器删除指定的页面。

PATCH:请求局部修改。

get 和 post比较常见 GET请求将提交的数据放置在HTTP请求协议头中;POST提交的数据则放在实体数据中

2.0 安装模块

先看看帮助文档

import  requests
help(requests)

>>>
DESCRIPTION
    Requests HTTP Library
    ~~~~~~~~~~~~~~~~~~~~~
    
    Requests is an HTTP library, written in Python, for human beings.
    Basic GET usage:
...略

2.1 get

2.1.1 语法

requests.get(url, params=None, **kwargs)  #在帮助文档查看(help requests.get) 记得先导入模块
  • 例子
import  requests  					#导入requests库
r= requests.get('https://www.baidu.com/s')  #get方法
print(r.status_code)				#状态码
print(r.headers['content-type'])    
print(r.text)
print(r.content)					#以字节的方式获取页面内容

>>>
200
text/html
ISO-8859-1
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="utf-8">
    <title>百度安å
¨éªŒè¯</title>
。。。。。略

类似的

>>> r = requests.post('http://httpbin.org/post', data = {'key':'value'})
>>> r = requests.put('http://httpbin.org/put', data = {'key':'value'})
>>> r = requests.delete('http://httpbin.org/delete')
>>> r = requests.head('http://httpbin.org/get')
>>> r = requests.options('http://httpbin.org/get')

get方法返回的是一个包含服务器资源的Response对象,r中包含从服务器返回的所有相关资源

2.1.2 传递参数

import requests

data = {
    'name': 'lhj',
    'age': 21
}
response = requests.get("http://httpbin.org/get", params=data)
print(response.text)

>>>
{
  "args": {
    "age": "21", 
    "name": "lhj"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.28.1", 
    "X-Amzn-Trace-Id": "Root=1-634d2912-0a65010b5afda3ad01b70bdd"
  }, 
  "origin": "183.156.64.216", 
  "url": "http://httpbin.org/get?name=lhj&age=21"
}
#也可以传递头部参数headers{xx:xx}字典形式传参(注:有些网站访问时必须带有浏览器等信息,如果不传入headers就会报错)
或者访问超时参数timeout= int 单位秒

#其他参数
cookies= {xx:xx}字典形式传参

注意点:headers参数中如果有cookies,再传cookies参数不生效

proxies = {'http':'http://端口:ip'}或者proxies = {'https':'https://端口:ip'}

后面如果是http前面必须http,https同理

allow_redirects = BOOL参数true
  • response对象

get所返回的response对象包含6个属性

import  requests  					#导入requests库

r= requests.get('https://www.baidu.com/s')  #get方法

print(r.status_code)				#状态码
print(r.headers)    				#以字典对象存储服务器响应头,但是这个字典比较特殊,字典键不区分大小写,若键不存在则返回None
print(r.text)						#字符串方式的响应体,会自动根据响应头部的字符编码进行解码,返回url对应的页面内容 
print(r.content)					#字节方式的响应体,会自动为你解码 gzip 和 deflate 压缩,是http响应内容的二进制形式
print(r.encoding)					#从http的header中猜测的响应内容编码方式
print(r.apparent_encoding)			#从内容中分析出响应的内容编码方式


>>>
sudo+ssh://root@10.10.10.227:22/usr/local/python3.8.3/bin/python3.8 -u /data/workspace/test.py
200
-------------
{'Access-Control-Allow-Credentials': 'true', 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS', 'Access-Control-Allow-Origin': 'http://wappass.baidu.com', 'Connection': 'keep-alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Date': 'Tue, 18 Oct 2022 02:09:16 GMT', 'Etag': 'W/"6316b7ae-609"', 'Last-Modified': 'Tue, 06 Sep 2022 02:59:58 GMT', 'P3p': 'CP=" OTI DSP COR IVA OUR IND COM "', 'Server': 'BWS', 'Set-Cookie': 'BAIDUID=ACB88BDBA5799572CB4BF72E8AC4ADFD:FG=1; expires=Wed, 18-Oct-23 02:09:16 GMT; max-age=31536000; path=/; domain=.baidu.com; version=1', 'Strict-Transport-Security': 'max-age=31536000', 'Tracecode': '05561102672743774474101810', 'Traceid': '1666058956255454516211320848433092974091', 'Vary': 'Accept-Encoding', 'Transfer-Encoding': 'chunked'}
-------------
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="utf-8">
    <title>百度安å
¨éªŒè¯</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black">
    <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0">
    <meta name="format-detection" content="telephone=no, email=no">
    <link rel="shortcut icon" href="https://www.baidu.com/favicon.ico" type="image/x-icon">
    <link rel="icon" sizes="any" mask href="https://www.baidu.com/img/baidu.svg">
    <meta http-equiv="X-UA-Compatible" content="IE=Edge">
    <meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">
    <link rel="stylesheet" href="https://ppui-static-wap.cdn.bcebos.com/static/touch/css/api/mkdjump_0635445.css" />
</head>
<body>
    <div class="timeout hide">
        <div class="timeout-img"></div>
        <div class="timeout-title">网络不给力,请稍后重试</div>
        <button type="button" class="timeout-button">返回首页</button>
    </div>
    <div class="timeout-feedback hide">
        <div class="timeout-feedback-icon"></div>
        <p class="timeout-feedback-title">问题反馈</p>
    </div>

<script src="https://wappass.baidu.com/static/machine/js/api/mkd.js"></script>
<script src="https://ppui-static-wap.cdn.bcebos.com/static/touch/js/mkdjump_db105ab.js"></script>
</body>
</html>
-------------
b'<!DOCTYPE html>\n<html lang="zh-CN">\n<head>\n    <meta charset="utf-8">\n    <title>\xe7\x99\xbe\xe5\xba\xa6\xe5\xae\x89\xe5\x85\xa8\xe9\xaa\x8c\xe8\xaf\x81</title>\n    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">\n    <meta name="apple-mobile-web-app-capable" content="yes">\n    <meta name="apple-mobile-web-app-status-bar-style" content="black">\n    <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0">\n    <meta name="format-detection" content="telephone=no, email=no">\n    <link rel="shortcut icon" href="https://www.baidu.com/favicon.ico" type="image/x-icon">\n    <link rel="icon" sizes="any" mask href="https://www.baidu.com/img/baidu.svg">\n    <meta http-equiv="X-UA-Compatible" content="IE=Edge">\n    <meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">\n    <link rel="stylesheet" href="https://ppui-static-wap.cdn.bcebos.com/static/touch/css/api/mkdjump_0635445.css" />\n</head>\n<body>\n    <div class="timeout hide">\n        <div class="timeout-img"></div>\n        <div class="timeout-title">\xe7\xbd\x91\xe7\xbb\x9c\xe4\xb8\x8d\xe7\xbb\x99\xe5\x8a\x9b\xef\xbc\x8c\xe8\xaf\xb7\xe7\xa8\x8d\xe5\x90\x8e\xe9\x87\x8d\xe8\xaf\x95</div>\n        <button type="button" class="timeout-button">\xe8\xbf\x94\xe5\x9b\x9e\xe9\xa6\x96\xe9\xa1\xb5</button>\n    </div>\n    <div class="timeout-feedback hide">\n        <div class="timeout-feedback-icon"></div>\n        <p class="timeout-feedback-title">\xe9\x97\xae\xe9\xa2\x98\xe5\x8f\x8d\xe9\xa6\x88</p>\n    </div>\n\n<script src="https://wappass.baidu.com/static/machine/js/api/mkd.js"></script>\n<script src="https://ppui-static-wap.cdn.bcebos.com/static/touch/js/mkdjump_db105ab.js"></script>\n</body>\n</html>'
-------------
ISO-8859-1
-------------
utf-8

#每个部分加了分隔符

响应内容text和content两者区别:

1.content中间存的是字节码,而text中存的是字符串(由Beautifulsoup根据猜测的编码方式将content内容编码而成)。

2.直接输出content,会发现前面存在b’这样的标志,这是字节字符串的标志,而text输出没有前面的b。

3.对于纯ascii码,两者输出一致,对于其他的文字,需要正确编码才能正常显示。

4.建议使用.text,因为输出显示的是汉字。如果显示乱码,可以用.content.decode(‘utf-8’)手动选择文字编码方式中文常用utf-8、GBK、GB2312等。

2.2 post

2.2.1 语法

post(url, data=None, json=None, **kwargs)

2.2.2 传递参数

post请求传参有data,json,files三个属性对应他三种传参方式

  • post三种传参方式:
  1. formdata:对应参数data
  2. json(对于这个补充一个如果你看到json数据时jqxxx(js对象)这是jsonp格式):对应参数json
  3. files:对应参数files
1.data
data ={}字典的形式

2.json
json={}字典的形式

注意点:data与json参数共存的是情况下只会生效data里的参数

3.files
写法固定

files = {'文件名':open(文件路径,'rb')}

3. 状态码

状态码

内容

详细内容

1xx

这一类型的状态码,代表请求已被接受,需要继续处理。

100

Continue

收到请求,客户端应当继续发送请求。

101

Switching Protocols

服务器通过 Upgrade 消息头通知客户端采用不同的协议来完成这个请求。

2xx

成功 | 这一类型的状态码,代表请求已成功被服务器接收、理解、并接受。

200

OK

请求已成功,请求的响应头或数据体将随此响应返回。

201

Created

请求已经被实现,而且有一个新的资源已经依据请求的需要而创建,且其 URI 已经随 Location 头信息返回。

202

Accepted

服务器已接受请求,但尚未处理。正如它可能被拒绝一样,最终该请求可能会也可能不会被执行。

203

Non-Authoritative Information

服务器已成功处理了请求,但返回的实体头部元信息不是在原始服务器上有效的确定集合,而是来自本地或者第三方的拷贝。

204

No Content

服务器成功处理了请求,但没有返回任何实体内容。

205

Reset Content

服务器成功处理了请求,且没有返回任何内容。但是与204响应不同,返回此状态码的响应要求请求者重置文档视图。

206

Partial Content

服务器已经成功处理了部分 GET 请求。

3xx

重定向 | 这类状态码代表需要客户端采取进一步的操作才能完成请求。通常,这些状态码用来重定向,后续的请求地址(重定向目标)在本次响应的 Location 域中指明。

300

Multiple Choices

被请求的资源有一系列可供选择的回馈信息,每个都有自己特定的地址和浏览器驱动的商议信息。用户或浏览器能够自行选择一个首选的地址进行重定向。

301

Moved Permanently

被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个 URI 之一。

302

Found

请求的资源现在临时从不同的 URI 响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。

303

See Other

对应当前请求的响应可以在另一个 URI 上被找到,而且客户端应当采用 GET 的方式访问那个资源。

304

Not Modified

如果客户端发送了一个带条件的 GET 请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器应当返回这个状态码。

305

Use Proxy

被请求的资源必须通过指定的代理才能被访问。Location 域中将给出指定的代理所在的URI信息,接收者需要重复发送一个单独的请求,通过这个代理才能访问相应资源。

307

Temporary Redirect

请求的资源现在临时从不同的 URI 响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。

4xx

客户端错误 | 这类的状态码代表了客户端看起来可能发生了错误,妨碍了服务器的处理。

400

Bad Request

由于包含语法错误,当前请求无法被服务器理解。

401

Unauthorized

当前请求需要用户验证。

402

Payment Required

该状态码是为了将来可能的需求而预留的。

403

Forbidden

服务器已经理解请求,但是拒绝执行它。

404

Not Found

请求失败,请求的资源在服务器上找不到。

405

Method Not Allowed

请求中指定的请求方法不能被用于请求相应的资源。

406

Not Acceptable

请求的资源的内容特性无法满足请求头中的条件,因而无法生成响应实体。

407

Proxy Authentication Required

与 401 状态码类似,只不过客户端必须在代理服务器上进行身份验证。

408

Request Timeout

请求超时。客户端没有在服务器预备等待的时间内完成一个请求的发送。

409

Conflict

由于和被请求的资源的当前状态之间存在冲突,请求无法完成。

410

Gone

被请求的资源在服务器上已经不再可用,而且没有任何已知的转发地址。

411

Length Required

服务器拒绝在没有定义 Content-Length 头的情况下接受请求。

412

Precondition Failed

服务器在验证在请求的头字段中给出先决条件时,没能满足其中的一个或多个。

413

Request Entity Too Large

服务器拒绝处理当前请求,因为该请求提交的实体数据大小超过了服务器愿意或者能够处理的范围。

414

Request-URI Too Long

请求的 URI 长度超过了服务器能够解释的长度,因此服务器拒绝对该请求提供服务。

415

Unsupported Media Type

对于当前请求的方法和所请求的资源,请求中提交的实体并不是服务器中所支持的格式,因此请求被拒绝。

416

Requested Range Not Satisfiable

如果请求中包含了 Range 请求头,并且 Range 中指定的任何数据范围都与当前资源的可用范围不重合,同时请求中又没有定义 If-Range 请求头,那么服务器就应当返回 416 状态码。

417

Expectation Failed

在请求头 Expect 中指定的预期内容无法被服务器满足,或者这个服务器是一个代理服务器,它有明显的证据证明在当前路由的下一个节点上,Expect 的内容无法被满足。

5xx

服务器错误 | 这类状态码代表了服务器在处理请求的过程中有错误或者异常状态发生。

500

Internal Server Error

服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。

501

Not Implemented

服务器不支持当前请求所需要的某个功能。

502

Bad Gateway

作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。

503

Service Unavailable

由于临时的服务器维护或者过载,服务器当前无法处理请求。

504

Gateway Timeout

作为网关或者代理工作的服务器尝试执行请求时,未能及时从上游服务器(URI 标识出的服务器,例如 HTTP、FTP、LDAP)或者辅助服务器(例如 DNS)收到响应。

505

HTTP Version Not Supported

服务器不支持,或者拒绝支持在请求中使用的HTTP版本。

4. 相关名词解释

  • params:字典或字节序列,作为参数增加到链接中
  • data:字典,字节序列或文件对象,作为请求的内容
  • json:JSON格式的数据,作为Request的内容
  • headers:字典,HTTP定制头(模拟浏览器进行访问)
  • cookies:字典或CpplieJar,Request中的cookie
  • auth:元祖,支持HTTP认证功能
  • files:字典类型,传输文件
  • timeout:设定超时时间,秒为单位
  • proxies:字典类型,设定访问代理服务器,可以增加登陆认证
  • allow_redirects:True//False,默认为True,重定向开关
  • stream:True/False,默认为True,获取内容立即下载开关
  • verify:True/False,默认为True,认证SSL证书开关
  • cert:本地SSL证书路径