浅谈 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有注入,随便都 ...
随机推荐
- VR全景智慧城市
随着虚拟现实产业的发展,我国对虚拟现实产业也越来越重视了.我国虚拟现实VR市场增长速度很快,市场活跃性很高,很多人都看好我国的虚拟现实VR市场,而且未来国内虚拟现实VR市场的销量还将有更大的增长.据赛 ...
- 关于jQuery插件imgAreaSelect基础讲解
关于ImgAreaSelect, 是一jQuery插件,它支持用户通过鼠标拖曳选择图片的一部分,如图片拖曳.图片编辑等~~来具体看一下 1.先下载imgAreaSelect插件 下载地址: 英文:h ...
- 终端的CTRL+S 解说
在很多类Unix 的系统上,Ctrl-S 都有特殊的含义:它会"冻结"终端(它曾 经被用来暂停快速滚动).因为"保存"一般也是用这个快捷键,所以经常 会有人不假 ...
- 关于QT按键信号槽的总结(原创)
QT界面按钮一般是必填的: 每个按钮都要 Go to slot 下面有几个都是常用的,先说一下 clicked:pressed:releaed的区别 字面意思看:click是点击一下,pressed是 ...
- 关于EF中直接执行sql语句的参数化问题
某天 , 在review项目中代码的时候, 发现有哥们直接通过 Database.ExecuteSqlCommand("select * from order_info where com ...
- [原创]LAMP+phpmyadmin+FTP环境搭建
***简单ftp服务器搭建: rpm –qa|grep vsftpd //检查是否安装服务 yum –y install vsftpd-* //安装服务 mkdir /var/ftp/uplo ...
- TOJ4101.Guess Game(TOJ means Tianjin University Online Judge)(dp的思想,但这道题目是假dp)
题意:你要从[1,n]这个n个数中猜出来规定的某个数,现在这个数未知,问你在最糟糕的情况下(但是你采用了最优的策略),你要猜多少次才能猜出这个数.现在有两种条件: 第一种:当你猜的数比指定的那个数小的 ...
- ECS_8080端口连接拒绝问题排查
原文链接 用户ECS网络设置 上图是用户ECS的网络示意图: ecs处于vpc网络下 ecs加入了一个安全组,该安全组出入方向均开放8080端口 ecs有两个网卡,一个私网主网卡(有虚线的网卡),一个 ...
- 今天重装系统后,Wdows更新提示“windows update当前无法检查更新,因为未运行服务。您可能需要重新启动计算机”
到百度搜了常用的解决方法,就是用命令提示符,但对我的情况不管用,提示“拒绝访问”.后来在08绿软站的一篇文章中找到了解决办法.原文如下(我本人也是用的第四种方法解决的): 试了下面几种解决方法,第四种 ...
- VR全景智慧城市—城市就在你眼前
"春风十里,不如有你",不知不觉间,身边的人已对VR不再陌生,VR眼镜的热销,VR体验店的火爆,VR游戏的向往等等.可见VR就是为生活而诞生! 2015年被称作VR行业的产业元年, ...