Python公开课 - Requests高级功能

前言

在上一章节我们对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还有其他的高级用法,包括事件钩子、阻塞和非阻塞等,我们将会在其他的章节中进行介绍。

相关阅读


相关推荐
  1. 大连沙河口区第四幼儿园 - 大连幼儿园黄页
  2. 杭州市萧山区劲松小学
  3. 警方通报:武汉男子持刀至五死一伤,嫌犯已跳桥
  4. 易中天给英雄武汉的一首诗 - 武汉新鲜事
  5. 武汉市洪山区丹阳双语幼儿园 - 武汉幼儿园黄页
  6. 武汉市育才第二寄宿小学(育才二小寄宿小学)
  7. Python公开课 - 基础数据类型
  8. 武汉女子网上做兼职被骗六十五万
  9. 武汉一女子七天被骗220万
  10. 南柯一梦
  11. 【干货】如何高效编写软件系统设计文档 - 含模板下载
  12. 技术破解钉钉打卡考勤 - 上班族专用完整解决方案
  13. 如何在Django项目中优雅的实现markdown和代码高亮
  14. 会说话的棉花包
  15. 仁义之家
  16.  巫师换心记
  17. Python公开课 - Requests基本功能
  18. 福州市琼河小学
  19. 南宁华侨投资区宁武小学
  20. 天津市武清区第二幼儿园 - 天津幼儿园黄页
  21. 癞蛤蟆的绝招
  22. 武汉推出越王勾践剑交通卡
  23. 奥迪客户不满加价,被武汉4S店销售群殴
  24. 雪公主
  25. 中山市沙溪镇云汉小学
  26. 上海碧江路小学
  27. 桂林全州县才湾金贝贝双语幼儿园 - 桂林幼儿园黄页
  28. 事发武汉农夫山泉矿泉水内惊现大量虫卵
  29. 勇敢的小仇尔卡
  30. Python的起源 - 二十年前的故事
  31. Python公开课 - Django配置极验证geetest教程
  32. 央媒聚焦!国庆假期173.78万人次打卡大美黄陂
  33. 深圳市宝安区弘雅小学
  34. 武汉动物园火烈鸟孔雀排队打疫苗
  35. 小乌龟找到了妈妈
  36. 如何正确升级pip3
  37. 皮皮买房记
  38. 湖北将发放消费券 - 武汉新鲜事
  39. 河北省邯郸市金贝贝幼儿园 - 邯郸幼儿园黄页
  40. HashMap底层结构与JVM内存模型 - 阿里技术面试
  41. 黄骅市旧城镇寺东村小学
  42. 大连市沙河口区超越口才亲子园 - 大连幼儿园黄页
  43. 河北省邯郸市北丛井幼儿园 - 邯郸幼儿园黄页
  44. Python源码剖析 - Python中的整数对象
  45. 中山市东区长江小学
  46. 长着外骨骼的小螃蟹
  47. 上海市虹口区溧三托儿所 - 上海幼儿园黄页
  48. 茂涵幼儿园 - 廊坊幼儿园黄页
  49. 深圳市南山区桃源街道龙光社区珠光幼儿园 - 深圳幼儿园黄页
  50. 宁波市镇安小学