劝君惜取少年时
requests库可以帮我们发送http的请求,并处理服务器给我们的响应
大体使用方法
r = requests.get('https://www.baidu.com', timeout=1) # timeout为设置的超时时间,单位:秒
r = requests.post('https://www.baidu.com')
r = requests.put('https://www.baidu.com')
r = requests.delete('https://www.baidu.com')
r = requests.head('https://www.baidu.com')
r = requests.options('https://www.baidu.com') # 预检请求
传headers即可
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)
传 params即可
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.get('https://www.baidu.com',params=payload)
print(r.url)
#此url最终为:https://www.baidu.com/?key2=value2&key1=value1
传data即可
payload = {'key1': 'value1',
'key2': 'value2'
}
r = requests.post("http://httpbin.org/post", data=payload)
print(r.text)
Reqeusts默认是以form表单形式发送post请求
我们大都以json形式发送post请求,传json参数即可
注意:json传的payload不要自行再用json.dumps转换成json字符串,直接传字典即可
url = 'http://httpbin.org/post'
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.post(url, json=payload)
print(r.headers.get('Content-Type')) # application/json 这是传了json参数后自动帮我们添加的请求头
如果此时你想打印日志,传参为json格式,可以使用json.dumps转成json格式:
json_data = json.dumps(payload, ensure_ascii=False) # ensure_ascii要传False,否则中文会乱码
logg.info(f'\npost:{url},\n{json_data}\nresponse:{r.json()}'
如果你坚持将消息体传到data,请将参数用json.dumps将字典字典转换成json字符串,并手动增加请求头
url = 'http://httpbin.org/post'
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.post(url, data=json.dumps(payload), headers={'Content-type': 'application/json'})
若以以文件形式发送post请求,传files即可
url = 'http://httpbin.org/post'
files = {'file': open('report.txt', 'rb')}
r = requests.post(url, files=files)
print(r.text)
r.url # 请求 URL
r.headers # 以字典对象存储服务器响应头,但是这个字典比较特殊,字典键不区分大小写,若键不存在则返回None
r.status_code # 返回连接状态,200正常。
r.text # 默认以unicode形式返回响应内容,str类型
r.content # 以字节形式(二进制,也就是bytes类型)返回。会自动为你解码 gzip 和 deflate 压缩。
r.json() # 把网页中的json数据转成字典并将其返回。
r.encoding # 获取当前的编码
r.encoding = 'ISO-8859-1' # 指定编码,r.text返回的数据类型,写在r.text之前。
r.ok # 查看r.ok的布尔值便可以知道是否登陆成功
r.cookies # Cookies
r.history # 请求历史
r.elapsed.total_seconds() #获取请求实际的响应时间
在使用过程中,我们经常拿postman中的json参数想放在代码中直接参数化,这个时候,可以复制到python文件中,直接就是字典,但是一般我们想把json和字典区分开来,json是双引号,我们字典一般用单引号,可以使用如下代码,将其转成单引号的字典,方便处理:json.loads(json.dumps(pre_json_data))
pre_json_data = {"key1": "value1", "key2": "value2"}
print(type(pre_json_data)) #
dict_data = json.loads(json.dumps(pre_json_data))
print(dict_data) # {'key1': 'value1', 'key2': 'value2'}
注:json.loads是将json转成字典,json.dumps是将字典转成json