Session Objects会话对象

Session对象在请求时允许你坚持一定的参数。此外,还坚持由Session实例的所有请求的cookie。

让我们坚持在请求时使用

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"}}'

会话也可以用于提供默认的数据的请求的方法。这是通过提供的数据会话对象的属性:

s = requests.Session()
s.auth = ('user', 'pass')
s.headers.update({'x-test': 'true'})
# both 'x-test' and 'x-test2' are sent
s.get('http://httpbin.org/headers', headers={'x-test2': 'true'})

任何字典将被合并session级别的设置的值传递给请求方法。方法级别的参数覆盖会话参数。

从一个字典参数中取值

如果你想在一个session中删除一个参数,那么你只需要设置它为none,他便自动被删去。

在一个session中的所有值都包含直接提供给你。参阅Session API文档了解更多信息。

请求和响应对象

 >>> r = requests.get('http://en.wikipedia.org/wiki/Monty_Python')

查看

>>> r.headers

{'content-length': '', 'x-content-type-options': 'nosniff','x-cache':
'HIT from cp1006.eqiad.wmnet, MISS from cp1010.eqiad.wmnet','content-encoding':
'gzip', 'age': '', '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 fromcp1006.eqiad.wmnet:3128,
MISS from cp1010.eqiad.wmnet:80'}

但是,如果我们想要得到我们的服务器发送的报头,我们只需访问请求,然后请求标头:

>>> r.request.headers
{'Accept-Encoding': 'identity, deflate, compress, gzip',
'Accept': '*/*', 'User-Agent': 'python-requests/1.2.0'}

准备请求

当你在API呼叫或会话呼叫收到一个Response对象,请求属性实际上是PreparedRequest使用。在某些情况下,发送请求之前,你不妨做一些额外的工作,身体或头(或任何其他真的)。这个简单的配方如下:

from requests import Request, Session

s = Session()

prepped = Request('GET',  # or any other method, 'POST', 'PUT', etc.
url,
data=data
headers=headers
# ...
).prepare()
# do something with prepped.body
# do something with prepped.headers
resp = s.send(prepped,
stream=stream,
verify=verify,
proxies=proxies,
cert=cert,
timeout=timeout,
# etc.
) print(resp.status_code)

既然你没有做什么特别的请求对象,你准备立即修改的PreparedRequest的对象。然后,您可以发送您所要发送的请求的其他参数。*或Sesssion中。*。

SSL证书验证

请求可以验证SSL证书的HTTPS请求,就像一个网络浏览器。检查主机的SSL证书,您可以使用校验参数:

 >>> requests.get('https://kennethreitz.com', verify=True)

requests.exceptions.SSLError: hostname 'kennethreitz.com' doesn't matcheither of '*.herokuapp.com', 'herokuapp.com'

我没有对这个域的SSL设置,所以它的失败。好极了 Github上虽然没有:

 >>> requests.get('https://github.com', verify=True)

<Response [200]>

您也可以通过验证一个私人证书CA_BUNDLE文件的路径。您还可以设置环境变量的REQUESTS_CA_BUNDLE。

如果你设置验证设置为False,也可以忽略验证SSL证书。

 >>> 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:SSLroutines:SSL_CTX_use_PrivateKey_file:PEM lib

主体内容工作流程

默认情况下,当你提出一个请求时,机体的反应是立即下载。您可以重写此行为,并推迟下载响应的身体,直到您访问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方法的工作流程,或从基本的urllib3 urllib3.HTTPResponse在Response.raw阅读。

保持活动

需要注意的是发布的连接会回到池会重用所有以读取的数据:

确保为设置数据流false或阅读Response对象的内容属性。

流上传

请求支持它允许你发送大量的没有读取到内存的流或文件流上传,。要流和上传,只需为你的身体提供了一个类似文件的对象:

with open('massive-body') as f:
requests.post('http://some.url/streamed', data=f)

块编码请求:

还请支持分块传输编码传出和传入的请求。要发送一个数据块编码的请求,只是提供一个生成器(或任何没有长度的迭代器)为您的BODY:

def gen():
yield 'hi'
yield 'there'
requests.post('http://some.url/chunked', data=gen())

事件钩子:

请求有一个钩子,系统,你可以用它来处理申请过程中的部分或信号事件的处理。

您可以指定一个钩子函数在每个请求的基础上,通过一个{hook_name:callback_function}字典的钩请求参数:

hooks=dict(response=print_url)

那CALLBACK_FUNCTION将收到的数据块作为第一个参数。

>>> requests.get('http://httpbin.org',hooks=dict(response=print_url))
http://httpbin.org
<Response [200]>

自定义身份验证

这callback_function将收到一大块的数据作为第一个参数。

from requests.auth import AuthBase
class PizzaAuth(AuthBase):
"""Attaches HTTP Pizza Authentication tothe given Request object."""
def __init__(self, username):
# setup any auth-related datahere
self.username = username def __call__(self, r):
# modify and return the request
r.headers['X-Pizza'] =self.username
return r
Then, we can make a request using our Pizza Auth: >>> requests.get('http://pizzabin.org/admin',auth=PizzaAuth('kenneth'))
<Response [200]>

代理

import requests
proxies = {
"http": "http://10.10.1.10:3128",
"https": "http://10.10.1.10:1080",
} requests.get("http://example.org", proxies=proxies)

您还可以配置代理服务器环境HTTP_PROXY and HTTPS_PROXY.

$ export HTTP_PROXY="http://10.10.1.10:3128"

$ export HTTPS_PROXY="http://10.10.1.10:1080"

$ python

>>> import requests

>>> requests.get("http://example.org")

To use HTTP Basic Auth with your proxy, use the http://user:password@host/syntax:

proxies = {

"http":"http://user:pass@10.10.1.10:3128/",

}

遵守:

要求是为了符合相关的规范和RFC的合规性,不会造成困难,为用户。这受到关注,可能会导致一些看似寻常的行为,可能对那些不熟悉有关规范。

编码:

如果没有明确的字符集是在HTTP头中的Content-Type头中包含文本。在这种情况下,RFC 2616指定默认的字符集必须是ISO-8859-1

HTTP动词

要求提供访问几乎是全方位的HTTP动词:GET,OPTIONS,HEAD,POST,PUT,PATCH和DELETE。下面提供了详细的例子,使用这些不同的动词在请求中,使用GitHub的API。

>>> import requests

>>> r =requests.get('https://api.github.com/repos/kennethreitz/requests/git/commits/a050faf084662f3a352dd1a941f2c7c9f886d4ad')

因此,GitHub的返回JSON。我们可以使用r.json的方法来解析为Python对象。

>>> commit_data = r.json()
>>> print commit_data.keys()
[u'committer', u'author', u'url', u'tree', u'sha', u'parents', u'message']
>>> print commit_data[u'committer']
{u'date': u'2012-05-10T11:10:50-07:00', u'email': u'me@kennethreitz.com',u'name': u'Kenneth Reitz'}
>>> print commit_data[u'message']
makin' history

请求可以很容易地使用各种形式的认证,包括很常见的基本身份验证。

>>> from requests.auth import HTTPBasicAuth
>>> auth = HTTPBasicAuth('fake@example.com','not_a_real_password')
>>> r = requests.post(url=url, data=body, auth=auth)
>>> r.status_code
201
>>> content = r.json()
>>> print content[u'body']
Sounds great! I'll get right on it.

python requests 高级用法 -- 包括SSL 证书错误的解决方案的更多相关文章

  1. (转)python requests 高级用法 -- 包括SSL 证书错误的解决方案

    我在使用requests访问某个https网站时出现错误  error::SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify fai ...

  2. python requests 高级用法

    高级用法 本篇文档涵盖了 Requests 的一些高级特性. 会话对象 会话对象让你能够跨请求保持某些参数.它也会在同一个 Session 实例发出的所有请求之间保持 cookie, 期间使用 url ...

  3. 爬虫—Requests高级用法

    Requests高级用法 1.文件上传 我们知道requests可以模拟提交一些数据.假如有的网站需要上传文件,我们也可以用requests来实现. import requests files = { ...

  4. python requests高级耍法

    昨天,我们更多的讨论了request的基础API,让我们对它有了基础的认知.学会上一课程,我们已经能写点基本的爬虫了.但是还不够,因为,很多站点是需要登录的,在站点的各个请求之间,是需要保持回话状态的 ...

  5. python爬虫(3)——SSL证书与Handler处理器

    一.SSL证书问题 上一篇文章,我们创建了一个小爬虫,下载了上海链家房产的几个网页.实际上我们在使用urllib联网的过程中,会遇到证书访问受限的问题. 处理HTTPS请求SSL证书验证,如果SSL证 ...

  6. github for window 中 git shell 设置代理方法和解决ssl证书错误的问题

    体验了一下传说中的 github for windows(操作git有很多的方法,我还没有学会,所以找了个简单的方法),听说用起来还不错,毕竟也开始接触了github.下载地址是 http://win ...

  7. 爬虫之requests 高级用法

    1. 文件上传 import requests files = {'file': open('favicon.ico', 'rb')} r = requests.post("http://h ...

  8. Python pip高级用法

    1.pip 高级用法为了便于用户安装和管理第三方库和软件,越来越多的编程语言拥有自己的包管理工 具,如 nodejs 的 npm, ruby 的 gem. Python 也不例外,现在 Python ...

  9. [python][nginx][https] Nginx 服务器 SSL 证书安装部署

    目录 前言 1 申请证书 2 Nginx 服务器 SSL 证书安装部署 2.1.准备 Nginx 环境 2.2 证书部署 2.3 Nginx 配置 3 最后 参考链接 前言 博主博客中的图片,使用的是 ...

随机推荐

  1. yolov1代码阅读

    yolov1使用的backbone是由GoogLeNet启发而来,有24个卷积层,最后接2个全连接层,详细结构如下图: 检测网络的输入分辨率是448X448,最后的特征图大小为7X7.在特征图的每一个 ...

  2. Openstack贡献者须知 2 — 社区工作运作 & 代码贡献流程

    目录 目录 前文列表 订阅邮件列表 Mailing Lists 社区工作运作流程 Openstack 代码贡献流程 PEP8 Python编程风格 查阅相关资源 前文列表 Openstack贡献者须知 ...

  3. jquery preventDefault()事件

    定义和用法 preventDefault() 方法阻止元素发生默认的行为(例如,当点击提交按钮时阻止对表单的提交). 语法 event.preventDefault() 参数 描述 event 必需. ...

  4. Redis学习之缓存数据类型

    Redis缓存数据类型有5种,分别是String(字符串).List(列表).Hash(哈希).Set(无序,不重复集合).ZSet(sorted set:有序,不重复集合). String(字符串) ...

  5. 转:CSS盒模型

    W3C 组织建议把所有网页上的对像都放在一个盒(box)中,设计师可以通过创建定义来控制这个盒的属性,这些对像包括段落.列表.标题.图片以及层.盒模型主 要定义四个区域:内容(content).边框距 ...

  6. anjs 分词器初步使用

    由于ik没有歧义分词的功能,打算用anjs 对前端传递过来的数据用anjs进行分词 anjs 操作文档官网地址:http://nlpchina.github.io/ansj_seg/ 刚刚开始由于ja ...

  7. IntelliJ IDEA创建springboot项目

    1.创建新项目. 2. 3.Group 是包名,Artifact是项目名. 4.springboot版本尽量选择最高版本,且不要选择SNAPSHOP版本. 5.路径可自定义,默认为D://IDEA/M ...

  8. lambda x:i*x for i in range(4)

    解决方法:冒号前添加接收 i 的变量 return [lambda x,i=i: i * x for i in range(4)]

  9. PHP-SQL查询上升的温度

    给定一个 Weather 表,编写一个 SQL 查询,来查找与之前(昨天的)日期相比温度更高的所有日期的 Id. +---------+------------------+------------- ...

  10. 一个切图仔的HTML笔记

    1,href="javascript:history.back(-1)" //页面返回上一步 2,meta信息设置 360浏览器就会在读取到这个标签后,立即切换对应的极速核. &l ...