李成笔记网

专注域名、站长SEO知识分享与实战技巧

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模块:


3.1.1 发送请求


发送get请求


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


发送post请求

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


其它方法的请求

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


3.1.2 传递URL参数


在get请求中传递参数

基本格式


在post请求中传递参数

基本格式


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


3.1.3 响应内容


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


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


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


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解码器进行处理


如果 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


注意: 定制 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还附带了一个内置的状态码查询对象


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

Response.raise_for_status() 来抛出异常


3.1.7 响应头


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

?

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


还有一个特殊点,那就是服务器可以多次接受同一 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 以名/值对形式存储,如下所示:


获取响应的cookie

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


可以对cookie进行遍历


发送cookie到服务器

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


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


3.1.9 错误与异常

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


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

RequestException 。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言