一:requests优点原理
requests发送请求优点:
1. 无需手动为url添加查询字符串
2.不需要对post请求进行表单编码
3.keep-alive和HTTP连接池的功能是完全自动化的
4.带持久Cookie的会话
5.浏览器式的ssl认证
6.自动内容解码
7.基本、摘要式的身份认证
8.自动解压
9.unicode相应体
10.https代理支持
11.文件分块上传
12.流下载
13.连接超时
14.分块请求
15.支持。netrc
原理:
requests内部封装urllib3
request上手:
1.发送请求:
request有简单的api意味着所有http请求类型都是显而易见。post、put、delete、head、options
例如:http://httpbin.org/post
2.传递url参数:
requests 允许视同params关键字参数,以一个字符串字典来提供参数
如:payload={'key1':"value1", "key2":"value2"}
r = requests.get("http://httpbin.org/get", params=payload)
打印的url会被正确编码
3.响应内容:
1.文本相应内容 2.二进制相应内容 3.json响应内容 4.原始相应内容
1.text 2. content 3.json() 4.raw (确定设置了stram=true)
4.定制请求头:
Requests不会给予定制header的具体情况改变自己的行为。只不过在最后的请求中,所有的header信息会被传递。
所有的header值必须是string、bytesting或者unicode。尽管传递unicode header也是允许的,但不建议这样使用。
5.更加复杂的post请求:
1.自动编码表单格式:
如: r = requests.post('https://httpbin.org/post', data=payload)
自动编码为表单格式:
{
““””
”form“ : {
“key1”:"value1"
"key2":"value2"
}
”“””
}
或是元祖类型
>>> payload = (('key1', 'value1'), ('key1', 'value2'))
>>> r = requests.post('http://httpbin.org/post', data=payload)
>>> print(r.text)
{
...
"form": {
"key1": [
"value1",
"value2"
]
},
...
}
很多时候你想要发送的数据并非编码为表单形式的。如果你传递一个 string
而不是一个 dict
,那么数据会被直接发布出去。
例如,Github API v3 接受编码为 JSON 的 POST/PATCH 数据:
>>> import json
>>> url = 'https://api.github.com/some/endpoint'
>>> payload = {'some': 'data'}
>>> r = requests.post(url, data=json.dumps(payload))
此处除了可以自行对 dict
进行编码,你还可以使用 json
参数直接传递,然后它就会被自动编码。这是 2.4.2 版的新加功能:
>>> url = 'https://api.github.com/some/endpoint'
>>> payload = {'some': 'data'}
>>> r = requests.post(url, json=payload)
6.POST一个多部分编码(Multipart-Encoded)的文件
Requests 使得上传多部分编码文件变得很简单:
>>> url = 'http://httpbin.org/post'
>>> files = {'file': open('report.xls', 'rb')}
>>> r = requests.post(url, files=files)
>>> r.text
{
...
"files": {
"file": "<censored...binary...data>"
},
...
}
你可以显式地设置文件名,文件类型和请求头:
>>> 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)
>>> r.text
{
...
"files": {
"file": "<censored...binary...data>"
},
...
}
如果你想,你也可以发送作为文件来接收的字符串:
>>> url = 'http://httpbin.org/post'
>>> files = {'file': ('report.csv', 'some,data,to,send\nanother,row,to,send\n')}
>>> r = requests.post(url, files=files)
>>> r.text
{
...
"files": {
"file": "some,data,to,send\\nanother,row,to,send\\n"
},
...
}
7.响应状态码
我们可以检测响应状态码:
>>> r = requests.get('http://httpbin.org/get')
>>> r.status_code
200
为方便引用,Requests还附带了一个内置的状态码查询对象:
>>> r.status_code == requests.codes.ok
True
如果发送了一个错误请求(一个 4XX 客户端错误,或者 5XX 服务器错误响应),我们可以通过 Response.raise_for_status()
来抛出异常:
>>> bad_r = requests.get('http://httpbin.org/status/404')
>>> bad_r.status_code
404
>>> bad_r.raise_for_status()
Traceback (most recent call last):
File "requests/models.py", line 832, in raise_for_status
raise http_error
requests.exceptions.HTTPError: 404 Client Error
但是,由于我们的例子中 r
的 status_code
是 200
,当我们调用 raise_for_status()
时,得到的是:
>>> r.raise_for_status()
None
8.响应头
响应头大小写不敏感,语法匹配
r.headers['content-type']获取响应头中的content-type信息
9.cookie
1.响应中包含一些cookie,可以快速访问使用,发送你的cookies到服务器,可以使用cookies参数
url = 'http://example.com/some/cookie/setting/url'
>>> r = requests.get(url)
>>> r.cookies['example_cookie_name']
url = 'http://httpbin.org/cookies'
cookies = dict(cookies_are = 'working')
r = requests.get(url, cookies=cookies)
2.cookie的返回对象为RequestsCookieJar ,它的行为和字典类似,但界面更为完整,适跨域名跨路径使用。你还可以吧Cookie Jar 传到Request中:
>>> jar = requests.cookies.RequestsCookieJar()
>>> jar.set('tasty_cookie', 'yum', domain='httpbin.org', path='/cookies')
>>> jar.set('gross_cookie', 'blech', domain='httpbin.org', path='/elsewhere')
>>> url = 'http://httpbin.org/cookies'
>>> r = requests.get(url, cookies=jar)
>>> r.text
'{"cookies": {"tasty_cookie": "yum"}}'
重定向与请求历史¶:
Response.history 是一个 Response 对象的列表, 为了完成请求而创建了这些对象。这个对象按照从老到最近的请求进行排序。
使用GET、OPTION/POST/PUT/PATCH或者DELETE, 那么你可以通过allow_redirects参数急用重定向处理:
r = requests.get('http://github.com', allow_redirects = Flase)
r.status_code
输出301错误,域名错误,没有重定向到下一个网址
r.history
输出为空列表
使用HEAD,你也可以启用重定向:
r = requests.head('http://github.com', allow_redirets = True)
r.url
输出: 'http://github.com/'
r.history
[<Response[301]>]
超时:
告诉requests在经过以timeout参数设定的秒数时间之后停止等待响应。进本上所有的生产代码都应该使用这一参数。如果不是用, 你的程序可能永远失去响应:
>>> requests.get('http://github.com', timeout=0.001)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
requests.exceptions.Timeout: HTTPConnectionPool(host='github.com', port=80): Request timed out. (timeout=0.001)
如图控制台会显示Traceback (most recent call last) 回溯(最近一次调用)
也就是说,在timeout秒内没有从基础套接字接收到任何字节的数据时
错误与异常:
遇到网络问题(如: DNS查询失败、拒绝连接等)时, Requests会抛出一个ConnectionError异常。
如果HTTP请求返回了不成功的状态码,Requests.raise_for_status()会抛出一个HTTPError异常。
若请求超时, 则抛出一个Timeout异常。
若请求超过了设定的最大重定向次数, 则会抛出一个TooManyRedirects异常。
所有Requests显示抛出的一行都继承自requests.exceptions.RequestException。