技术文章

Requests库的基础操作

目录:

1. 3 .1.1 发送请求

2. 3 .1.2 传递URL参数3. 3 .1.3 响应内容

4. 3 .1.4 JSON响应内容5. 3 .1.5 定制请求头

6. 3 .1.6 响应状态码

7. 3 .1.7 响应头

8. 3 .1.8 Cookie

9. 3 .1.9 错误与异常

所有操作都必须先导入requests模块:

    Requests库的基础操作

3.1.1 发送请求  
发送get请求

  Requests库的基础操作

requests.get方法会返回一个Response的对象r,就是网站的响应,我们想要获取的数据就包含在这个  对象中

发送post请求

post方法会返回一个Response的对象r,就是网站的响应,我们想要获取的数据就包含在这个对象中

         Requests库的基础操作

其它方法的请求

其它方法的请求格式也相同

         Requests库的基础操作

3.1.2 传递URL参数

在get请求中传递参数

基本格式

              Requests库的基础操作

在post请求中传递参数

基本格式

        

         Requests库的基础操作

            Requests库的基础操作
Requests库的基础操作

 

get方法的传递数据的参数为params,post方法传递数据的参数为data

3.1.3 响应内容

以再次以 GitHub 时间线为例,r.text就是以文本方式读取响应正文

              Requests库的基础操作

还可以获取响应正文的编码,并改变其编码

         Requests库的基础操作

还可以用r.content,以二进制方式读取响应正文

              Requests库的基础操作

r.text 存的是r.content 编码后的字符串

r.content中间存的是字节码

一般来说  r.text直接用比较方便,返回的是字符串,但是有时候会解析不正常,导致返回的是一堆乱码。这时需要用r.content.decode(‘utf-8’),使其正常显示。   总的来说.text是现成的字符串,.content还要编码,但是.text不是所有时候显示都正常(需要 用.content.decode()进行手动编码)

3.1.4 JSON响应内容

当返回的响应正文是一个JSON数据,可以使用Requests内置的JSON解码器进行处理

              Requests库的基础操作

如果 JSON 解码失败, r.json() 就会抛出一个异常。例如,响应内容是 401 (Unauthorized),尝试访问r.json() 将会抛出 ValueError: No JSON object could be decoded 异常

需要注意的是,成功调用 r.json() 并不意味着响应的成功。有的服务器会在失败的响应中包含一个JSON 对象(比如 HTTP 500 的错误细节)。这种 JSON 会被解码返回。要检查请求是否成功,请使用 r.raise_for_status() 或者检查 r.status_code 是否和你的期望相同

3.1.5 定制请求头

            想为请求添加 HTTP 头部,只要简单地传递一个 dict 给 headers 参数就可以了。例如,在前一个示例中我们没有指定 content-type 

Requests库的基础操作

注意: 定制 header 的优先级低于某些特定的信息源,例如:

如果在 .netrc 中设置了用户认证信息,使用 headers= 设置的授权就不会生效。而如果设置了

auth= 参数, .netrc 的设置就无效了。

如果被重定向到别的主机,授权 header 就会被删除。代理授权 header 会被 URL 中提供的代理身份覆盖掉。

在我们能判断内容长度的情况下,header 的 Content-Length 会被改写。

更进一步讲,Requests 不会基于定制  header 的具体情况改变自己的行为。只不过在最后的请求中,所有的 header 信息都会被传递进去

注意: 所有的 header 值必须是 string、bytestring 或者 unicode。尽管传递 unicode header 也是允许的,但不建议这样做

3.1.6 响应状态码

可以通过r.status_code来获取响应状态码  

         Requests库的基础操作

Requests还附带了一个内置的状态码查询对象

              Requests库的基础操作

如果发送了一个错误请求(一个 4XX 客户端错误,或者 5XX 服务器错误响应),我们可以通过

Response.raise_for_status() 来抛出异常

              Requests库的基础操作

所有状态码见底部附件: 所 有状态码

3.1.7 响应头

一个 Python 字典形式展示的服务器响应头

         Requests库的基础操作

我们可以使用任意大写形式来访问这些响应头字段

              Requests库的基础操作

还有一个特殊点,那就是服务器可以多次接受同一 header,每次都使用不同的值。但 Requests

会将它们合并,这样它们就可以用一个映射来表示出来,参见 RFC 7230:   A recipient MAY combine multiple header fields with the same field name into one "field- name: field-value" pair, without changing the semantics of the message, by appending each subsequent field value to the combined field value in order, separated by a comma.

3.1.8 Cookie

什么是cookie

Cookie 是一些数据, 存储于你电脑上的文本文件中。

当 web 服务器向浏览器发送 web 页面时,在连接关闭后,服务端不会记录用户的信息。

Cookie 的作用就是用于解决 "如何记录客户端的用户信息":

当用户访问 web 页面时,他的名字可以记录在 cookie 中。

在用户下一次访问该页面时,可以在 cookie 中读取用户访问记录。

Cookie 以名/值对形式存储,如下所示:

         Requests库的基础操作

获取响应的cookie

            在requests模块中,cookie是以字典的形式存储通过r.cookies[变量名]可以访问cookie中的变量值 

Requests库的基础操作

可以对cookie进行遍历

         Requests库的基础操作

发送cookie到服务器

要想发送你的cookies到服务器,可以使用 cookies 参数

      Requests库的基础操作
Requests库的基础操作

 

Cookie 的返回对象为 RequestsCookieJar,它的行为和字典类似,但接口更为完整,适合跨域名跨路径使用。你还可以把 Cookie Jar 传到 Requests

3.1.9 错误与异常

遇到网络问题(如:DNS 查询失败、拒绝连接等)时,Requests 会抛出一个 ConnectionError 异常。如果 HTTP 请求返回了不成功的状态码, Response.raise_for_status() 会抛出一个 HTTPError 异常。若请求超时,则抛出一个 Timeout 异常。

若请求超过了设定的最大重定向次数,则会抛出一个 TooManyRedirects 异常。所有Requests显式抛出的异常都继承自 requests.exceptions.RequestException 。