Requests:Python HTTP Module学习笔记(二)(转)
在上一篇日志中对Requests做了一个整体的介绍,接来下再介绍一些高级的用法,主要资料还是翻译自官网的文档,如有错漏,欢迎指正。
参考资料:http://docs.python-requests.org/en/latest/user/advanced/
会话对象(Session Objects)
一个请求传递的参数,在另一个请求是无效的,不过会话对象允许跨请求的保存参数,还可以从会话实例中保存所有请求的cookies数据。
下面介绍一下在Requests中会话对象主要的API。
跨请求的保存cookies数据:
s = requests.Session() s.get('http://httpbin.org/cookies/set/sessioncookie/123456789')
r = s.get("http://httpbin.org/cookies") print r.text
# '{"cookies": {"sessioncookie": "123456789"}}'
传递到请求方法中任何字典类型的数据都会设置成会话级别的值,方法级别的参数会覆盖会话级别的参数。
删除一个字典类型的参数:
有时,想从会话中删除一个字典的键,要做到这一点,只要设置方法参数中键的值为None
,它就会自动的被删除掉。
请求和响应对象(Request and Response Objects)
每当调用requests.*()的请求方法时,主要做两个事情,第一个是构造一个请求对象对服务器发起请求或者查询一些资源。第二个是在请求从服务器获得一个响应时生成一个响应对象。响应对象包含从服务器返回的所有信息也包含最初构造的请求对象。以下这个例子是一个简单的请求从Wikipedia的服务器返回一些重要的信息:
>>> r = requests.get('http://en.wikipedia.org/wiki/Monty_Python')
如果想访问从服务器返回给我们的标头信息,可以这样做:
>>> r.headers
{'content-length': '56170', 'x-content-type-options': 'nosniff', 'x-cache':
'HIT from cp1006.eqiad.wmnet, MISS from cp1010.eqiad.wmnet', 'content-encoding':
'gzip', 'age': '3080', 'content-language': 'en', 'vary': 'Accept-Encoding,Cookie',
'server': 'Apache', 'last-modified': 'Wed, 13 Jun 2012 01:33:50 GMT',
'connection': 'close', 'cache-control': 'private, s-maxage=0, max-age=0,
must-revalidate', 'date': 'Thu, 14 Jun 2012 12:59:39 GMT', 'content-type':
'text/html; charset=UTF-8', 'x-cache-lookup': 'HIT from cp1006.eqiad.wmnet:3128,
MISS from cp1010.eqiad.wmnet:80'}
然而,如果想访问请求发送给服务器的标头信息:
>>> r.request.headers
{'Accept-Encoding': 'identity, deflate, compress, gzip',
'Accept': '*/*', 'User-Agent': 'python-requests/0.13.1'}
SSL证书验证(SSL Cert Verification)
Requests就像一个web浏览器一样,可以验证SSL证书和HTTPS请求,检查主机的SSL证书,可以使用verify
参数:
>>> requests.get('https://kennethreitz.com', verify=True)
requests.exceptions.SSLError: hostname 'kennethreitz.com' doesn't match either of '*.herokuapp.com', 'herokuapp.com'
https://kennethreitz.com
这个域名没有设置SSL证书,所以它验证失败了,Github就能通过验证:
>>> requests.get('https://github.com', verify=True)
<Response [200]>
默认情况下verify
的值为True,verify
选项只适用于验证主机的证书。
还可以指定本地的证书文件作为一个路径或键值对:
>>> requests.get('https://kennethreitz.com', cert=('/path/server.crt', '/path/key'))
<Response [200]>
如果指定一个错误的路径或无效的证书:
>>> requests.get('https://kennethreitz.com', cert='/wrong_path/server.pem')
SSLError: [Errno 336265225] _ssl.c:347: error:140B0009:SSL routines:SSL_CTX_use_PrivateKey_file:PEM lib
正文内容的工作流程(Body Content Workflow)
默认情况下,当发出一个请求,响应正文会立即被下载,你可以覆盖这个行为来推迟下载响应正文直到你通过stream
这个参数来访问Response.content属性:
tarball_url = 'https://github.com/kennethreitz/requests/tarball/master'
r = requests.get(tarball_url, stream=True)
这时候,只有响应的标头被下载和连接仍然保持打开,因此,我们可以有条件的检索内容:
if int(r.headers['content-length']) < TOO_LONG:
content = r.content
...
通过使用Response.iter_content
和Response.iter_lines
方法你可以进一步的控制工作流程,或者通过Response.raw
阅读底层urllib3的urllib3.HTTPResponse.
Keep-Alive
由于使用urllib3,在会话中keep-Alive是100%自动的,在一个会话中创建的任何请求都会自动使用适当的连接。
注意,当所有的正文数据已被读取,连接会被释放回池中以便重用;一定要设置stream
为False或者读取响应对象的content
属性。
流上传(Streaming Uploads)
Requests支持流上传,它允许你发送大量的流或文件而不读取到内存中,流上传,只需要为正文提供一个类似文件的对象:
with open('massive-body') as f:
request.post('http://some.url/streamed', data=f)
数据块编码请求(Chunk-Encoded Requests)
Requets还为传入和传出的请求提供块传输编码的支持,发送一个块编码的请求,为你的正文简单的提供一个生成器(或者任何没有长度的迭代器):
def gen():
yield 'hi'
yield 'there' request.post('http://some.url/chunked', data=gen())
事件钩子(Event Hooks)
Requests有一个hook系统,你可以用它来操纵部分请求过程,或者进行信号事件的处理。
可用的hooks:response
:
响应从一个请求产生。
根据每条请求可以指定一个hook函数通过一个{hook_name: callback_function}
字典类型的hook请求参数:
hooks=dict(response=print_url)
回调函数会收到一个块数据作为第一个参数。
def print_url(r):
print(r.url)
当执行回调的时候如果出现了错误,会给出一个警告。
如果回调函数返回一个值,就认为它是在传递时替换数据的,如果函数没有返回任何值,那它就没有什么其他的影响。
在运行时输出一些请求方法的参数:
>>> requests.get('http://httpbin.org', hooks=dict(response=print_url))
http://httpbin.org
<Response [200]>
自定义的身份验证(Custom Authentication)
Requests允许你使用指定的自定义的身份验证机制。
任何可调用的请求方法通过auth
参数,在派发之前可以修改请求。
身份验证很容易定义,都是继承于requests.auth.AuthBase
的子类。Requests提供两种常见的身份验证方案实现在requests.auth: HTTPBasicAuth
和HTTPDigestAuth
。
我们假装我们有一个web服务,它只会在标头的X-Pizza
被设置为一个密码值时返回响应,虽然不太可能,但只是用它就好:
from requests.auth import AuthBase class PizzaAuth(AuthBase):
"""Attaches HTTP Pizza Authentication to the given Request object."""
def __init__(self, username):
# setup any auth-related data here
self.username = username def __call__(self, r):
# modify and return the request
r.headers['X-Pizza'] = self.username
return r
然后,我们可以创建一个请求使用Pizza验证:
>>> requests.get('http://pizzabin.org/admin', auth=PizzaAuth('kenneth'))
<Response [200]>
流请求(Streaming Requests)
利用requests.Response.iter_lines()
方法,你可以轻松的遍历流API如Twitter Streaming API.
使用Twitter Streaming API去跟踪“requests”关键字:
import requests
import json r = requests.post('https://stream.twitter.com/1/statuses/filter.json',
data={'track': 'requests'}, auth=('username', 'password'), stream=True) for line in r.iter_lines():
if line: # filter out keep-alive new lines
print json.loads(line)
代理(Streaming Requests)
如果你需要使用一个代理,你可以在任何请求方法中使用proxies
参数配置单个请求:
import requests proxies = {
"http": "10.10.1.10:3128",
"https": "10.10.1.10:1080",
} requests.get("http://example.org", proxies=proxies)
你也可以通过环境变量HTTP_PROXY
和HTTPS_PROXY
来配置代理:
$ export HTTP_PROXY="10.10.1.10:3128"
$ export HTTPS_PROXY="10.10.1.10:1080"
$ python
>>> import requests
>>> requests.get("http://example.org")
为你的代理使用HTTP的基本认证,可以使用这样http://user:password@host/
的格式:
proxies = {
"http": "http://user:pass@10.10.1.10:3128/",
}
符合(Compliance)
编码(Encodings)
超文本传输协议(HTTP Verbs)
链接标题(Link Headers)
Requests:Python HTTP Module学习笔记(二)(转)的更多相关文章
- Requests:Python HTTP Module学习笔记(一)(转)
Requests:Python HTTP Module学习笔记(一) 在学习用python写爬虫的时候用到了Requests这个Http网络库,这个库简单好用并且功能强大,完全可以代替python的标 ...
- python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码
python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码 python的json.dumps方法默认会输出成这种格式"\u535a\u ...
- python3.4学习笔记(二十五) Python 调用mysql redis实例代码
python3.4学习笔记(二十五) Python 调用mysql redis实例代码 #coding: utf-8 __author__ = 'zdz8207' #python2.7 import ...
- python3.4学习笔记(二十四) Python pycharm window安装redis MySQL-python相关方法
python3.4学习笔记(二十四) Python pycharm window安装redis MySQL-python相关方法window安装redis,下载Redis的压缩包https://git ...
- python3.4学习笔记(二十三) Python调用淘宝IP库获取IP归属地返回省市运营商实例代码
python3.4学习笔记(二十三) Python调用淘宝IP库获取IP归属地返回省市运营商实例代码 淘宝IP地址库 http://ip.taobao.com/目前提供的服务包括:1. 根据用户提供的 ...
- python3.4学习笔记(二十二) python 在字符串里面插入指定分割符,将list中的字符转为数字
python3.4学习笔记(二十二) python 在字符串里面插入指定分割符,将list中的字符转为数字在字符串里面插入指定分割符的方法,先把字符串变成list然后用join方法变成字符串str=' ...
- python3.4学习笔记(二十一) python实现指定字符串补全空格、前面填充0的方法
python3.4学习笔记(二十一) python实现指定字符串补全空格.前面填充0的方法 Python zfill()方法返回指定长度的字符串,原字符串右对齐,前面填充0.zfill()方法语法:s ...
- python3.4学习笔记(二十) python strip()函数 去空格\n\r\t函数的用法
python3.4学习笔记(二十) python strip()函数 去空格\n\r\t函数的用法 在Python中字符串处理函数里有三个去空格(包括'\n', '\r', '\t', ' ')的函数 ...
- python3.4学习笔记(二) 类型判断,异常处理,终止程序
python3.4学习笔记(二) 类型判断,异常处理,终止程序,实例代码: #idle中按F5可以运行代码 #引入外部模块 import xxx #random模块,randint(开始数,结束数) ...
随机推荐
- 《Code Complete》ch.15 使用条件语句
WHAT? 条件语句指if.else.case.switch,循环语句指for.while WHY? 不用条件语句你写得出代码吗? HOW? if-then 正常情况放在异常情况之前 执行频率高的情况 ...
- 为什么你不应该自行更新 Drupal 网站?
(译注:这篇文章主要还是针对于非专业人员及个人Drupal站长,对于专业的 Drupal 团队和公司而言 Drupal 的升级更新都有规范的操作流程,完全是家常便饭,不可能出现文中出现的这些情况.尽管 ...
- 用 vs2013 创建 windows service 程序
windows services 是运行在后台的服务程序,可以用 vs2013 来创建,创建的步骤如下: 1.打开 vs2013 , Files -->New Project --> wi ...
- 手游设备ID
android: imei: IMEI(International Mobile Equipment Identity)是国际移动设备标识的缩写,IMEI由15位数字(英文字母)组成. mac: 是指 ...
- 二模08day2解题报告
T1.引爆炸弹(bomb) N个炸弹构成一棵树,引爆一颗叶节点,会一直引爆到根节点.每颗炸弹有一个价值,求引爆k个炸弹的最大价值. 既然是一棵树,那么自然想到dp.所以先树形dp了一遍(由于可能出现多 ...
- [SSH 2] 以网站主页面浅谈Struts2配置
导读:前面总体的介绍了一下SSH框架,那么作为Struts这一支,具体是怎么配置的呢?本篇博客则主要是以自己做过的实例中的登录一条线,简单介绍一下struts2的配置,如有不妥之处,还请大家多提点提点 ...
- 改变ListCtrl某行的背景色或者字体颜色
大家也许熟悉WM_NOTIFY,控件通过WM_NOTIFY向父窗口发送消息.在WM_NOTIFY消息体中,部分控件会发送NM_CUSTOMDRAW告诉父窗口自己需要绘图. 也可以反射NM_CUSTOM ...
- PAT1069. The Black Hole of Numbers
//这是到水题,之前因为四位数的原因一直不能A,看了别人的程序,才明白,不够四位的时候没考虑到,坑啊.....脸打肿 #include<cstdio>#include<algorit ...
- vba 快速定位当前EXCEL最后一栏
工作的需要,有时会对EXCEL数据进行处理,比如格式化,有数据的单元格画横线. 最初,傻傻的,直接用个循环从第1行,一直往后找,判断是否为空,真傻. Function FindLastCell() D ...
- 二级路由器设置为何要关闭DHCP服务
因为如果不关闭dhcp的话会和一级路由相冲突,你这个因该是lan口的连接法吧,如果不然的话是不需要关闭dhcp功能的路由器和路由器的连接方法有两种,一种是wan口连,一种是lan口连方法1:WAN口连 ...