浅谈 Requests包

一:Requests包是做什么的?

简单地说,是用python处理HTTP的一个包。
它的标志也非常有气质,是一个双蛇杖,按照官方的说法,一条蛇代表client,一条代表server。
当然,它过去的标志是个给人一种很慢的错觉的王八这件事我就没必要说出来了,大家自己找图吧。
总之,是一个非常简单但是强大的HTTP处理包。对于我这种爬虫学习者来说,它和BeautifulSoup,Selenium构成了手工写爬虫的灵魂。
另外两个我会单独介绍。

二: 如何安装Requests?
pip install requests

三: 速查

1. 基本方法
(1) HTTP的方法
方法         说明      支持的 HTTP 协议版本
GET        获取资源           1.0、1.1
POST        传输实体主体         1.0、1.1
PUT        传输文件           1.0、1.1
HEAD          获得报文首部         1.0、1.1
DELETE      删除文件           1.0、1.1
OPTIONS   询问支持的方法           1.1
TRACE       追踪路径           1.1
CONNECT       要求用隧道协议连接代理    1.1
LINK                建立和资源之间的联系        1.0
UNLINE           断开连接关系           1.0

(2)对应的Requests方法

r = requests.get()
r = requests.post()
r = requests.put()
r = requests.delete()
r = requests.head()
r = requests.options()
示例: r = requests.get(“http://www.baidu.com”)

2. 参数

关键字参数    params=
HTTP头部     headers=
表单         data=
文件         file=
cookies              cookies=
重定向处理   allow_redirects=False/True
超时      timeout=
证书验证            verify=False/True
工作流(延迟下载) stream=False/True
事件挂钩    hooks=dict(response=)
response           为从一个请求产生的响应
身份验证            auth=
代理                   proxies=

3. 方法

url         .url
text       .text
编码        .encoding .encoding=
响应内容      .content
json解码器           .json
原始套接字响应   .raw .raw.read() (需要开启stream=True)
检测响应状态码   .status_code
历史响应代码       .history
抛出异常      .raise_for_status()
查看服务器响应头 .headers
        .headers.get()/.headers[]
查看cookie      .cookies
        .cookies[]
身份验证      .auth=
更新          .update()
解析连接字头    .links[]

四: 专题介绍

1. 关于cookie

(1)cookie的文件类型与转化
cookie的文件类型为cookiejar,cookiejar可以和字典相互转化。
关于这样的转化,我们有三个函数可以使用
requests.utils.dict_from_cookiejar(cj)
(同样效果的还有dict(cj)函数和.get_dict()方法)
requests.utils.cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True)
requests.utils.add_dict_to_cookiejar(cj, cookie_dict)

(2)用session类跳过繁复的cookies处理
会话( session)对象(调用 requests.Session() 获取)会持续跟踪会话信息,像 cookie、 header, 甚至包括运行 HTTP 协议的信息,比如 HTTPAdapter(为 HTTP和 HTTPS 的链接会话提供统一接口)
主要分两步
-1- 从Session类中取得实例:session =requests.Session()
-2- 将所有的requests基本方法的requests置换为session.
例如 s = session.post()

2. 响应处理

获取响应 r = requests.get(url)

(1)普通响应内容处理:
显示r.text
查看编码:r.encoding
更改编码:r.encoding=
(2)二进制响应内容
Requests 会自动为你解码 gzip 和 deflate 传输编码的响应数据
r.content
(3)JSON 响应内容
r.json()
(4)原始响应内容(极少使用)
-1- 开启stream=True: r = requests.get(url, stream=True)
-2- r.raw.read(10)
(5)响应状态码
获取状态码:r.status_code
状态码查询对象:r.status_code == requests.codes.ok
抛出异常:r.raise_for_status()
(6)响应头
获取响应头:r.headers
访问响应头字段(大小写不敏感):
r.headers[]
r.headers.get()

3. 请求处理

请求响应 r = requests.get(url)

(1)定制头部
传递一个 dict 给 headers 参数即可:
-1- headers={}
-2- r = requests.get(url, headers=headers)
(2)重定向
默认情况下,除了 HEAD, Requests 会自动处理所有重定向。
通过 allow_redirects 参数控制重定向处理
r = requests.get(url, allow_redirects=False)
r = requests.head(url, allow_redirects=True)
(3)请求历史
r.history
(4)超时
timeout 参数设定的秒数时间之后停止等待响应
r = requests.get(url, timeout=)
timeout 值将会用作 connect 和 read 二者的 timeout。如果要分别制定,就传入一个元组timeout=(3.05, 27)。
建议设为比 3 的倍数略大的一个数值,因为 TCP 数据包重传窗口 (TCP packet retransmission window) 的默认大小是 3
也可以传入一个None,让其永远等待。

4. 定制Post请求

r = requests.post(url, )

(1)发送一些表单形式的数据
data 参数可以接收一个字典,在发出请求时会自动编码为表单形式
r = requests.post(url, data=)
也可以使用json 参数直接传递
r = requests.post(url, json=)
(2)POST一个多部分编码
r = requests.post(url, files=)
示例:
files = {'file': open('report.xls', 'rb')}
r = requests.post(url, files=files)

5. 高级用法

(1)证书验证:
通过控制verify=True/False参数进行SSL证书验证.
(2)流式上传
允许你发送大的数据流或文件而无需先把它们读入内存
with open('') as f:
    requests.post(url, data=f)
(3)流式请求
使用 iter_lines() 对相应进行迭代
示例:
r = requests.get('http://httpbin.org/stream/20', stream=True)
for line in r.iter_lines():
    if line:
        print(json.loads(line))
(4)事件挂钩
设置方式:用hooks参数
可用的钩子:response
钩子的制作:hooks=dict(response=somefunction)
示例:
def print_url(r, *args, **kwargs):
    print(r.url)
requests.get('http://httpbin.org', hooks=dict(response=print_url))
(5)响应头链接字段
直接上示例:
>>> url = 'https://api.github.com/users/kennethreitz/repos?page=1&per_page=10'
>>> r = requests.head(url=url)
>>> r.headers['link']
'<https://api.github.com/users/kennethreitz/repos?page=2&per_page=10>; rel="next", <https://api.github.com/users/kennethreitz/repos?page=6&per_page=10>; rel="last"'
>>> r.links["next"]
{'url': 'https://api.github.com/users/kennethreitz/repos?page=2&per_page=10', 'rel': 'next'}

>>> r.links["last"]
{'url': 'https://api.github.com/users/kennethreitz/repos?page=7&per_page=10', 'rel': 'last'}

6. requests的一些特性:

(1)从字典参数中移除一个值
有时你会想省略字典参数中一些会话层的键。要做到这一点,你只需简单地在方法层参数中将那个键的值设置为 None ,那个键就会被自动省略掉。
(2)流式操作的建议
强烈建议用二进制模式(binary mode)打开文件。这是因为 requests 可能会为你提供header 中的 Content-Length,在这种情况下该值会被设为文件的字节数。如果你用文本模式打开文件,就可能碰到错误。
(3)阻塞和非阻塞
使用默认的传输适配器,Requests 不提供任何形式的非阻塞 IO。 Response.content 属性会阻塞,直到整个响应下载完成。如果你需要更多精细控制,该库的数据流功能(见 流式请求) 允许你每次接受少量的一部分响应,不过这些调用依然是阻塞式的。
如果你对于阻塞式 IO 有所顾虑,还有很多项目可以供你使用,它们结合了 Requests 和 Python 的某个异步框架。典型的优秀例子是 grequests 和 requests-futures。
(4)保持活动状态(持久连接)
归功于 urllib3,同一会话内的持久连接是完全自动处理的!同一会话内你发出的任何请求都会自动复用恰当的连接!
(5)证书
如果系统中装了 certifi 包,Requests 会试图使用它里边的 证书。这样用户就可以在不修改代码的情况下更新他们的可信任证书。

参考资料:http://www.python-requests.org/en/master/

浅谈 Requests包的更多相关文章

  1. 浅谈requests库

    本文为博客园ShyButHandsome的原创作品,转载请注明出处 右边有目录,方便快速浏览 安装 pip install requests # 是requests而不是request(有s的) re ...

  2. Python浅谈requests三方库

    requests 三方库用于获取URL资源 1.GET请求访问一个页面 import requests r = requests.get('https://www.cnblogs.com/xqxacm ...

  3. 浅谈JavaScript--闭包

    闭包的概念 由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数". 变量的作用域 要理解闭包,首先必须理解J ...

  4. 【ASP.NET MVC系列】浅谈ASP.NET MVC 路由

    ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...

  5. $.ajax()方法详解 ajax之async属性 【原创】详细案例解剖——浅谈Redis缓存的常用5种方式(String,Hash,List,set,SetSorted )

    $.ajax()方法详解   jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为Str ...

  6. 浅谈HTTP中GET、POST用法以及它们的区别

    浅谈HTTP中GET.POST用法以及它们的区别 HTTP定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE.URL全称是资源描述符.我们可以这样认为: 一 ...

  7. 浅谈 Fragment 生命周期

    版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Fragment 文中如有纰漏,欢迎大家留言指出. Fragment 是在 Android 3.0 中 ...

  8. 浅谈 LayoutInflater

    浅谈 LayoutInflater 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/View 文中如有纰漏,欢迎大家留言指出. 在 Android 的 ...

  9. 浅谈SQL注入风险 - 一个Login拿下Server

    前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...

随机推荐

  1. java 解决时间相减问题

    比如 Date currentTime ="2011-06-20 9:23:50"; Date endTime="2011-06-21 10:33:56"; 要 ...

  2. 回归-LDA与QDA

    作者:桂. 时间:2017-05-23  06:37:31 链接:http://www.cnblogs.com/xingshansi/p/6892317.html 前言 仍然是python库函数sci ...

  3. 线程机制、CLR线程池以及应用程序域

    最近在总结多线程.CLR线程池以及TPL编程实践,重读一遍CLR via C#,比刚上班的时候收获还是很大的.还得要多读书,读好书,同时要多总结,多实践,把技术研究透,使用好. 话不多说,直接上博文吧 ...

  4. 写markdown博客如何截图并快速上传到图床——记一个工具插件的实现

    1. 背景 写博客有一个自己的图床是不错的选择,如果不借助工具,在markdown博客中添加图片的步骤如下: 截取图片,保存到本地(得来回点对话框,选择保存路径,选择文件类型,输入文件名). 上传到图 ...

  5. Android学习探索之App多渠道打包及动态添加修改资源属性

    前言: 关于Android渠道打包是一个比较老的话题,今天主要记录总结一下多渠道打包以及如果动态配置修改一些资源属性.今天以公司实际需求为例进行演示,由于项目复用很多公共的业务组件,而且业务组件之间的 ...

  6. Vue.js高仿饿了么WebApp

    介绍 学习Vue.js也有一阵子了,为了加深对Vue的理解及运用,做了一个小项目.这是一个高仿饿了么外卖WebApp,现已完成商品预览.商品详情.商家预览.添加购物.查看评论等功能. 部分截图 项目预 ...

  7. JavaScript 扫描枪使用(一)

    JavaScript 扫描枪应用(一)com.js为主要的代码实现,test.html文件为测试的页面,其中包括了com.js文件中方法的调用.以下为测试成功代码:com.js //com.js /* ...

  8. 架构师之路--应用架构的选型和dubbo

    这个选型主要决定于系统复杂度.先回顾一下. 1>单一应用架构:对于一个流量很小的网站来说,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本.之前在上家公司做过一个微信公众号的开发就是基 ...

  9. java基础(十五章)

    一.字符串类String 1.String是一个类,位于java.lang包中 2.创建一个字符串对象的2种方式: String 变量名="值"; String 对象名=new S ...

  10. react-native学习(RN)--之Window环境下搭建环境配置

    react-native以后会更火的,自从2015年facebook开源了Android 一.安装java 二.安装Android Studio 三.安装react-native需要的Android ...