前言

在上一章节我们对requests库的基本功能进行了介绍,当然request在处理会话,https等方面也非常方便。

文件上传

我们知道 requests 可以模拟提交一些数据。 假如有的网站需要上传文件,我们也可以用它来实现, 这非常简单,示例如下:

import requests

files = {'file ' : open (’favicon.ico’,'rb’)}

r = requests.post(”http://www.xtuz.net”, files=files)

print(r.text)

当然也可以显式地设置文件名,文件类型和请求头:

>>> url = 'http://www.xtuz.net'

>>> files = {'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})}

>>> r = requests.post(url, files=files)

>>> r.text

处理Cookies

如果直接使用Python的标准库urllib 处理Cookies,比较复杂,而有了 requests,获取和设置 Cookies 只需一步即可完成。

获取cookies

import requests

r = requests.get('https://www.baidu.com')

print(r.cookies)

for key, value in r.cookies.items():

print(key + '=' + value)

设置cookies

import requests

r = requests.cookies.RequestsCookieJar()

jar.set('abc', 'test')

r = requests.get('http://www.xtuz.net', cookies=jar, headers =headers)

print(r.text)

处理会话

在 requests 中,如果直接利用 get()或 post()等方法的确可以做到模拟网页的请求,但是这实际 上是相当于不同的会话,也就是说相当于你用了两个浏览器打开了不同的页面。 那么对于登录操作来说就没办法模拟了。

别担心,通过requests我们有更简单的解决方法。解决这个问题的主要需要是维持同一个会话。

但是我又不想每次设置 cookies ,那该怎么办呢?这时候就可以通过Session 对象来实现。利用它,我们可以方便地维护一个会话,而且不用担心 cookies 的问题,它会帮我们自动处理好。

它会在同一个 Session 实例发出的所有请求之间保持 cookies。如果你向同一主机发送多个请求,底层的 TCP 连接将会被重用,从而带来显著的性能提升。

import requests

s = requests. Session()

r = s.get('http://www.xtuz.net')

print(r.text)

会话还可以用作上下文管理器:

with requests.Session() as s:

s.get('http://www.xtuz.net')

这样就能确保退出后会话能被关闭,即使发生了异常也一样。

会话通常用于模拟登录成功之后再进行下一步的操作,在平常用得非常广泛,可以用于模拟在一个浏览器中打开同一站点的不同页面。

处理SSL证书验证

requests 还提供了证书验证的功能。 当发送 HTTP 请求的时候,它会检查 SSL 证书。

默认是自动验证,但是通过设置verify参数为False的话,可以取消验证。

大家都知道12306是一个自己颁布的根证书,所以对于它的验证,我们需要通过下面这种方式:

import requests

r = requests.get("https://www.12306.cn", verify=False)

print(r.status_code)

输出:

/usr/lib/python3/dist-packages/urllib3/connectionpool.py:794: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.org/en/latest/security.html

InsecureRequestWarning)

200

可以看到结果返回中建议我们给它指定证书。

我们也可以指定一个本地证书用作客户端证书,这可以是单个文件(包含密钥和证书)或 一个包含两个文件路径的元组:

import requests

response = requests.get("https://www.12306.cn", cert=("/path/server.crt", "/path/key"))

print(response.status_code)

设置代理

如果需要使用代理你可以通过为任意请求方法提供 proxies 参数来配置单个请求:

import requests

proxies = {

"http": "http://10.10.1.10:3128",

"https": "http://10.10.1.10:1080",

}

requests.get("http://www.xtuz.net", proxies=proxies)

也可以通过环境变量 HTTP_PROXY 和 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://www.xtuz.net")

若代理需要使用HTTP Basic Auth,可以使用 http://user:password@host/ 语法:

proxies = {

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

}

除了基本的 HTTP 代理外, requests 还支持 SOCKS 协议的代理

首先,需要安装 socks 这个库:

pip3 install requests[socks]

然后就可以使用 SOCKS 协议代理了,示例如下:

import requests

proxies = { "http": "sockss://user:password@host:port", "https": "sockss://user:password@host:port"}

requests.get("https://www.taobao.com", proxies=proxies)

超时设置

为防止服务器不能及时响应,大部分发至外部服务器的请求都应该带着 timeout 参数。在默认情况下,除非显式指定了 timeout 值,requests 是不会自动进行超时处理的。如果没有 timeout,你的代码可能会挂起若干分钟甚至更长时间。

连接超时指的是在你的客户端实现到远端机器端口的连接时(对应的是connect()_),Request 会等待的秒数。一个很好的实践方法是把连接超时设为比 3 的倍数略大的一个数值,因为 TCP 数据包重传窗口 (TCP packet retransmission window) 的默认大小是 3。

一旦你的客户端连接到了服务器并且发送了 HTTP 请求,读取超时指的就是客户端等待服务器发送请求的时间。(特定地,它指的是客户端要等待服务器发送字节之间的时间。在 99.9% 的情况下这指的是服务器发送第一个字节之前的时间)。

如果你设置了一个单一的值作为 timeout,如下所示:

r = requests.get("https://github.com", timeout=5)

这一 timeout 值将会用作 connect 和 read 二者的 timeout。

如果要分别制定,就传入一个元组:

r = requests.get('https://github.com', timeout=(3.05, 27))

准备的请求(Prepared Request)

在标准的urllib中,我们可以将请求表示为数据结构,其中各个参数都可以通过一个 Request 对 象来表示。

这在 requests 里同样可以做到,这个数据结构就叫 Prepared Request

from requests import Request, Session

s = Session()

req = Request('GET', url,

data=data,

headers=header

)

prepped = req.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

)

print(resp.status_code)

有了 Request 这个对象,就可以将请求当作独立的对象来看待,这样在进行队列调度时会非常方便。

小结

除了以上的高级功能外, Requests还有其他的高级用法,包括事件钩子、阻塞和非阻塞等,我们将会在其他的章节中进行介绍。

相关阅读

高中python公开课怎么上好_Python公开课 - Requests高级功能相关推荐

  1. python 3.8 新特性_Python 3.8六大新功能

    近期,Python 3.8已经发布. 不过别担心,小芯已经为你总结好了Python 3.8中每个新手都应该掌握的6大新功能. IT业日新月异,落后的Python 2将在2020年逐渐被淘汰. 2019 ...

  2. 列举python的5个数据类型_python公开课|新公布的5个python核心数据类型,这些细节你难道还不不知道吗...

    [摘要]在这个科学技术高速发展的时代,越来越多的人都开始选择学习编程软件,那么首先被大家选择的编程软件就是python,也用在各行各业之中,并被大家所熟知,所以也有越来越多的python学习者关注py ...

  3. python与机械教育初探_Python公开课-机械学习之手写识别

    授课讲师 讲师尹强 职务高级讲师.项目经理 多年互联网开发经验与授课经验,曾参与某知名家具电商网站.车友商城.物流系统的开发设计,善于使用多种技术解决技术问题和优化网站的性能和提高网站速度,开发经验丰 ...

  4. python的字符串包括哪些_python公开课|Python字符串包含什么,我们应该怎么用

    [摘要]在这个科学技术高速发展的时代,越来越多的人都开始选择学习编程软件,那么首先被大家选择的编程软件就是python,也用在各行各业之中,并被大家所熟知,所以也有越来越多的python学习者关注py ...

  5. python列表添加元素、输出_python公开课|Python列表添加元素的方法可是python的基础之一,如果不会怎么行呢...

    [摘要]在这个科学技术高速发展的时代,越来越多的人都开始选择学习编程软件,那么首先被大家选择的编程软件就是python,也用在各行各业之中,并被大家所熟知,所以也有越来越多的python学习者关注py ...

  6. python中count的作用_python中函数COUNT()的功能是什么

    python中函数COUNT()的功能是统计字符串里某个字符出现的次数,语法为[str.count("char", start,end)],其中str为要统计的字符,star为索引 ...

  7. python 接收邮件服务器地址_python实现的接收邮件功能示例【基于网易POP3服务器】...

    本文实例讲述了python实现的接收邮件功能.分享给大家供大家参考,具体如下: 一 简介 本代码实现从网易POP3服务器接收邮件 二 代码 import poplib import re import ...

  8. python爬火车票是不是违法_python利用selenium+requests+beautifulsoup爬取12306火车票信息...

    在高速发展的时代.乘车出远门是必不可少的,有些查询信息是要收费的.这里打造免费获取火车票信息 想要爬取12306火车票信息,访问12306官方网站,输入出发地,目的地  ,时间  之后点击确定,这是我 ...

  9. python 中csv怎么用_python中不同的CSV功能和使用

    在之前的文章中介绍过为什么python学习中会使用CSV文件格式?这边文章将会详细介绍python中不同的CSV功能和使用. 一.CSV模块功能 在CSV模块下,可以找到以下功能 二.Python中C ...

  10. python pip安装报错_python pip安装requests时报错,怎么解决

    展开全部 Traceback (most recent call last): File "/home/xiaoduc/.pyenv/versions/3.5.0/lib/python3.5 ...

最新文章

  1. 2013 Multi-University Training Contest 5 部分解题报告
  2. 158行代码!程序员复现DeepMind图像生成神器
  3. java web mvc思想介绍
  4. map for循环_Java_foundations_1 如何遍历Map
  5. python中异常的处理及断言,包括异常类型、异常捕获、主动跑出异常和断言
  6. java对xml文件的解析_Java对XML文件的解析
  7. 监控聚币网行情 并实时发送到微信
  8. Codeforces Round #650 (Div. 3)(A-C)
  9. 系统架构师学习笔记-系统开发基础知识(二)
  10. datagridview 绑定list 不能刷新界面_人人都可写代码-H5零基础编程-发布活动界面实操07...
  11. mysql more和tail_cat、less、more、head、tail这几个命令区别
  12. 理解vue中$watch使用
  13. [深度学习]反向传播的微分原理
  14. 图论算法——无向图的深度优先搜索和广度优先搜索
  15. fcntl函数与整数常量O_ACCMODE
  16. 欢庆博客达到V5级别,感恩所有程序员
  17. java怎么制作网页_如何制作网页
  18. 托业词汇汇总(修订版)
  19. 计算机视觉基础教程笔记索引
  20. 我的世界中国版服务器家园系统,《我的世界》中国版“暑期更新”上线 家园系统休闲玩法亮点...

热门文章

  1. 使用ELK在DC / OS中进行日志管理
  2. 五种常用web服务器jvm参数设置
  3. 一位程序员和他的程序员老婆分手了,原因竟是…
  4. Windows Registry
  5. 【LINUX 学习】查看和修改主机名
  6. hdu 5437Alisha’s Party(优先队列)
  7. Android--sharepreference总结
  8. Centos 6.2 快速配置vsftpd虚拟用户
  9. weblogic正常启动,但是告警:Could not get configuration lock used to serialize access to c
  10. 79.iOS 设备的UI规范和iOS各控件默认高度