python接口自动化40-盘点requests那些不常用(面试经常问)的高级技能

前言

如果面试问你如何用 python 发 get/post 请求? 这种问题只要是个小白花10分钟随便看下博客都能学得会。
面试官如果知道你是资深的,还是初级的呢? 面试其实最喜欢考那些你不常用的功能(工作中用不到的),因为你用不到这些功能,所以会被你忽略!

代理功能

如何用 requests 库使用代理?
如果你没接触过爬虫,其实基本上用不到代理功能。平常公司的网络都是可以正常请求的,很少有这种需要使用代理的场景,当然也有个别公司网络管理的比较严。

requests 库的代理使用,在官方文档给了示例https://requests.readthedocs.io/zh_CN/latest/user/advanced.html#proxies
平常多看看官方文档就知道了

import requests

proxies = {
  "http": "http://10.10.1.10:3128",
  "https": "http://10.10.1.10:1080",
}

requests.get("http://example.org", proxies=proxies)

关于 https 证书

https 请求需用到 SSL 证书,平常我都是教大家简单省事一点,设置 verify=False 来忽略 SSL 证书的校验。
但是面试嘛,上面说到,你越是忽略的东西,它越是喜欢问你(其实没卵用,了解下什么是 SSL 证书就行了)

如果你本地已经有了证书,也可以指定本地的证书

获取响应时间

关于如何获取接口的响应时间,可以关注我前面这篇https://www.cnblogs.com/yoyoketang/p/8035428.html

响应时间的正确姿势应该是:r.elapsed.total_seconds(),单位是s

timeout超时

如果我们想设置timeout超时,设置超时为1s,那么就会抛出这个异常:requests.exceptions.ConnectTimeout: HTTPConnectionPool

import requests
r = requests.get("http://cn.python-requests.org/zh_CN/latest/", timeout=1)
print(r.elapsed)
print(r.elapsed.total_seconds())
print(r.elapsed.microseconds)

超时重试

如果跟主机连接失败超时后,我希望能再主动尝试连接几次,避免一超时就失败了,可以参考前面这篇https://www.cnblogs.com/yoyoketang/p/12961469.html

Requests 自带了一个传输适配器,也就是 HTTPAdapter。 这个适配器使用了强大的 urllib3,为 Requests 提供了默认的 HTTP 和 HTTPS 交互。
每当 Session 被初始化,就会有适配器附着在 Session 上,其中一个供 HTTP 使用,另一个供 HTTPS 使用。
(这个一般也用不到,爬虫的小伙伴爬数据失败的话,会用得上)

import requests
from requests.adapters import HTTPAdapter
s = requests.session()
# 上海-悠悠 QQ交流群:717225969


# max_retries=3 重试3次
s.mount('http://', HTTPAdapter(max_retries=3))
s.mount('https://', HTTPAdapter(max_retries=3))


url = "https://www.github.com/"
r = s.request("GET", url=url, timeout=15)
print(r.text)

这样每次请求超时15s,超时后会重试3次,最大请求时长45s.

Ajax 异步请求

什么是异步请求,什么是同步请求?

Ajax 即 “Asynchronous Javascript And XML”(异步 JavaScript 和 XML),是指一种创建交互式、快速动态网页应用的网页开发技术,无需重新加载整个网页的情况下,能够更新部分网页的技术。
通过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

可以参考前面这篇https://www.cnblogs.com/yoyoketang/p/14278002.html

添加头部参数 "X-Requested-With": "XMLHttpRequest" 即可

url = "http://49.235.x.x:8081/zentao/user-login.html"
h = {
    "X-Requested-With": "XMLHttpRequest"
}

body = {
    "account": "admin",
    "password": "yoyo123456",
    "passwordStrength": 1,
    "referer": "/zentao/",
    "verifyRand": "1014015280",
    "keepLogin": 1
}

r = requests.post(url, headers=h, data=body)
print(r.text)

requests 库一些常用插件

如何真正的模拟浏览器请求,渲染整个页面?

requests库发请求的时候,不会加载页面的js和css,所以并不是真正意义上的模拟浏览器发请求,很多新手以为等价于浏览器发请求。

requests-html终于可以支持JavaScript了,这就相当于是一个真正意义上的无界面浏览器了。
中文文档地址:https://cncert.github.io/requests-html-doc-cn/#/

也可以参考我前面这篇https://www.cnblogs.com/yoyoketang/p/10663392.html
这个插件其实工作中也用不到,工作中接口都是纯接口,这个一般也是爬虫的小伙伴会很实用。

原文地址:https://www.cnblogs.com/yoyoketang/p/14364701.html