(转)python requests 高级用法 -- 包括SSL 证书错误的解决方案
我在使用requests访问某个https网站时出现错误
error::SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
找到这篇文章 http://python.codemach.com/pythonrequests-gao-ji-yong-fa.html
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
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': '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 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 证书错误的解决方案的更多相关文章
- python requests 高级用法 -- 包括SSL 证书错误的解决方案
Session Objects会话对象 Session对象在请求时允许你坚持一定的参数.此外,还坚持由Session实例的所有请求的cookie. 让我们坚持在请求时使用 s = requests.S ...
- python requests 高级用法
高级用法 本篇文档涵盖了 Requests 的一些高级特性. 会话对象 会话对象让你能够跨请求保持某些参数.它也会在同一个 Session 实例发出的所有请求之间保持 cookie, 期间使用 url ...
- 爬虫—Requests高级用法
Requests高级用法 1.文件上传 我们知道requests可以模拟提交一些数据.假如有的网站需要上传文件,我们也可以用requests来实现. import requests files = { ...
- python requests高级耍法
昨天,我们更多的讨论了request的基础API,让我们对它有了基础的认知.学会上一课程,我们已经能写点基本的爬虫了.但是还不够,因为,很多站点是需要登录的,在站点的各个请求之间,是需要保持回话状态的 ...
- python爬虫(3)——SSL证书与Handler处理器
一.SSL证书问题 上一篇文章,我们创建了一个小爬虫,下载了上海链家房产的几个网页.实际上我们在使用urllib联网的过程中,会遇到证书访问受限的问题. 处理HTTPS请求SSL证书验证,如果SSL证 ...
- 爬虫之requests 高级用法
1. 文件上传 import requests files = {'file': open('favicon.ico', 'rb')} r = requests.post("http://h ...
- Python pip高级用法
1.pip 高级用法为了便于用户安装和管理第三方库和软件,越来越多的编程语言拥有自己的包管理工 具,如 nodejs 的 npm, ruby 的 gem. Python 也不例外,现在 Python ...
- [python][nginx][https] Nginx 服务器 SSL 证书安装部署
目录 前言 1 申请证书 2 Nginx 服务器 SSL 证书安装部署 2.1.准备 Nginx 环境 2.2 证书部署 2.3 Nginx 配置 3 最后 参考链接 前言 博主博客中的图片,使用的是 ...
- github for window 中 git shell 设置代理方法和解决ssl证书错误的问题
体验了一下传说中的 github for windows(操作git有很多的方法,我还没有学会,所以找了个简单的方法),听说用起来还不错,毕竟也开始接触了github.下载地址是 http://win ...
随机推荐
- block(五)用法
最近又从网上找了点block用法的博客,供大家参考. Block简介: Block的实际行为和Function很像,最大的差别是在可以存取同一个Scope的变量值.Block实体形式如下: ^(传入参 ...
- jQuery的prop和attr的区别,及判断复选框是否选中
jQuery的prop和attr的区别 对于HTML元素本身就带有的固有属性,在处理时,使用prop方法. 对于HTML元素我们自己自定义的DOM属性,在处理时,使用attr方法. 参数有区别,att ...
- Android NDK r9的配置与使用
Android NDK 配置: 网上有很多教程,但大部分是旧版本的内容,最新版本的已经改变,为了让大家少走弯路,在这里针对r9的配置进行记录分享. 要玩NDK,你或多或少要用到以下一些东西,所以先做一 ...
- 目标检测 的标注数据 .xml 转为 tfrecord 的格式用于 TensorFlow 训练
将目标检测 的标注数据 .xml 转为 tfrecord 的格式用于 TensorFlow 训练. import xml.etree.ElementTree as ET import numpy as ...
- Echarts 新认知 地图的label到底怎么居中?
试过了offset和很多Api,都无法实现label居中 后来无意中发现,原来在geojson注册的时候,可以定义 properties.cp 属性,实现文本的坐标自定义,实现居中. echarts. ...
- JVM 入门三板斧
一个JVM实例只存在一个堆内存,堆内存的大小是可以调节的.类加载器读取了类文件后,需要把类.方法.常变量放到堆内存中,保存所有引用类型的真实信息,以方便执行器执行,堆内存分为三部分: Young Ge ...
- xbox360 双65厚机自制系统无硬盘 U盘玩游戏方法
因为没有硬盘,又没有光盘.所以想把游戏放在U盘里面.用U盘来做为硬盘玩游戏. 现有的自制系统主要是FSD,但是FSD要用硬盘才能安装,理论上U盘也可以,但是我没有尝试了. 这里介绍的是玩xex格式的游 ...
- JAVA之堆内存和栈内存的差别
欢迎转载.请附上出处: http://blog.csdn.net/as02446418/article/details/47007975 笔者近期在准备面试的时候又一次看了一些JAVA基础的知识,以下 ...
- CentOS 7 安装中文环境
centos升级到7后,系统设置好多和6有了很大的区别,中文支持就有很大的变化. 1.安装中文语言包. yum install kde-l10n-Chinese 2.安装(已经安装的要重新安装)gli ...
- 一分钟上手, 让 Golang 操作数据库成为一种享受
gorose, 最风骚的 go orm, 拥有链式操作, 开箱即用, 一分钟上手等八大风骚, 让 golang 操作数据库成为一种享受, 妈妈再也看不到我处理数据的痛苦了, 下面就来为大家一一讲解 g ...