4、requests-基础
1、发出一个get请求:
r = requests.get('https://github.com/timeline.json')
返回给我们的r,是一个requets的对象,这个requests的对象中我们可以调用一些属性,方便我们得到更加详细的信息;
r.status_code # 响应状态码 r.content # 字节方式的响应体,会自动为你解码 gzip 和 deflate 压缩 r.headers # 以字典对象存储服务器响应头,但是这个字典比较特殊,字典键不区分大小写,若键不存在则返回None r.json # Requests中内置的JSON解码器 r.url # 获取url r.encoding # 编码格式 r.cookies # 获取cookie r.raw # 返回原始响应体 r.text # 字符串方式的响应体,会自动根据响应头部的字符编码进行解码 r.raise_for_status() # 失败请求(非200响应)抛出异常
同时,get方法可以接受参数:
# -*- coding:utf-8 -*- import requests
# 字典的形式填充参数 params = {'k1': 'v1', 'k2': 'v2'} r = requests.get('http://www.baidu.com', params=params)
get请求,是将参数添加到url上:
http://www.baidu.com/?k2=v2&k1=v1
同时你也可以把列表当做字典的值传到url中:
params = {'k1': 'v1', 'k2': ['v2', 'v3', 'v4']} r = requests.get('http://www.baidu.com', params=params)
#得到的url:http://www.baidu.com/?k2=v2&k2=v3&k2=v4&k1=v1
添加请求头:
params = {'k1': 'v1', 'k2': ['v2', 'v3', 'v4']} header = {'k1': 'v1', 'k2': 'v2'} r = requests.get('http://www.baidu.com', params=params, headers=header)
2、发起一个post的请求:
import requests params = {'k1': 'v1', 'k2': ['v2', 'v3', 'v4']} header = {'k1': 'v1', 'k2': 'v2'} r = requests.post('http://httpbin.org/post', data=params, headers=header)
当然我们可以使用post传递json文件:
import requests import json params = {'k1': 'v1', 'k2': ['v2', 'v3', 'v4']} header = {'k1': 'v1', 'k2': 'v2'}
# 使用json库,序列化python数据类型为json字符串 json_data = json.dumps(params) r = requests.post('http://httpbin.org/post', data=json_data, headers=header)
除了对dict进行编码后传递,还可以json参数直接进行传递,它会自动帮我进行编码:
params = {'k1': 'v1', 'k2': ['v2', 'v3', 'v4']} header = {'k1': 'v1', 'k2': 'v2'} json_data = json.dumps(params) # 使用json参数传递参数,传递之前会先进行序列化 r = requests.post('http://httpbin.org/post', json=params, headers=header)
设置超时时间:
timeout
仅对连接过程有效,与响应体的下载无关。 timeout
并不是整个下载响应的时间限制,而是如果服务器在 timeout
秒内没有应答,将会引发一个异常(更精确地说,是在timeout
秒内没有从基础套接字上接收到任何字节的数据时)