先看看requests的几种请求类型
- get请求:requests.get(‘url’)
- post请求:requests.post(“url/post”)
- put请求:requests.put(“url/put”)
- delete请求:requests.delete(“url/delete”)
- head请求:requests.head(“url/get”)
- options请求:requests.options(“url/get”)
Response对象使用.
GET 请求
- 发送无参数的get请求 设置超时时间 timeout 单位秒
r = requests.get('http://www.baidu.com', timeout=1)
# r.url #打印输出该 URL
# r.headers #以字典对象存储服务器响应头,但是这个字典比较特殊,字典键不区分大小写,若键不存在则返回None
# r.status_code #返回连接状态,200正常。
# r.text #默认以unicode形式返回网页内容,也就是网页源码的字符串。
# r.content #以字节形式(二进制)返回。字节方式的响应体,会自动为你解码 gzip 和 deflate 压缩。
# r.json() #把网页中的json数据转成字典并将其返回。
# r.encoding #获取当前的编码
# r.encoding = 'ISO-8859-1' #指定编码,r.text返回的数据类型,写在r.text之前。
r = requests.get('http://www.baidu.com', timeout=1)
- 发送带参数的请求.
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.get("https://www.baidu.com/", params=payload)
print(r.url)
#打印结果: https://www.baidu.com/?key2=value2&key1=value1
# 你还可以将一个列表作为值传入
payload = {'key1': 'value1', 'key2': ['value2', 'value3']}
r = requests.get('http://www.baidu.com/', params=payload)
print(r.url)
#打印结果:http://www.baidu.com/?key2=value2&key2=value3&key1=value1
- 定制请求头
url = 'https://www.baidu.com/s?wd=python'
headers = {
'Content-Type': 'text/html;charset=utf-8',
'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
}
r = requests.get(url,headers=headers)
- 会话保执
经常很多请求只有在登录后才能进行,实现登录效果一般的做法是执行登录请求,然后从返回结果中提取sessionid放入自定义cookie中。
这种方法在requests中也行得通,但requests提供了更为简单的方法,直接使用request.Session类来请求即可,其保持登录的原理是保留之前请求中服务端通过set-cookie等设置的参数。
s = Session()
url='http://docs.python-requests.org/en/master/'
# 所有方法和直接使用requests时一样用即可
s.get(url)
- 自定义Cookie
实验发现如果自定义header中定义了cookies那么此处设置的cookies不生效
headers 和 cookies 如果同时存在,会取headers里的值,cookies单独设置的则不会生效
headers = {
'Content-Type': 'application/x-www-form-urlencoded',
'Cookie': 'name=selfinheader'
}
cookies = {'name1': 'cookie1', 'name2': 'cookies2'}
github_url = 'http://docs.python-requests.org/en/master/'
r = requests.get(github_url, headers=headers, cookies=cookies)
POST 请求
HTTP 协议规定 POST 提交的数据必须放在消息主体(entity-body)中,但协议并没有规定数据必须使用什么编码方式,服务端通过是根据请求头中的Content-Type字段来获知请求中的消息主体是用何种方式进行编码,再对消息主体进行解析。具体的编码方式包括:
- 最常见post提交数据的方式,以form表单形式提交数据: application/x-www-form-urlencoded
- 以json串提交数据: application/json
- 一般使用来上传文件:multipart/form-data
实例如下:
- 以form形式发送post请求
# Reqeusts支持以form表单形式发送post请求,只需要将请求的参数构造成一个字典,然后传给requests.post()的data参数即可
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.post("http://httpbin.org/post", data=payload)
print(r.text)
'''
打印结果:
{
"args": {},
"data": "",
"files": {},
"form": {
"key1": "value1",
"key2": "value2"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "23",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.19.1",
"X-Amzn-Trace-Id": "Root=1-5eba5051-d6224e54e7bb8c34aacabf50"
},
"json": null,
"origin": "218.76.158.236",
"url": "http://httpbin.org/post"
}
'''
- 以json形式发送post请求
# 可以将一 json串传给requests.post()的data参数,
url = 'http://httpbin.org/post'
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.post(url, data=json.dumps(payload))
print(r.headers.get('Content-Type'))
# 打印结果:application/json
- 以multipart形式发送post请求
# Requests也支持以multipart形式发送post请求,只需将一文件传给requests.post()的files参数即可,文本文件report.txt的内容只有一行:Hello world!,从请求的响应结果可以看到数据已上传到服务端中。
url = 'http://httpbin.org/post'
files = {'file': open('report.txt', 'rb')}
r = requests.post(url, files=files)
print(r.text)
'''
打印结果:
{
...
"files": {
"file": "hello world"
},
"form": {},
"headers": {
"Content-Type": "multipart/form-data; boundary=6db46af64e694661985109da21c8fe9b",
},
"json": null,
"origin": "223.72.217.138",
"url": "http://httpbin.org/post"
...
}
'''
封装函数
import requests, json
import time
import random
import string
from urllib import parse
from hashlib import md5
# 请求接口共用方法
def request_fun(url, paramArr, headers, mode='get'):
# 接口签名验证参数
app_id = paramArr.get('app_id')
paramArr['time_stamp'] = int(time.time())
paramArr['nonce_str'] = ''.join(random.sample(string.ascii_letters + string.digits, 16))
paramArrSign = json.dumps(paramArr, sort_keys=True)
# urlencode仅支持字典类型的数据,同时不存在urldecode方法
paramStr = parse.urlencode(json.loads(paramArrSign))
paramArr['api_sign'] = (md5(paramStr.encode('utf8')).hexdigest()).upper()
resultData = None
# 执行请求
try:
if mode == 'post':
resultJson = requests.post(url, params=paramArr, headers=headers, timeout=5).json()
else:
resultJson = requests.get(url, params=paramArr, headers=headers, timeout=5).json()
resultStatus = resultJson['status']
if resultStatus != 'success':
print('接口输出错误;错误详情:')
print(url)
print(resultJson)
else:
# 返回数据
resultData = resultJson['data']
except requests.exceptions.RequestException as e:
print(e)
print('请求超时')
return resultData