1、模块说明
requests是使用Apache2 licensed 许可证的HTTP库。
用python编写。
比urllib2模块更简洁。
Request支持HTTP连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自动响应内容的编码,支持国际化的URL和POST数据自动编码。
在python内置模块的基础上进行了高度的封装,从而使得python进行网络请求时,变得人性化,使用Requests可以轻而易举的完成浏览器可有的任何操作。
2、基础入门
1)导入模块
2)发送请求
我们就可以使用该方式使用以下各种方法
1 2 3 4 5 6
| 1 requests.get(url) 2 requests.post(url) 3 requests.put(url) 4 requests.delete(url) 5 requests.head(url) 6 requests.options(url )
|
3)为url传递参数
1 2
| >>> url_params = {'key':'value'} >>> r = requests.get(url, params=url_params)
|
4)响应的内容
1 2 3 4 5 6 7 8 9 10 11 12 13
| r.encoding r.encoding = 'utf-8' r.text r.content
r.headers
r.status_code r.raw r.ok r.json() r.raise_for_status()
|
5)定制头和cookie信息
1 2 3 4 5 6 7 8 9
| header = {'user-agent': 'my-app/0.0.1''} cookie = {'key':'value'} r = requests.get/post('your url',headers=header,cookies=cookie) data = {'some': 'data'} headers = {'content-type': 'application/json', 'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0'} r = requests.post('https://api.github.com/some/endpoint', data=data, headers=headers) print(r.text)
|
6)响应状态码
使用requests方法后,会返回一个response对象,其存储了服务器响应的内容,如上实例中已经提到的 r.text、r.status_code……
获取文本方式的响应体实例:当你访问 r.text 之时,会使用其响应的文本编码进行解码,并且你可以修改其编码让 r.text 使用自定义的编码进行解码。
1 2 3 4
| 1 r = requests.get('http://www.itwhy.org') 2 print(r.text, '\n{}\n'.format('*'*79), r.encoding) 3 r.encoding = 'GBK' 4 print(r.text, '\n{}\n'.format('*'*79), r.encoding)
|
7)响应
1 2 3 4
| r.headers #返回字典类型,头信息 r.requests.headers #返回发送到服务器的头信息 r.cookies #返回cookie r.history #返回重定向信息,当然可以在请求是加上allow_redirects = false 阻止重定向
|
8)超时
1
| r = requests.get('url',timeout=1)
|
9)会话对象,能够跨请求保持某些参数
1 2 3 4 5
| s = requests.Session() s.auth = ('auth','passwd') s.headers = {'key':'value'} r = s.get('url') r1 = s.get('url1')
|
10)代理
1 2
| proxies = {'http':'ip1','https':'ip2' } requests.get('url',proxies=proxies)
|
3、示例代码
GET请求
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| import requests ret = requests.get(url) print(ret.url) print(ret.text)
import requests payload = {'key1': 'value1', 'key2': 'value2'} ret = requests.get(url, params=payload) print(ret.url) print(ret.text)
|
POST请求
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| import requests payload = {'key1': 'value1', 'key2': 'value2'} ret = requests.post(url, data=payload) print(ret.text)
import requests import json payload = {'some': 'data'} headers = {'content-type': 'application/json'} ret = requests.post(url, data=json.dumps(payload), headers=headers) print(ret.text) print(ret.cookies)
|
json请求:
1 2 3 4 5 6 7 8 9 10 11 12 13
| import requests import json import numpy as np
arr = np.random.randint(0, 10, (3, 5)) arr_list = arr.tolist() dic = {} dic['data'] = arr_list arr_json = json.dumps(dic)
r = requests.post(url, data=arr_json) print(r.json())
|
状态异常处理
1 2 3 4 5 6 7 8 9 10 11
| import requests
URL = 'http://ip.taobao.com/service/getIpInfo.php' try: r = requests.get(URL, params={'ip': '8.8.8.8'}, timeout=1) r.raise_for_status() except requests.RequestException as e: print(e) else: result = r.json() print(type(result), result, sep='\n')
|
上传文件
使用requests模块,也可以上传文件,文件的类型会自动进行处理:
1 2 3 4 5 6 7
| import requests files = {'file': open('test.jpg', 'rb')}
r = requests.post(url, file=files) print(r.text)
|
要上传多个文件时:
1 2 3 4 5 6 7 8 9 10 11
| import requests import os path = '' dirnames = os.listdir(path) dic = {} for dir in dirnames: dic[dir] = open(path+'/'+dir, 'rb') r = requests.post(url, file=dic) print(r.text)
|
身份验证
基本身份认证(HTTP Basic Auth)
1 2 3 4 5 6
| import requests from requests.auth import HTTPBasicAuth r = requests.get(url, auth=HTTPBasicAuth('user', 'passwd'))
print(r.json())
|
另一种非常流行的HTTP身份认证形式是摘要式身份认证,Requests对它的支持也是开箱即可用的:
1
| requests.get(URL, auth=HTTPDigestAuth('user', 'pass')
|
Cookies与会话对象
如果某个响应中包含一些Cookie,你可以快速访问它们:
1 2 3 4 5
| import requests r = requests.get('http://www.google.com.hk/') print(r.cookies['NID']) print(tuple(r.cookies))
|
要想发送你的cookies到服务器,可以使用 cookies 参数:
1 2 3 4 5 6 7
| import requests url = 'http://httpbin.org/cookies' cookies = {'testCookies_1': 'Hello_Python3', 'testCookies_2': 'Hello_Requests'}
r = requests.get(url, cookies=cookies) print(r.json())
|
会话对象让你能够跨请求保持某些参数,最方便的是在同一个Session实例发出的所有请求之间保持cookies,且这些都是自动处理的,甚是方便。