requests 安装
- pip install requests
- easy_install requests
requests库基础方法
requests库提供了http所有的基本请求方式
1 | requests.request() : |
GET请求
最基本的GET请求可直接使用get方法,使用
r.url
打印出URL地址1
2
3
4>>> import requests
>>> r = requests.get('http://www.baidu.com')
>>> print r.url
http://www.baidu.com/传递URL参数
requests允许使用parmas
关键字参数,以一个字符串字典来提供这些参数demo:
1
2
3
4
5>>> import requests
>>> payload = {'key_1':'value1','key_2':'value2'}
>>> r = requests.get('http://www.baidu.com',params = payload)
>>> print r.url
http://www.baidu.com/?key_1=value1&key_2=value2注意:字典里值为none的键不会被添加到url的查询字典中
或者可以将一个
列表
作为值传入:1
2
3
4
5>>> import requests
>>> payload = {'key_1':'value1','key_2':['value2-1','value2-2']}
>>> r = requests.get('http://www.baidu.com',params = payload)
>>> print r.url
http://www.baidu.com/?key_1=value1&key_2=value2-1&key_2=value2-2
响应内容
普通响应
使用r.text
可以读取服务器响应内容。1
2
3
4>>> import requests
>>> r = requests.get('http://www.baidu.com')
>>> r.text
u'<!DOCTYPE html>\r\n<!--STATUS OK--><html> <head><meta http-equiv...
r.encoding
设置编码1
2
3>>> r.encoding
'utf-8'
>>> r.encoding = 'ISO-8859-1'
二进制响应
以字节的方式访问请求响应体,对于非文本请求:1
2>>> r.content
b'[{"repository":{"open_issues":0,"url":"https://...
JSON 响应内容
Requests 中有一个内置的 JSON 解码器,可处理 JSON 数据:1
2
3
4
5>>> import requests
>>> r = requests.get('https://www.baidu.com')
>>> r.json()
[{u'repository': {u'open_issues': 0, u'url': 'https://...
使用 r.raise_for_status() 或者检查 r.status_code 检查请求是否成功
原始响应内容
如果向获取来自服务器的原始套接字响应,可以使用r.raw
。不过需要在初始请求中设置stream=True
demo:1
2
3
4
5
6>>> import requests
>>> r = requests.get('http://www.baidu.com',stream=True)
>>> print r.raw
<urllib3.response.HTTPResponse object at 0x03EA4F90>
>>> r.raw.read(10)
'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03'
一般情况下,以下面的模式将文本流保存到文件:1
2
3with open(filename, 'wb') as fd:
for chunk in r.iter_content(chunk_size):
fd.write(chunk)
定制请求头
如果想添加headers,可以传headers
参数1
2
3
4
5
6>>> import requests
>>> payload = {'key_1':'value1','key_2':'value1'}
>>> headers = {'content-type':'application/json'}
>>> r = requests.get("http://www.baidu.com", params=payload, headers=headers)
>>> print r.url
http://www.baidu.com/?key_1=value1&key_2=value1
注意: 定制 header 的优先级低于某些特定的信息源,例如:
- 如果在
.netrc
中设置了用户认证信息,使用 headers= 设置的授权就不会生效。而如果设置了 auth= 参数,.netrc
的设置就无效了。 - 如果被重定向到别的主机,授权 header 就会被删除。
- 代理授权 header 会被 URL 中提供的代理身份覆盖掉。
- 在能判断内容长度的情况下,header 的 Content-Length 会被改写。
- 所有的 header 值必须是 string、bytestring 或者 unicode
POST请求
最基本的传参方法可以利用data参数1
2
3
4
5import requests
payload = {'key_1': 'value_1', 'key_2': 'value_2'}
r = requests.post("http://www.baidu.com", data=payload)
print r.text