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请求

广告python爬虫学习-人工智能大数据统计分析×

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

发送post请求

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

广告零基础轻松入门-掌握人工智能Python编程×

其它方法的请求

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

广告python爬虫,达内0基础入学,120天变身Python人...×

3.1.2 传递URL参数

在get请求中传递参数

基本格式

广告一份python爬虫电子书×

在post请求中传递参数

基本格式

广告电脑基础入门及更基本的操作第一章×

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

3.1.3 响应内容

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

广告复古热血正版传奇,高爆技能书100%靠合成!立即回收上万!×

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

广告女领导夜里喝醉误将小偷当丈夫,早上醒来才发现不对,瞬间崩溃×

还可以用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来获取响应状态码

广告别再玩假传奇了!这款传奇爆率9.8,你找到充值入口算我输!×

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

广告研究生穿越唐朝考科举睡着,皇帝震怒,就这?也太简单了!×

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

Response.raise_for_status() 来抛出异常

广告成都村民祖坟冒青烟,专家赶到后立刻让封锁,背后原因×

3.1.7 响应头

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

广告复古热血正版传奇,高爆技能书100%靠合成!立即回收上万!×

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

广告女领导夜里喝醉误将小偷当丈夫,早上醒来才发现不对,瞬间崩溃×

还有一个特殊点,那就是服务器可以多次接受同一 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中的变量值

广告别再玩假传奇了!这款传奇爆率9.8,你找到充值入口算我输!×

可以对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 。