浅谈 Requests包
浅谈 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包的更多相关文章
- 浅谈requests库
本文为博客园ShyButHandsome的原创作品,转载请注明出处 右边有目录,方便快速浏览 安装 pip install requests # 是requests而不是request(有s的) re ...
- Python浅谈requests三方库
requests 三方库用于获取URL资源 1.GET请求访问一个页面 import requests r = requests.get('https://www.cnblogs.com/xqxacm ...
- 浅谈JavaScript--闭包
闭包的概念 由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数". 变量的作用域 要理解闭包,首先必须理解J ...
- 【ASP.NET MVC系列】浅谈ASP.NET MVC 路由
ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...
- $.ajax()方法详解 ajax之async属性 【原创】详细案例解剖——浅谈Redis缓存的常用5种方式(String,Hash,List,set,SetSorted )
$.ajax()方法详解 jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为Str ...
- 浅谈HTTP中GET、POST用法以及它们的区别
浅谈HTTP中GET.POST用法以及它们的区别 HTTP定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE.URL全称是资源描述符.我们可以这样认为: 一 ...
- 浅谈 Fragment 生命周期
版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Fragment 文中如有纰漏,欢迎大家留言指出. Fragment 是在 Android 3.0 中 ...
- 浅谈 LayoutInflater
浅谈 LayoutInflater 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/View 文中如有纰漏,欢迎大家留言指出. 在 Android 的 ...
- 浅谈SQL注入风险 - 一个Login拿下Server
前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...
随机推荐
- Unity之2D Sprite Outline外轮廓效果
操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Unity5.3.8f1 Unity提供了2D Object Sprite对象,但是没有提供外轮廓Outline效果的支持 ...
- 修改别人写的利用AOP实现日志监控的问题
原文链接 http://blog.csdn.net/jaune161/article/details/51476138 想法 看到原文博主写的这篇文章,我感觉写的很好,可以在我们的项目中使用AOP来监 ...
- git常用命令记录
配置本地仓库 git config --global user.name.git config --global user.email 查看配置详情 git config -l 初始仓库 git in ...
- How to get the file in a resource folder
In a Maven project, we may often struggle to get a certain file (e.g. json file or sql file). Here i ...
- BattleInfo
private Dictionary<string, UILabel> mLabels; private Dictionary<string,UISprite> mSprite ...
- [转载]OpenStack OVS GRE/VXLAN网络
学习或者使用OpenStack普遍有这样的现象:50%的时间花费在了网络部分:30%的时间花费在了存储方面:20%的时间花费在了计算方面.OpenStack网络是不得不逾越的鸿沟,接下来我们一起尝 ...
- 小程序API录音后Silk格式转码MP3
问题 客户端使用小程序,需要录音功能然后到后台页面播放,由于微信提供的录音API压缩后的格式为 .silk格式的,但是这个格式其他播放器都是播放不了的,更何况html页面的audio标签更是不可能播放 ...
- PF2.1版本总结,在设计过程中遇到的问题以及技术分享
在距离上一次的版本发布已经过去4个月的时间,因为个人的能力以及时间有限,所以这次的版本会推迟这么久.可是无论怎样,PF2.1带着自身的完善总算不负所望推出.在这次的版本调整中让我深有体会到了程序设计中 ...
- mybatis xml配置文件要点说明
mapper映射方式: 1 一一具体列举的方式 2扫描package 如: <mappers> <!-- 告知映射文件方式1,一个一个的配置 <mapper resource= ...
- 10分钟学会JAVA注解(annotation)
(原) 先认识注解(Annotation) 定义类用class,定义接口用interface,定义注解用@interface 如public @interface AnnotationTest{} 所 ...