requests库是 python3 中非常优秀的第三方库,它使用 Apache2 Licensed 许可证的 HTTP 库,用 Python 编写,真正的为人类着想。
requests 使用的是 urllib3(python3.x中的urllib),因此继承了它的所有特性。
Requests 会自动实现持久连接keep-alive,Requests 支持 HTTP 连接保持和连接池,支持使用 cookie 保持会话,支持文件上传,
支持自动确定响应内容的编码,支持国际化的 URL 和 POST 数据自动编码,现代、国际化、人性化。
Requests库中有7个主要的函数,分别是 request() 、get() 、 head() 、post() 、put() 、patch() 、delete() 。
这七个函数中request()函数是其余六个函数的基础函数,其余六个函数的实现都是通过调用该函数实现的。
json和dict
python中的dict类型要转换为json格式的数据需要用到json库:
import json
= json.dumps()
= json.loads()
需要注意的是python中并没有json类型这一说法,通过json.dumps()转换的字典对象,最后得到的是一个字符串对象,
也就是说,在python中json格式的数据实际上就是一个字符串
>>> j = json.dumps()
>>> type(j)
虽说json格式的数据在python中是以字符串的类型存在的,但是通过str()工厂函数所得到的结果同json.dumps()方法所得到的结果是不相同的
以看出来string和js的区别在于引号。对于可以作为json.loads()参数对象的字符串,除了要满足字典类型的格式外,所有的字符串对象必须是双引号。
Python Requests post 方法中 data 与 json 参数问题
1.data参数
你想要发送一些编码为表单形式的数据——非常像一个 HTML 表单。要实现这个,只需简单地传递一个字典给 data 参数。你的数据字典在发出请求时会自动编码为表单形式,header默认Content-Type: application/x-www-form-urlencoded,
发送过来的抓包到的数据格式为:'username=amy&password=123'
如果你传递一个 string 而不是一个 dict,那么数据会被直接发布出去,不会被编码为表单形式
例如传'{"username": "amy", "password": "123"}',直接发出去,抓包的内容也是'{"username": "amy", "password": "123"}'
2.json参数
还可以使用 json 参数直接传递,然后它就会被自动编码,header默认'Content-Type': 'application/json'
json发送过来的数据格式为:{"username": "amy", "password": "123"}
3.实际场景中如何使用
1)对页面接口抓包,如果Content-Type:application/json,则限制接受json格式,requests中可用json方法,
或者使用data方法,headers加'Content-Type': 'application/json',postdata传string格式,不会自动编码格式
2)对页面接口抓包,Content-Type:application/x-www-form-urlencoded; charset=UTF-8,则可使用data方法
===================================================================================================
===============================================================================================================
带参数的get请求:
参数在网页url后面:"url": "http://httpbin.org/get?key1=value1&key2=value2"
import requests
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.get("http://httpbin.org/get", payload=payload )
print(r.text)
执行结果:
{
"args": {
"key1": "value1",
"key2": "value2"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.23.0",
"X-Amzn-Trace-Id": "Root=1-5e501d6f-72b6f98a2655a02975b0fc47"
},
"origin": "122.194.13.251",
"url": "http://httpbin.org/get?key1=value1&key2=value2"
}
====================================================================================================
import requests
print('#------------------------------------------------------------------------------------------1')
#发送不带参数、不带响应体的post请求:
r = requests.post('http://httpbin.org/post')
print('#------------------------------------------------------------------------------------------2')
#发送带请求体参数的post请求,key:value:默认类型为即:content-type为application/x-www-form-urlencoded
# x-www-form-urlencoded
# 当action为get时候,浏览器用x-www-form-urlencoded的编码方式把form数据转换成一个字串(name1=value1&name2=value2…)
# ,
# 然后把这个字串append到url后面,用?分割,加载这个新的url。
#pplication/x-www-form-urlencoded :
中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)payload = (('key1', 'value1'), ('key1', 'value2'))
r = requests.post('http://httpbin.org/post', date=payload)
print('#------------------------------------------------------------------------------------------3')
#发送带响应体的post请求,json文件
#multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式
#如果提交表达,即需要设置content-type 即 设置 header
下面:发送content-type为json格式的请求体
import requests
import json
payload = (('key1', 'value1'), ('key1', 'value2'))
header = { 'content-type':'application/json'}
r = requests.post('http://httpbin.org/post', json.dumps(payload),headers=header) #注意:将payload参数转化为字典类型
--------------------------------------------------------------------------------------------------------------
方法二:
import requests
import json
payload = (('key1', 'value1'), ('key1', 'value2'))
r = requests.post('http://httpbin.org/post', json(payload)) #注意:将payload参数转化为字典类型
===============================================================================================================
multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式
即大型文件:比如excel、视频文件等
import requests
x = {'file':open('C:\\Users\\del\\Desktop\\新建文本文档 (3).txt','rb')}
r = requests.post('http://httpbin.org/post', files = x)
print(r.text)
-------------------------------------------------------------------------------------
当然,也可以指定这个文件的一些描述信息,详细的如下:
POST一个多部分编码(Multipart-Encoded)的文件
Requests 使得上传多部分编码文件变得很简单:
>>> url = 'http://httpbin.org/post'
>>> file = {'file': open('report.xls', 'rb')}
>>> r = requests.post(url, files=file)
>>> r.text
{
...
"files": {
"file": ""
},
...
}
你可以显式地设置文件名,文件类型和请求头:
url = 'http://httpbin.org/post'
files = {'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})}
r = requests.post(url, files=files)
r.text
{
...
"files": {
"file": ""
},
...
}
如果你想,你也可以发送作为文件来接收的字符串:
>>> url = 'http://httpbin.org/post'
>>> files = {'file': ('report.csv', 'some,data,to,send\nanother,row,to,send\n')}
>>> r = requests.post(url, files=files)
>>> r.text
{
...
"files": {
"file": "some,data,to,send\\nanother,row,to,send\\n"
},
...
}
如果你发送一个非常大的文件作为 multipart/form-data 请求,你可能希望将请求做成数据流。
默认下 requests 不支持, 但有个第三方包 requests-toolbelt 是支持的。你可以阅读 toolbelt 文档 来了解使用方法。
=============================================================================================================
Accept-Encoding:跟压缩有关,浏览器发送http请求给web服务器,http请求中的header有Accept-Encoding:gzip,deflate(告诉服务器,浏览器支持gzip压缩)
Content-Length:发送给HTTP服务器数据的长度。
Content-Type:即是Internet Media Type,互联网媒体类型;也叫做MIME类型,在Http协议消息头中,使用Content-Type来表示具体请求中的媒体类型信息。
例如:Content-Type: application/x-www-form-urlencoded
常见的媒体格式类型如下:
text/html : HTML格式
text/plain :纯文本格式
text/xml : XML格式
image/gif :gif图片格式
image/jpeg :jpg图片格式
image/png:png图片格式
以application开头的媒体格式类型:
application/xhtml+xml :XHTML格式
application/xml : XML数据格式
application/atom+xml :Atom XML聚合格式
application/json : JSON数据格式
application/pdf :pdf格式
application/msword : Word文档格式
application/octet-stream : 二进制流数据(如常见的文件下载)
application/x-www-form-urlencoded :
中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)另外一种常见的媒体格式是上传文件之时使用的:
multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式
注意:gzip、compress以及deflate编码都是无损压缩算法,用于减少文件传输大小,不会导致信息丢失,其中gzip效率最高,使用最广。