Requests的介绍与使用

1、模块说明

requests是使用Apache2 licensed 许可证的HTTP库。

用python编写。

比urllib2模块更简洁。

Request支持HTTP连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自动响应内容的编码,支持国际化的URL和POST数据自动编码。

在python内置模块的基础上进行了高度的封装,从而使得python进行网络请求时,变得人性化,使用Requests可以轻而易举的完成浏览器可有的任何操作。


2、基础入门

1)导入模块
1
import requests
2)发送请求

我们就可以使用该方式使用以下各种方法

1
2
3
4
5
6
1   requests.get(url)                                          # GET请求
2 requests.post(url) # POST请求
3 requests.put(url) # PUT请求
4 requests.delete(url) # DELETE请求
5 requests.head(url) # HEAD请求
6 requests.options(url ) # OPTIONS请求
3)为url传递参数
1
2
>>> url_params = {'key':'value'}       #    字典传递参数,如果值为None的键不会被添加到url中
>>> 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 #以encoding解析返回内容。字符串方式的响应体,会自动根据响应头部的字符编码进行解码。
r.content #以字节形式(二进制)返回。字节方式的响应体,会自动为你解码 gzip 和 deflate 压缩。

r.headers #以字典对象存储服务器响应头,但是这个字典比较特殊,字典键不区分大小写,若键不存在则返回 #None

r.status_code #响应状态码
r.raw #返回原始响应体,也就是 urllib 的 response 对象,使用 r.raw.read()
r.ok # 查看r.ok的布尔值便可以知道是否登陆成功
#*特殊方法*#
r.json() #Requests中内置的JSON解码器,以json形式返回,前提返回的内容确保是json格式的,不然解析出错会抛异常
r.raise_for_status() #失败请求(非200响应)抛出异常
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
 # 1、无参数实例

import requests

ret = requests.get(url)

print(ret.url)
print(ret.text)



# 2、有参数实例

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
# 1、基本POST实例

import requests

payload = {'key1': 'value1', 'key2': 'value2'}
ret = requests.post(url, data=payload)

print(ret.text)


# 2、发送请求头和数据实例

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
# 将 ndarray 数据转换为 json 格式
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()) # 解析返回的json数据

状态异常处理

1
2
3
4
5
6
7
8
9
10
11
import requests

URL = 'http://ip.taobao.com/service/getIpInfo.php' # 淘宝IP地址库API
try:
r = requests.get(URL, params={'ip': '8.8.8.8'}, timeout=1)
r.raise_for_status() # 如果响应状态码不是 200,就主动抛出异常
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')} # 以二进制打开文件
#files = {'file': ('report.jpg', open('/home/lyb/sjzl.mpg', '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'))
# r = requests.get(url, auth=('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'}
# 在Cookie Version 0中规定空格、方括号、圆括号、等于号、逗号、双引号、斜杠、问号、@,冒号,分号等特殊符号都不能作为Cookie的内容。
r = requests.get(url, cookies=cookies)
print(r.json())

会话对象让你能够跨请求保持某些参数,最方便的是在同一个Session实例发出的所有请求之间保持cookies,且这些都是自动处理的,甚是方便。