Python requests 模块,该模块主要用来发 送 HTTP 请求。
一、requests 方法
url 请求 url。
data 参数为要发送到指定 url 的字典、元组列表、字节或文件对象。
json 参数为要发送到指定 url 的 JSON 对象。
args 为其他参数,比如 cookies、headers、verify等。
示例:
# 导入 requests 包
import requests
# 发送请求
x = requests.get('https://www.baidu.com/')
# 返回 http 的状态码
print(x.status_code)
# 响应状态的描述
print(x.reason)
# 返回编码方式
print(x.apparent_encoding)
输出结果:
200
OK
utf-8
1、get方法详解
requests.get(url, params, args)
中,除了必传的请求地址url外,还有1个默认参数params,这个参数会对url进行处理。一般get方式请求,参数是通过url?key1=value1&key2=value2....
进行拼接的(即参数字段和值是=连接,参数之间连接符是&,接口路径通过?来连接参数内容),如果url已经带有参数,则可以不用params参数,如果url没有带参数,则requests.get()会将params的内容按照拼接逻辑拼接到url后。args 为其他参数,比如 cookies、headers、verify等。
import requests
# url已经带有参数
r1 = requests.get("http://csdn.org/get?name=gemey&age=22")
print("----------url未携带params参数,请求数据放到url地址中----------")
print(r1.text)
# url没有带参数
r2 = requests.get("http://csdn.org/get", params={"name": "gemev", "age": 22})
print("\n----------url携带params参数,请求数据放到params中----------")
print(r2.text)
# url携带参数数据中有列表
r3 = requests.get("http://csdn.org/get", params={"name": "gemev", "age": [22, 45]})
print("\n----------url携带params参数,请求数据放到params中,数据中有列表----------")
print(r3.text)
2、post方法详解
如果想上传的数据较大,或者上传的数据对服务器方的数据库、文件等内容有修改,一般使用Post请求,post请求上传数据的方式有:表单、Json、文件等。
2.1、表单
post请求上传表单数据时,是通过data参数上传的,入参的数据是字典对象(dict)
格式:post(url, data, args)
import requests
url = 'http://csdn.org/post'
data = {
'name': 'jack',
'age': 23
}
r = requests.post(url, data=data)
print(r.text)
如果不定义Content-Type,会被默认设置为application/x-www-form-urlencoded
2.2、Json
json也是post请求经常用到的数据上传格式,如果上传的数据是json格式,需要将python字典对象通过json参数传入
格式:post(url, json, args)
# -*- coding: utf-8 -*-
import requests
url = 'http://csdn.org/post'
data = {
'name': 'jack',
'age': 23
}
r = requests.post(url, json=data)
print(r.text)
如果要定义为json格式,Content-Type需要设置为application/json
2.3、文件上传
request()函数中有个files参数,用来处理文件上传,files参数需要指定name和filename(Content-Type会被默认指定值),格式为:
格式一:{"name": open("待上传文件完整路径", "rb")}
:指定了name的值,filename的值默认为上传文件的文件名和后缀
格式二:{"name": ("filename", open("待上传文件完整路径", "rb"))}
:指定了name和filename的值 filename filename:显示的文件名称
"Content-Type"一般为 "multipart/form-data;
import requests
url = 'http://csdn.org/post'
r1 = requests.post(url,files={"test_file": open("D:\\test_code\\allure_demo\\interface.txt", "rb")})
#filename默认为上传文件的文件名+后缀
print(r1.text)
2.4、其他数据类型
Post请求不止上传文件、发送form、json数据,还支持html、xml等数据,这些数据一般通过data参数传入,但是需要在请求头的Content-Type字段申明数据类型。
3、定义header
headers中有很多内容,他们是以键对的形式定义出来,在request中,则是用过headers=headers来区分,前面为关键字headers,后面为自定义的头信息变量,变量名为headers
格式:headers值为字典,字典每组key:value之间用逗号分隔,若一组key对应多个value值,多个value值之间用分号分隔。若在headers中传递cookie,则此value值为多个键值对。
# -*- coding: utf-8 -*-
import requests
url = 'http://csdn.org/post'
headers = {'Content-Type': 'application/json;charset=UTF-8', 'User-Agent':'self-defind-user-agent'}
data = {
'name': 'jack',
'age': 23
}
r = requests.post(url, json=data, headers=headers)
print(r.text)
4、定义cookie
很多接口请求需要附带cookies,服务端校验成功后才会返回正常的响应数据。
requests提供2种传递Cookie的方式:
方式一:通过请求头headers信息传递:headers参数中包含Cookie键值对(为了让服务端正常识别,cookie的值格式尽量为:key1=value1; key2=value2; xxx; keyn=valuen,)
# -*- coding: utf-8 -*-
import requests
url = 'http://csdn.org/post'
headers = {'Cookie': 'key1=value1;key2=value2', 'Content-Type': 'application/json;charset=UTF-8'}
data = {
'name': 'jack',
'age': 23
}
r = requests.post(url, json=data, headers=headers)
print(r.text)
方式二:通过关键字参数cookies传递:cookies参数被传入字典,字典数据中的每个键值代表了一个cookie,键表示cookie的变量名称,值为对应的cookie值。
# -*- coding: utf-8 -*-
import requests
url = 'http://csdn.org/post'
headers = {'Content-Type': 'application/json;charset=UTF-8'}
cookies = {'c1': 'cookie_1', 'c2': 'cookie_value2'}
data = {
'name': 'jack',
'age': 23
}
r = requests.post(url, json=data, headers=headers, cookies=cookies)
print(r.text)
5、超时设置
request()方法有超时处理机制,根据我们传入的参数timeout(单位秒,float类型)判断是否请求超时,若响应超时,则程序报错(ConnectTimeout)。
# -*- coding: utf-8 -*-
import requests
r1 = requests.get("http://csdn.org/get?age=18&name=lisa", timeout=2.5)
6、代理设置
调试时我们可能需要抓包来查看接口数据,或者需要通过代理去降低请求频率时候,我们可以将请求发送到代理,让代理发送给服务端,然后代理再将服务端响应数据返回给我们,可通过参数proxies设置代理,
# -*- coding: utf-8 -*-
import requests
proxies = {"http": "http://127.0.0.1:8888",
"https": "http://127.0.0.1:8888"}
r1 = requests.get("http://csdn.org/get?age=18&name=lisa", proxies=proxies, verify=False )
# https请求通过代理,默认去验证证书,设置成不验证:verify=False
7、认证
在访问接口时,很多需要去验证用户信息,验证方式有多种,requests封装了多种方式,requests.auth支持Basic Authentication、Digest Authentication。可以通过参数auth进行认证。
import requests
from requests.auth import HTTPBasicAuth, HTTPDigestAuth
from requests_oauthlib import OAuth1
url = "http://csdn.org/basic-auth/weixin/123456"
# auth指定HTTPBasicAuth认证
r_basic = requests.get(url, auth=HTTPBasicAuth("weixin", "123456"))
print(f"请求的请求头:{r_basic.request.headers}")
如果不想验证证书,request请求中请加上参数:verify=False
,如:response = requests.get(url, verify=False)
8、会话保持
经常很多请求只有在登录后才能进行,一般的做法是执行登录请求,然后从返回结果中提取session放入自定义cookie中。
这种方法在requests中也行得通,但requests提供了更为简单的方法,requests 提供了一个叫做session类,来实现客户端和服务端的会话保持,其保持登录的原理是保留之前服务请求中服务端通过set-cookie等设置的参数。
session = requests.session()
response = session.get(url,headers)
s = Session()
url='http://docs.python-requests.org/en/master/'
s.get(url) # 所有方法和直接使用requests时一样用即可
# -*- coding: utf-8 -*-
import requests
session = requests.session()
r = session.get("http://csdn.org/cookies") # 所有方法和直接使用requests时一样用即可
print(r.text)
cookie和session区别
1、cookie数据存放在客户的浏览器上,session数据放在服务器上
2、cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用服务器的性能。
二、 response 对象
每次调用 requests 请求之后,会返回一个 response 对象,该对象包含了具体的响应信息。,可以通过如下方法获取对应的响应信息,示例同上。