介绍
requests是使用Apache2 licensed 许可证的HTTP库。用python编写。比urllib2模块更简洁。Request支持HTTP连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自动响应内容的编码,支持国际化的URL和POST数据自动编码。在python内置模块的基础上进行了高度的封装,从而使得python进行网络请求时,变得人性化,使用Requests可以轻而易举的完成浏览器可有的任何操作。现代,国际化,友好。requests会自动实现持久连接keep-alive
基础
导入模块
import requests
发送请求(各种类型)
# HTTP请求类型
# get类型
r = requests.get('https://github.com/timeline.json')
# post类型
r = requests.post("http://m.ctrip.com/post")
# put类型
r = requests.put("http://m.ctrip.com/put")
# delete类型
r = requests.delete("http://m.ctrip.com/delete")
# head类型
r = requests.head("http://m.ctrip.com/head")
# options类型
r = requests.options("http://m.ctrip.com/get")
请求带参数
requests模块发送请求有data、json、params三种携带参数的方法。
params在get请求中使用,data、json在post请求中使用。
data参数
- 数据报文:如果是字典,那么默认情况下请求头:application/x-www-form-unlencoded,表示以form表单的方式传参,格式a=1&b=2&c=3 列如单一键值对无嵌套:{“a”:1,”b”:2}
- 如果是str,那么默认情况下是text/plain(如果是字典,需要转化成字符串格式传参)->json.dumps(data)
字典格式转化为字符串,序列化。列如:{‘a’:{‘b’:1,’c’:2}}
json参数,复杂的都可以
- 不管json是str还是dict,如果不指定headers中的content-type,默认为application/json
- data为dict时,如果不指定content-type,默认为application/x-www-form-urlencoded,相当于普通form表单提交的形式
- data为str时,如果不指定content-type,默认为text/plain
- json为dict时,如果不指定content-type,默认为application/json
- json为str时,如果不指定content-type,默认为application/json
- 用data参数提交数据时,request.body的内容则为a=1&b=2的这种形式,用json参数提交数据时,request.body的内容则为’{“a”: 1, “b”: 2}’的这种形式,当请求参数有嵌套时,比如payload{“mkey”:”xxx”,”op”:”xxx”,”data”:{“email”:”xxx”,”pwd”:”xxx”}} ,data是解析不出a=1&b=2的这种形式,此时需要使用json
文件参数
- 通过files传参,传递文件的字节流
import requests
import json
payload = {'keyword': '香港', 'salecityid': '2'}
r = requests.get("http://m.ctrip.com/webapp/tourvisa/visa_list", params=payload)
#定制请求头
url = 'http://m.ctrip.com'
headers = {'User-Agent' : 'Mozilla/5.0 (Linux; Android 4.2.1; en-us; Nexus 4 Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19'}
cookie = {'key':'value'}
data = {'some': 'data'}
r = requests.post(url, headers=headers,cookies=cookie,date=data)
#post发送json请求,data参数需要序列化
r = requests.post('https://api.github.com/some/endpoint', data=json.dumps({'some': 'data'}))
#r = requests.post(url, headers=headers,cookies=cookie,json=data)
#post部分编码文件
url = 'http://m.ctrip.com'
files = {'file': open('report.xls', 'rb',encoding='utf-8')}
r = requests.post(url, files=files)
- 请求会话
在requests里,session对象是一个非常常用的对象,这个对象代表一次用户会话:从客户端连接服务器开始,到客户端浏览器与服务器断开,会话能让我们在跨请求时候保持某些参数,比如在同一个Session实例发出的所有请求之间保持cookie,如果一个响应中包含了cookie,那么我们可以利用cookies参数拿到,cookies=rep.cookies
session = requests.session()
# User-Agent头
header = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36'}
# 需要登录的账户和密码
email = input("请输入您的账户:")
password = input("请输入您的密码:")
data = {"email": email, "password": password}
# 发送附带账户密码的请求,并获取登录后的Cookie值,保存在session中
session.post("http://www.renren.com/PLogin.do", data = data)
# session中包含了登录后的Cookie值,可以直接访问那些需登录后才能访问的页面
response = session.get("http://www.renren.com/413928886/profile")
# 打印响应内容
print(response.text)
request返回值
- r.status_code HTTP请求的返回状态,200表示连接成功,404表示失败
- r.text HTTP响应内容的字符串形式,即url对应的页面内容
- r.encoding 从HTTP header中猜测的响应内容编码方式
- r.apparent_encoding 从内容中分析出的响应内容编码方式(备选编码方式)
- r.content HTTP响应内容的二进制形式
- r.json() requests中内置json解码器
- r.reason 状态原因
- r.cookies 返回cookies
- r.headers 以字典对象存储服务器响应头,若键不存在则返回为None