会话对象

当你向同一主机发送多个请求时,session会重用底层的tcp连接,从而提升性能,同时session也会为所有请求保持 cookie。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# __author__:kzg
import requests s = requests.Session()
# 此地址cookie为空
r = s.get('http://httpbin.org/cookies')
print(r.text)
结果:
{
"cookies": {}
}

  session可以保持cookie来访问后续同一服务器上的地址

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# __author__:kzg
import requests s = requests.Session()
r = s.get('http://httpbin.org/cookies/set/sessioncookie/123456789')
print(r.text)
# cookie被保持来访问此url
rc = s.get('http://httpbin.org/cookies')
print(rc.text) 结果:
{
"cookies": {
"sessioncookie": "123456789"
}
} {
"cookies": {
"sessioncookie": "123456789"
}
}

  

  可以修改session的属性(cookies,headers)来为请求方法(get,post)提供缺省数据,可保跨请求保持。

# -*- coding:utf-8 -*-
# __author__:kzg
import requests
# 生成session对象
s = requests.Session()
print(s.headers)
# 修改session属性
s.headers.update({'User-Agent':'kong'})
print(s.headers)
r = s.get('http://httpbin.org/headers')
print(r.text)
结果:
{'Connection': 'keep-alive', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'User-Agent': 'python-requests/2.18.1'}
{'Connection': 'keep-alive', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'User-Agent': 'kong'}
{
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Connection": "close",
"Host": "httpbin.org",
"User-Agent": "kong"
}
}
 

 也可以通过传递方法层的参数来提供缺省数据,它会与已设置的会话层数据合并,不能跨请求保持。

# -*- coding:utf-8 -*-
# __author__:kzg
import requests
# 生成session对象
s = requests.Session()
# 修改session属性
s.headers.update({'User-Agent':'kong'})
# 方法级参数cookies
r = s.get('http://httpbin.org/headers',cookies={'from-my': 'browser'})
print(r.text)
# 方法级参数不能被保持到下一个请求
r1 = s.get('http://httpbin.org/headers')
print(r1.text)
结果:
{
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Connection": "close",
"Cookie": "from-my=browser",
"Host": "httpbin.org",
"User-Agent": "kong"
}
} {
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Connection": "close",
"Host": "httpbin.org",
"User-Agent": "kong"
}
}

  

  请求与响应对象

你任何时间调用requests.*()的时候,都是在做两件重要的事情。

  1、你在构建request对象,并把它发送到某服务器去请求或查询一些资源

  2、产生response对象来接收从服务器返回的所有响应,也包含你创建的request对象

# _*_ coding: utf-8 _*_
import requests # 生成一个会话对象
s = requests.Session() r = requests.get('http://en.wikipedia.org/wiki/Monty_Python')
# 服务器返回来的头部信息
print r.headers
# 发送给服务器的头部信息
print r.request.headers

  

  工作流响应体内容

如果你在请求中使用了stream=True:

  1、仅有响应体会被立即下载,只有当访问response.content属性时响应体才会被下载

  2、此时连接保持打开状态,需要调用response.close来关闭连接

  3、连接效率低下

# _*_ coding: utf-8 _*_
import requests tarball_url = 'https://github.com/kennethreitz/requests/tarball/master'
r = requests.get(tarball_url, stream=True)
print r.headers['content-length']
结果:
3336071

  

  文件上传

#!/usr/bin/python3
# -*- coding: utf-8 -*-
import requests url = 'http://httpbin.org/post'
files = {'file': open('D:\\projects\\blog\\my_temp.xlsx', 'rb')}
ret = requests.post(url, files=files)
print(ret.text)

  

  设置文件名、文件类型和请求头

#!/usr/bin/python3
# -*- coding: utf-8 -*-
import requests url = 'http://httpbin.org/post'
files = {'file': ('my_temp.xlsx',open('D:\\projects\\blog\\my_temp.xlsx', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})}
ret = requests.post(url, files=files)
print(ret.text)

  

   流式上传

允许你在请求中发送大的数据流或文件,此时requests会根据文件大小来设置headers中的content-length,所以文件最好以二进制方式打开

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

  

  为请求设置代理

如果需要为请求设置代理,只需要给相应的请求提供proxies参数即可。

方法一、

$ 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")

方法二、

# _*_ coding: utf-8 _*_
import requests proxies={
"http":"http://10.10.1.10:3128",
"https":"http://10.10.1.10:1080",
} r = requests.get("http://example.org",proxies=proxies)

  

  超时

为防止服务器不能及时响应,大部分发至外部服务器的请求都应该带着 timeout 参数

# _*_ coding: utf-8 _*_
import requests # 同时设置connect,read的timeout
r = requests.get('https://github.com', timeout=5)
# 分别设置connect和read的timeout
r = requests.get('https://github.com', timeout=(3.05, 27))
# 永久等待,直到读完
r = requests.get('https://github.com', timeout=None)

  

requests高级用法的更多相关文章

  1. 爬虫—Requests高级用法

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

  2. python requests 高级用法

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

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

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

  4. 爬虫之requests 高级用法

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

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

    Session Objects会话对象 Session对象在请求时允许你坚持一定的参数.此外,还坚持由Session实例的所有请求的cookie. 让我们坚持在请求时使用 s = requests.S ...

  6. Python之Requests的高级用法

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

  7. Requests库的文档高级用法

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

  8. 爬虫 requests模块高级用法

    一 介绍 #介绍:使用requests可以模拟浏览器的请求,比起之前用到的urllib,requests模块的api更加便捷(本质就是封装了urllib3) #注意:requests库发送请求将网页内 ...

  9. Python中第三方库Requests库的高级用法详解

    Python中第三方库Requests库的高级用法详解 虽然Python的标准库中urllib2模块已经包含了平常我们使用的大多数功能,但是它的API使用起来让人实在感觉不好.它已经不适合现在的时代, ...

随机推荐

  1. C语言程序设计第四次作业

    态度决定一切,我依然要说这句话,每次同学们提交的作业,我都会认真评阅,相比实验课而言,可以有更充足的时间来发现问题,很多同学的代码依然会存在一些语法错误或者考虑不周全的现象,我提出了,那么,你认真看了 ...

  2. 通过docker-machine和etcd部署docker swarm集群

    本片文章介绍一下 使用docker-machine 搭建docker swarm 集群:docker swarm是docker 官方搭建的容器集群编排工具:容器编排,就是可以使你像使用一太机器一样来使 ...

  3. sync_with_stdio

    /* The synchronization referred to is @e only that between the standard * C facilities (e.g., stdout ...

  4. Android 游戏教程让人物动起来

    在这里给大家分享Android游戏教程怎样让人物动起来,话不多说了,直接进入正题. 一. 准备工作     首先要准备好要使用的人物动作图和地形图.把它分割成16个不同的动作,循环播放同一行的4个不同 ...

  5. SpringMVC接收Post的实体/JSon数据

    接口代码: @ResponseBody @RequestMapping(value = "/test",method = RequestMethod.POST)/*只允许POST方 ...

  6. php正则,删除字符串中的中英文标点符号

    原理很简单,正则查找字符串,然后替换 英文标点符号,正则中有专用的模式来匹配.中文则需要一一列举 代码: <?php $str = "!@#$%^&*(中'文::﹑•中'文中' ...

  7. 使用if else if else 统计计算

    package review20140419;/* * 统计一个班级的成绩,并统计优良中差和不及格同学个数以及求平均分 */public class Test2 {    //程序的入口    pub ...

  8. mysql 信息查询

    show tables information 除了查询数据,管理数据之外,还有其他方面的信息方便和约束着   -- show information about characterset,查询mys ...

  9. iOS学习之iOS沙盒(sandbox)机制和文件操作之NSFileManager(三)

    1.在Documents里创建目录 创建一个叫test的目录,先找到Documents的目录, NSArray *paths = NSSearchPathForDirectoriesInDomains ...

  10. Swift中文教程 第2章 基本运算符 (20140604更新)

    今天我在下午又进行了新的翻译,之前我翻译的大家有没有看啊,感觉如何,我昨天下午不小心点了什么原先的文章都没了,大家的评论也没了,现在我也找不回来了,希望大家能继续给我新的评论和支持点个推荐,毕竟现在学 ...