第三方库Requests 擅长处理那些复杂的HTTP请求,cookie, header等内容,并且支持 Python 2.6—2.7以及3.3—3.7
提供了比python2中urllib,urllib2和python3中urllib.request,urllib.repsonse等模块更加简洁方便的API
安装Requests库
$ pip install requests
发送请求
Reponse响应对象
Request请求对象
发送数据和提交表单
文件上传
流式上传
上传多个文件
Cookie
超时处理
代理
SSL证书验证
客户端证书
流式响应体
CookieJar
会话Session>>> r = requests.get("http://www.baidu.com")
构建一个requests.Request对象,收到响应后返回requests.Response对象
传递的关键字参数可以查看Request对象的构建方法参数
requests.get(url,params=None,**kwargs)
params参数 接受字符串字典提供给URL作为查询字符串(query string)
>>> dic= {'key1': 'value1', 'key2': 'value2'}
>>> r = requests.get("http://httpbin.org/get", params=dic)
>>> r.url #查看url
'http://httpbin.org/get?key2=value2&key1=value1'
字典里值为None的键都不会被添加到 URL 的查询字符串里。
可以将一个列表作为值传入
>>> dic= {'key1': 'value1', 'key2': ['value2', 'value3']}
>>> r = requests.get('http://httpbin.org/get', params=dic)
>>> r.url
'http://httpbin.org/get?key1=value1&key2=value2&key2=value3'
其他类型的请求方法
requests.put(url, data=None,**kwargs)
requests.post(url, data=None, json=None, **kwargs)
requests.patch(url,data=None,**kwargs)
requests.head(url,**kwargs)
requests.delete(url,**kwargs)
r.url 查看Reponse对象的URL
r.request 返回响应的请求Request对象
r.text 读取服务器响应的内容,自动解码来自服务器的内容,
r.encoding 查看响应使用的编码,同时可以覆盖该属性来改变编码方式
返回的编码方式为requests根据响应头部推测,不要过度依赖此机制,有时gbk编码会被使用ISO-8859-1编码来处理
r.content 以字节方式读取请求响应体,可用于下载图片视频等,可以自动解码gzip和deflate传输编码的响应数据
r.json() 使用requests内置的JSON解码器解码
如果解码失败会抛出异常,有时即使唱功调用r.json()也并不意味着响应成功
有的服务器会在失败的响应中包含一个 JSON 对象(比如 HTTP 500 的错误细节)。
这种 JSON 会被解码返回。
要检查请求是否成功,请使用 r.raise_for_status()或者检查r.status_code 是否和你的期望相同。
r.raw 获取来自服务器的原始套接字,请求方法应确保设置stream=True
r.headers 以字典的形式返回服务器响应头使用任意大小写来传递给索引或get()方法访问响应头字段
r.cookies 返回RequestsCookieJar对象,允许以字典方式访问响应中包含的cookie
r.history 该属性是一个Response对象的列表,可用来追踪重定向,对象的顺序时按照最老到最近的请求排序
r.status_code 返回响应状态码
r.ok 如果响应状态吗小于400则返回True
r.raise_for_status() 针对响应码抛出相应异常
requests.request(method, url, **kwargs)
method 为请求方法http,https等等
url 为URL地址
params 该参数作为查询字符串,字典或者字节流
headers 作为请求头的字典,所有的header值必须时string, bytestring unicode
allow_redirects 布尔值,True表示禁用重定向处理,False表示禁用重定向处理
HEAD请求方法默认不使用重定向
auth 接受元组或者HTTPBasicAuth类用于身份验证
提交表单时应注意处理表单的URL,也就是表单字段的action属性,应该将URL设置为该action的地址,该地址可能为绝对地址或相对地址,进行相应的转换
data 接受字典或包含元组的列表,字节流或文件对象作为请求体
传递字典给data参数,自带你会自动编码为表单形式
元组列表可以在表单多个元素使用同一个key时使用,
还可以JSON编码的数据作为参数传递
>>> payload = (('key1', 'value1'), ('key1', 'value2'))
>>> r = requests.post('http://httpbin.org/post', data=payload)
>>> payload = {'some': 'data'}
>>> r = requests.post(url, data=json.dumps(payload)
其他类型会直接作为数据发送出去
json 接受字典,并自动编码为JSON数据作为请求体
files 接受一个字典用于上传文件
>>> url = 'http://httpbin.org/post'
>>> files = {'file': open('report.xls', 'rb')}
>>> r = requests.post(url, files=files)
可以显示地设置文件名,文件类型和请求头
>>> url = 'http://httpbin.org/post'
>>> files = {'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})}
>>> r = requests.post(url, files=files)
也可以发送作为文件接受的字符串
>>> url = 'http://httpbin.org/post'
>>> files = {'file': ('report.csv', 'some,data,to,send\nanother,row,to,send\n')}
>>> r = requests.post(url, files=files)
要求使用二进制模式打开文件,因为Request可能会试图提供Content-length字段,这个值会被设为文件的字节数,如果用文本模式打开可能会出错
流式上传,可以发送大的数据流或文件,仅需为请求体data参数提供一个文件对象即可,而无需先把他们读入内存
with open('massive-body') as f:
requests.post('http://some.url/streamed', data=f)
上传多个文件,需要把文件放到一个元组的列表中
#
#上传多个图像文件到表单
>>> url = 'http://httpbin.org/post'
>>> multiple_files = [
('images', ('foo.png', open('foo.png', 'rb'), 'image/png')),
('images', ('bar.png', open('bar.png', 'rb'), 'image/png'))]
>>> r = requests.post(url, files=multiple_files)
大多数网站都是用cookie来跟踪用户是否登陆,一旦登陆,就会将服务器生成的令牌,登陆有效期限和状态跟踪信息等信息保存在cookie中,网站会把cookie用作信息验证,当浏览网站中每个页面时都会发送给服务器
但是对于网站比较复杂,会更改调整cookie,或者不想要在代码中cookie时,可以使用会话Session对象来持续跟踪会话信息
cookies 接受字典或CookieJar对象
>>> jar = requests.cookies.RequestsCookieJar()
>>> jar.set('tasty_cookie', 'yum', domain='httpbin.org', path='/cookies')
>>> jar.set('gross_cookie', 'blech', domain='httpbin.org', path='/elsewhere')
>>> r = requests.get('http://httpbin.org/cookies', cookies=jar)
为了防止服务器不能及时响应,大部分发到外部服务器的请求端都应该带timeout参数
如果没有显示指定timeout值,Requests一般不会进行超时处理,代码可能会阻塞若干分钟甚至更长时间
超时可分为连接超时,和读取超时
连接超时指客户端实现到远程机器端口的连接(connect())时的超时时间
读取超时指客户端连接到服务器,并发送http请求后,等待服务器发送响应的时间
timeout 该参数设置多少秒后停止等待响应
只针对连接过程有效,与下载响应体的时间无关
可以传递一个元组,分别指定connect和read的timeout
r = requests.get('https://github.com', timeout=5)
r = requests.get('https://github.com', timeout=(3.05, 27))
r = requests.get('https://github.com', timeout=None) #设为None为永远等待
proxies 接受一个字典参数来为任意请求方法配置单个请求
也可以通过环境变量HTTP_PROXY和HTTPS_PROXY来配置代理
proxies = {
"http": "http://10.10.1.10:3128",
"https": "http://10.10.1.10:1080",
}
requests.get("http://example.org", proxies=proxies)
字典键为请求方法,代理 URL 必须包含连接方式
如果代理需要使用HTTP Basic Auth,可以使用http://user:pasword@host语法
proxies = {
"http": "http://user:[email protected]:3128/",
}
要为某个特定的连接方式或者主机设置代理,使用 scheme://hostname 作为 key,它会针对指定的主机和连接方式进行匹配。
proxies = {'http://10.20.1.128': 'http://10.10.1.10:5323'}
verify 该参数用于为HTTPS验证SSL证书,传入CA_BUNDLE文件的路径名,或者可信任CA证书文件的文件加路径
如果verify设为文件夹路径,文件加必须通过OpenSSL提供的c_rehash工具处理
设为False则表示忽略对SSL证书的验证,默认为True
如果认证失败会引发SSLError
verify仅用于主机证书,私有证书,需要传递CA_BUNDLE文件,也可以设置REQUEST_CA_BUNDLE环境变量
cert 指定一个本地证书用于客户端证书,可以时单个文件(包含密钥和证书),或者一个包含两个文件路径的元组
如果指定了错误路径或无效证书会引发SSLError
本地证书的私有key必须时解密状态,目前不支持加密的key
stream 默认情况下,当进行网络请求后,响应体会立即被下载,stream参数可以推迟下载响应体,直到访问Response.content属性
tarball_url = 'https://github.com/kennethreitz/requests/tarball/master'
r = requests.get(tarball_url, stream=True)
此时只有响应头被下载,连接保持打开状态,允许我们为响应头设置条件来获取内容
if int(r.headers['content-length']) < TOO_LONG:
content = r.content
...
requests.utils.add_dict_to_cookiejar(cookiejar, cookie_dict)
将cookie_dict字典中数据添加到类型为CookieJar的cookiejar参数中并返回
request.utils.cookiejar_from_dict(cookie_dict, cookiejar=None,overwrite=True)
将cookie_dict字典中的数据插入到cookiejar对象中,如果overwrite为False将不更改cookiejar参数对象,而是返回一个新对象
request.cookies.RequestsCookieJar(policy=None) 构造一个RequestsCookieJar对象
RequestsCookieJar对象可以按照字典方式操作,并有一些其他的方法
cj.get(name, default=None)
cj.get_dict() 返回字典形式
cj.set(name,value)
cj.update()
cj.clear_session_cookies() 清除会话cookie
会话对象可以为请求保持某些参数,他也会在同一个Session实例发出的所有请求之间保持COOKIE
如果向同一主机发送多个请求,底层TCP连接将会被重用
requests.Session会话对象拥有主要的Requests API的所有方法
>>> s = requests.Session()
>>> s.get('http://httpbin.org/get')
使用上下文管理器,这样就可以确保with代码块退出后即使发生一出场会话也能被关闭
>>> with requests.Session() as s:
>>> s.get('http://httpbin.org/get')
会话可以为请求方法提供缺省数据,任何传递给请求方法的字典都会与设置会话层数据合并,并且方法层的参数可以覆盖会话层的数据
不过就算使用了会话,方法层的参数不会被跨域请求保持
s = requests.Session()
#只会和第一个请求发送方法传递的cookie
r = s.get('http://httpbin.org/cookies', cookies={'from-my': 'browser'})
print(r.text)
# '{"cookies": {"from-my": "browser"}}'
r = s.get('http://httpbin.org/cookies')
print(r.text)
# '{"cookies": {}}'
如果手动为会话添加cookie,则使用Cookie utility函数来操作Session.cookies