浅谈 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. Python爬虫学习之获取网页源码

    偶然的机会,在知乎上看到一个有关爬虫的话题<利用爬虫技术能做到哪些很酷很有趣很有用的事情?>,因为强烈的好奇心和觉得会写爬虫是一件高大上的事情,所以就对爬虫产生了兴趣. 关于网络爬虫的定义 ...

  2. H5与客户端联调

    进行H5移动端开发时,我们可以使用谷歌浏览器的设备工具栏进行,此方法实时方便快速,但这也是有限的,当我们需要在特定机型特定系统或者在webview中调试时,这种方法就显得很吃力了. 安卓: 一.与安卓 ...

  3. 第 8 章 MySQL 数据库 Query 的优化

      前言: 在之前“影响 MySQL 应用系统性能的相关因素”一章中我们就已经分析过了Query语句对数据库性能的影响非常大,所以本章将专门针对 MySQL 的 Query 语句的优化进行相应的分析. ...

  4. 开涛spring3(6.4) - AOP 之 6.4 基于@AspectJ的AOP

    Spring除了支持Schema方式配置AOP,还支持注解方式:使用@AspectJ风格的切面声明. 6.4.1  启用对@AspectJ的支持 Spring默认不支持@AspectJ风格的切面声明, ...

  5. mac系统下给文件夹加密方法

    电脑里我们往往会有许多隐私的文件,不希望被别人看到,在过去的Windows电脑里,我们习惯性的会在文件夹中将该文件隐藏,但是这个隐藏是不安全的,遇到稍微会点电脑技术的人就可以给你解开,安全性不高,ma ...

  6. CoreCLR源码探索(六) NullReferenceException是如何发生的

    NullReferenceException可能是.Net程序员遇到最多的例外了, 这个例外发生的如此频繁, 以至于人们付出了巨大的努力来使用各种特性和约束试图防止它发生, 但时至今日它仍然让很多程序 ...

  7. Python正则表达式完全指南(上)

    正则表达式处理文本有如疾风扫秋叶,绝大部分编程语言都内置支持正则表达式,它应用在诸如表单验证.文本提取.替换等场景.爬虫系统更是离不开正则表达式,用好正则表达式往往能收到事半功倍的效果. 介绍正则表达 ...

  8. 【Netty】codec框架

    一.前言 前面已经学习完了Netty框架中的主要组件,接着学习codec框架. 二.codec框架 每个网络应用程序必须定义如何将在对等体之间传输的原始字节解析并转换为目标程序的数据格式,这种转换逻辑 ...

  9. Workout Wednesday Redux (2017 Week 3)

    I had started a "52 Vis" initiative back in 2016 to encourage folks to get practice making ...

  10. Java中的系统时间

    System.currentTimeMillis()产生一个当前的毫秒,这个毫秒其实就是自1970年1月1日0时起的毫秒数,Date()其实就是相当于Date(System.currentTimeMi ...