博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Requests:Python HTTP Module学习笔记(二)(转)
阅读量:5250 次
发布时间:2019-06-14

本文共 5415 字,大约阅读时间需要 18 分钟。

在上一篇日志中对Requests做了一个整体的介绍,接来下再介绍一些高级的用法,主要资料还是翻译自官网的文档,如有错漏,欢迎指正。

参考资料:

会话对象(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)

默认情况下verify的值为True,verify选项只适用于验证主机的证书。

还可以指定本地的证书文件作为一个路径或键值对:

>>> requests.get('https://kennethreitz.com', cert=('/path/server.crt', '/path/key'))

如果指定一个错误的路径或无效的证书:

>>> 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_contentResponse.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

自定义的身份验证(Custom Authentication)

Requests允许你使用指定的自定义的身份验证机制。

任何可调用的请求方法通过auth参数,在派发之前可以修改请求。
身份验证很容易定义,都是继承于requests.auth.AuthBase的子类。Requests提供两种常见的身份验证方案实现在requests.auth: HTTPBasicAuthHTTPDigestAuth
我们假装我们有一个web服务,它只会在标头的X-Pizza被设置为一个密码值时返回响应,虽然不太可能,但只是用它就好:

from requests.auth import AuthBaseclass 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'))

流请求(Streaming Requests)

利用requests.Response.iter_lines()方法,你可以轻松的遍历流API如.

使用Twitter Streaming API去跟踪“requests”关键字:

import requestsimport jsonr = 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 requestsproxies = {
"http": "10.10.1.10:3128", "https": "10.10.1.10:1080",}requests.get("http://example.org", proxies=proxies)

你也可以通过环境变量HTTP_PROXYHTTPS_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)

转载于:https://www.cnblogs.com/paisen/p/3399359.html

你可能感兴趣的文章
关于本博客说明
查看>>
线程androidAndroid ConditionVariable的用法
查看>>
stap-prep 需要安装那些内核符号
查看>>
转载:ASP.NET Core 在 JSON 文件中配置依赖注入
查看>>
socket初识
查看>>
磁盘测试工具
查看>>
代码变量、函数命名神奇网站
查看>>
redis cli命令
查看>>
Problem B: 占点游戏
查看>>
python常用模块之sys, os, random
查看>>
HDU 2548 A strange lift
查看>>
Linux服务器在外地,如何用eclipse连接hdfs
查看>>
react双组件传值和传参
查看>>
[Kaggle] Sentiment Analysis on Movie Reviews
查看>>
价值观
查看>>
mongodb命令----批量更改文档字段名
查看>>
CentOS 简单命令
查看>>
使用&nbsp;SharedPreferences 分类: Andro...
查看>>
TLA+(待续...)
查看>>
题解: [GXOI/GZOI2019]与或和
查看>>