一: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。