您当前的位置:首页 > 电脑百科 > 网络技术 > 网络知识

HTTP请求:Requests的进阶使用方法浅析

时间:2023-06-28 16:38:23  来源:京东云开发者  作者:


1 背景

上篇文章讲解了 requests 模块的基础使用,其中有 get、put、post 等多种请求方式,使用 data、json 等格式做为请求参数,在请求体中添加请求头部信息的常见信息,如:headers、cookies,以及对请求响应的处理方法。接下来讲解一下 requests 的高级用法。

2 进阶方法举例

2.1 requests.request()

method:提交方式(get|post);

url:提交地址;

kwargs:14 个控制访问的参数;

常用的参数有:params、data、json、headers、cookies,已在上篇文章中介绍过了,感兴趣的朋友,可以到上篇文章再回顾一下。以下将讲解与示例其他参数的使用。

示例:

2.1.1 files

请求携带文件,如果有的请求需要上传文件,可以用它来实现。

import requests

# 上传文件

f= {"files": open("favicon.ico", "rb") }

data = {"name": "上传文件"}

requests.request(

method = 'POST',

url = 'http://127.0.0.1:8080/example/request',

data = data,

files = f

需注意:favicon.ico 文件需和当前脚本在同一目录下,如果不在,可以将文件名称修改为文件路径

import requests

from requests.auth import HTTPBasicAuth, HTTPDigestAuth

# 1、Basic Auth认证

res = requests.request(

method = 'GET',

url = 'http://127.0.0.1:8080/example/request',

auth = HTTPBasicAuth("username", "password")

res.encoding = "gbk"

print(res.status) # 200

# 2、DIGEST 认证

res = requests.request(

method = 'GET',

url = 'http://127.0.0.1:8080/example/request',

auth = HTTPDigestAuth("username", "password")

res.encoding = "gbk"

print(res.status) # 200

http auth 认证的两种方式,分别为 Basic 方式和 Digest 认证,其中:Basic Auth 的优点是提供简单的用户验证功能,其认证过程简单明了,适合于对安全性要求不高的系统或设备中;同样存在缺点:输入的用户名,密码 编码后会出现在 Authorization 里,很容易被解析出来。

那么 Digest 对比 Basic 认证有什么不同呢?

  • Digest 思想,是使用一种随机数字符串,双方约定好对哪些信息进行哈希运算,即可完成双方身份的验证。Digest 模式避免了密码在网络上明文传输,提高了安全性,但它依然存在缺点,例如认证报文被攻击者拦截到攻击者可以获取到资源。
  • DIGEST 认证提供了高于 BASIC 认证的安全等级,但是和 HTTPS 的客户端认证相比仍旧很弱。
  • DIGEST 认证提供防止密码被窃听的保护机制,但并不存在防止用户伪装的保护机制。
  • DIGEST 认证和 BASIC 认证一样,使用上不那么便捷灵活,且仍达不到多数 Web 网站对高度安全等级的追求标准。因此它的适用范围也有所受限。

2.1.2 timeout

请求和响应的超时时间,在网络响应延迟或者无响应时,可以通过设置超时时间,避免等待。

import requests

# 设置请求超时1秒,1秒后无响应,将抛出异常,1秒为connect和read时间总和

requests.request(

method = 'POST',

url = 'http://127.0.0.1:8080/example/request',

json = {'k1' : 'v1', 'k2' : 'v2'},

timeout = 1

# 分别设置connect和read的超时时间,传入一个数组

requests.request(

method = 'POST',

url = 'http://127.0.0.1:8080/example/request',

json = {'k1' : 'v1', 'k2' : 'v2'},

timeout = (5, 15)

# 永久等待

requests.request(

method = 'POST',

url = 'http://127.0.0.1:8080/example/request',

json = {'k1' : 'v1', 'k2' : 'v2'},

timeout = None

# 或者删除timeout参数

# 捕捉超时异常

from requests.exceptions import ReadTimeout

try:

res = requests.get('http://127.0.0.1:8080/example/request', timeout=0.1)

print(res.status_code)

except ReadTimeout:

print("捕捉到超时异常")

2.1.3 allow_redirects

设置重定向开关。

>>> import requests

>>> r = requests.get('http://Github.com')

>>> r.url

'https://github.com/'

>>> r.status_code

200

>>> r.history

[<Response [301]>]

# 如果使用GET、OPTIONS、POST、PUT、PATCH或DELETE,则可以使用allow_redirects参数禁用重定向

>>> r = requests.get('http://github.com', allow_redirects=False)

>>> r.status_code

301

>>> r.history

[]

# 用HEAD启动重定向

>>> r = requests.head('http://github.com', allow_redirects=True)

>>> r.url

'https://github.com/'

>>> r.history

[<Response [301]>]

import requests

import re

# 第一次请求

r1=requests.get('https://github.com/login')

r1_cookie=r1.cookies.get_dict() #拿到初始cookie(未被授权)

authenticity_token=re.findall(r'name="authenticity_token".*?value="(.*?)"',r1.text)[0] #从页面中拿到CSRF TOKEN

# 第二次请求:带着初始cookie和TOKEN发送POST请求给登录页面,带上账号密码

data={

'commit':'Sign in',

'utf8':'✓',

'authenticity_token':authenticity_token,

'login':'xxxxxx@qq.com',

'password':'password'

}

# 测试一:没有指定allow_redirects=False,则响应头中出现Location就跳转到新页面,

# r2代表新页面的response

r2=requests.post('https://github.com/session',

data=data,

cookies=r1_cookie

print(r2.status_code) # 200

print(r2.url) # 看到的是跳转后的页面

print(r2.history) # 看到的是跳转前的response

print(r2.history[0].text) # 看到的是跳转前的response.text

# 测试二:指定allow_redirects=False,则响应头中即便出现Location也不会跳转到新页面,

# r2代表的仍然是老页面的response

r2=requests.post('https://github.com/session',

data=data,

cookies=r1_cookie,

allow_redirects=False

print(r2.status_code) # 302

print(r2.url) # 看到的是跳转前的页面https://github.com/session

print(r2.history) # []

2.1.4 proxies

同添加 headers 方法一样,代理参数是 dict。

import requests

import re

def get_html(url):

proxy = {

'http': '120.25.253.234:812',

'https' '163.125.222.244:8123'

}

heads = {}

heads['User-Agent'] = 'Mozilla/5.0 (windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0'

req = requests.get(url, headers=heads,proxies=proxy)

html = req.text

return html

def get_ipport(html):

regex = r'<td data-title="IP">(.+)</td>'

iplist = re.findall(regex, html)

regex2 = '<td data-title="PORT">(.+)</td>'

portlist = re.findall(regex2, html)

regex3 = r'<td data-title="类型">(.+)</td>'

typelist = re.findall(regex3, html)

sumray = []

for i in iplist:

for p in portlist:

for t in typelist:

pass

pass

a = t+','+i + ':' + p

sumray.append(a)

print('代理')

print(sumray)

if __name__ == '__mAIn__':

url = 'http://www.baidu.com'

get_ipport(get_html(url))

某些接口增加了防骚扰模式,对于大规模且频繁的请求,可能会弹出验证码,或者跳转到登录验证页面,或者封禁 IP 地址,此时如果想要正常访问,可以通过设置代理来解决这个问题。

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

# 安装socks库

pip3 install "requests[socks]"

# 进行代理

import requests

proxies = {

'http': 'socks5://user:password@host:port',

'https': 'socks5://user:password@host:port'

}

res = requests.get('http://www.baidu.com', proxies=proxies)

print(res.status) # 200

2.1.5 hooks

即钩子方法,requests 库只支持一个 response 的钩子,即在响应返回时,可以捎带执行自定义方法。可以用于打印一些信息、做一些响应检查、或者向响应中添加额外的信息。

import requests

url = 'http://www.baidu.com'

def verify_res(res, *args, **kwargs):

print('url', res.url)

res.status='PASS' if res.status_code == 200 else 'FAIL'

res = requests.get(url, hooks={'response': verify_res})

print(res.text) # <!DOCTYPE html><!--STATUS OK--><html>

print(res.status) # PASS

2.1.6 stream

获取内容立即下载开关,response 会将报文一次性全部加载到内存中,如果报文过大,可以使用此参数,迭代下载。

import requests

url="http://www.baidu.com"

r = requests.get(url, stream=True)

# 解析response_body,以n分割

for lines in r.iter_lines():

print("lines:", lines)

# 解析response_body,以字节分割

for chunk in r.iter_content(chunk_size=1024):

print("chunk:", chunk)

2.1.7 verify

认证 SSL 证书开关,当发送 HTTPS 请求的时候,如果该网站的证书没有被 CA 机构信任,程序将报错,可以使用 verify 参数控制是否检查 SSL 证书。

# 1、直接设置

import requests

response = requests.get('https://www.12306.cn', verify=False)

print(response.status_code)

# 2、请求时虽然设置了跳过检查,但是程序运行时仍然会产生警告,警告中包含建议给我们的指定证书

# 可以通过设置,忽略屏蔽这个警告

from requests.packages import urllib3 # 如果报错,则直接引入import urllib3

# 3、屏蔽警告

urllib3.disable_warnings()

response = requests.get('https://www.12306.cn', verify=False)

print(response.status_code) # 200

# 4、通过cert直接声明证书

# 本地需要有crt和key文件(key必须是解密状态,加密状态的key是不支持的),并指定它们的路径,

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

print(response.status_code) # 200

2.2 requests 库的异常

如何判断是否出现异常呢?

2.2.1 raise_for_status()

该方法在内部判断 res.status_code 是否等于 200,不是则产生异常 HTTPError

示例:

# 1、HTTPError异常示例

import requests

from requests.exceptions import HTTPError

try:

res = requests.post("http://127.0.0.1:8080/example/post")

res.raise_for_status()

# 等同于

if res.status != 200:

raise HTTPError

return res

except HTTPError:

return False

2.2.2 ReadTimeout

该异常类型,将会捕捉到因请求 / 响应超时的请求。

# Timeout超时异常

import requests

from requests.exceptions import ReadTimeout

try:

res = requests.get('http://127.0.0.1:8080/example/post',timeout=0.5)

print(res.status_code)

return res

except ReadTimeout:

print('timeout')

2.2.3 RequestException

该异常类型,将会捕捉到因无请求引起的异常请求。

# RquestError异常

import requests

from requests.exceptions import RequestException

try:

res = requests.get('http://127.0.0.1:8080/example/post')

print(res.status_code)

return res

except RequestException:

print('reqerror')

3 总结

看到这里,大家应该明白了,requests 库是一个比 urilib2 模块更加简洁的第三方库,它具有如下的特点:

  • 支持 HTTP 连接保持和连接池
  • 支持使用 cookie、session 保持会话
  • 支持文件上传
  • 支持自动响应内容的编码
  • 支持国际化的 URL 和 Post 数据自动编码
  • 支持自动实现持久连接 keep-alive

因此,requests 这个高度封装的模块,可以使我们的 HTTP 请求,变得更加人性化,使用它将可以轻而易举的完成浏览器请求的任何操作,充分诠释了它的口号:“HTTP for Humans”。

 

作者:京东物流 骆铜磊
来源:京东云开发者社区


Tags:Requests   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
HTTP请求:Requests的进阶使用方法浅析
1 背景上篇文章讲解了 requests 模块的基础使用,其中有 get、put、post 等多种请求方式,使用 data、json 等格式做为请求参数,在请求体中添加请求头部信息的常见信息,如:headers...【详细内容】
2023-06-28  Search: Requests  点击:(175)  评论:(0)  加入收藏
requests库请求获取不到数据怎么办?不妨试试看这种妙法
作者:Python进阶者来源:Python爬虫与数据挖掘一、思路很多网站都对requests反爬了,这种时候,一般有两个选择,要不就找js接口,要不就用requests_html等其他工具,这里他使用了后者req...【详细内容】
2022-02-08  Search: Requests  点击:(484)  评论:(0)  加入收藏
requests 让接口测试如此简单
requests一、简介使用 python 做自动化接口测试需要用代码发送 http 请求。requests 是 Python 语言里网络请求库中最好用的,没有之一。requests 库有完善详尽的中文版官方...【详细内容】
2021-12-01  Search: Requests  点击:(267)  评论:(0)  加入收藏
如何使用requests通过代码实现接口测试自动化?
前言接口测试是我们在测试工作中经常见到的,我们工作中常用到的接口工具有jmeter,postman,soupUI等工具,那么在通过代码做接口测试呢?或者通过代码的方式做接口自动化呢? requests...【详细内容】
2021-07-23  Search: Requests  点击:(279)  评论:(0)  加入收藏
python爬虫04 | 长江后浪推前浪,Requests库urllib库拍在沙滩上
最近有些朋友看完小帅b的文章之后把小帅b的表情包都偷了还在我的微信疯狂发表情包嘚瑟我就呵呵了 只能说一句盘他还有一些朋友看完文章不点好看还来催更小帅b也只能说一句继...【详细内容】
2020-06-21  Search: Requests  点击:(446)  评论:(0)  加入收藏
一招大幅提升 requests 访问速度
作者:kingname我做了一个垃圾信息过滤的 HTTP 接口。现在有一千万条消息需要经过这个接口进行垃圾检测。 一开始我的代码是这样的:import requestsmessages = [&#39;第一条&#...【详细内容】
2020-03-16  Search: Requests  点击:(394)  评论:(0)  加入收藏
▌简易百科推荐
学生偷看“不良网站”,手机上3个痕迹无法清除,网友:咋不早说
众所周知,中国的常规教育中,总是“谈性色变”,但在这个信息爆炸的互联网时代,即便是一些年纪很小的孩子,也能轻易接触到一些所谓的不良网站,因此这一方面的教育缺失,其实是很可怕的...【详细内容】
2024-03-28    叶姐生活指南  Tags:不良网站   点击:(11)  评论:(0)  加入收藏
什么是网络中的路由器?核心功能解释
路由器是互联网连接的核心元素,是一种允许多个设备连接到互联网,并促进将数据包转发到各自的目标地址的设备。使用动态路由技术,路由器检查数据并在各种可用路径中选择最有效的...【详细内容】
2024-03-07    千家网  Tags:路由器   点击:(31)  评论:(0)  加入收藏
过年该不该升级Wi-Fi 7路由?看完就知道
打开电商网站不难发现,从2023年第三季度到现在,Wi-Fi 7路由器新品越来越多。而且价格不再是高高在上,已经基本和Wi-Fi 6路由价格差不多了。看到这些Wi-Fi 7新品路由,不少朋友就...【详细内容】
2024-02-27    中关村在线  Tags:Wi-Fi   点击:(36)  评论:(0)  加入收藏
聊聊 Kubernetes 网络模型综合指南
这篇详细的博文探讨了 Kubernetes 网络的复杂性,提供了关于如何在容器化环境中确保高效和安全通信的见解。译自Navigating the Network: A Comprehensive Guide to Kubernete...【详细内容】
2024-02-19  云云众生s  微信公众号  Tags:Kubernetes   点击:(38)  评论:(0)  加入收藏
SSL协议是什么?关于SSL和TLS的常见问题解答
SSL(安全套接字层)及其后继者TLS(传输层安全)是用于在联网计算机之间建立经过身份验证和加密的链接的协议。尽管SSL协议在 1999年已经随着TLS 1.0的发布而被弃用,但我们仍将这些...【详细内容】
2024-02-06  IDC点评网    Tags:SSL协议   点击:(69)  评论:(0)  加入收藏
从零开始了解网络协议:TCP/IP详解
从零开始了解网络协议:TCP/IP详解 在当今数字化的时代,网络协议已经成为我们生活中不可或缺的一部分。作为互联网的基础,网络协议规定了数据如何在不同的网络设备之间传输。TC...【详细内容】
2024-02-01    简易百科  Tags:TCP/IP   点击:(59)  评论:(0)  加入收藏
BGP路由属性:互联网路由的灵活控制器
在互联网的庞大网络中,边界网关协议(BGP)是确保不同自治系统(AS)间路由信息有效交换的关键协议。然而,BGP的功能远不止于此。其核心组成部分,即BGP路由属性,赋予了BGP强大的灵活性,使...【详细内容】
2024-01-26  诺诺爱生活    Tags:互联网路由   点击:(40)  评论:(0)  加入收藏
简易百科之什么是网络延迟?
简易百科之什么是网络延迟?随着互联网的普及和发展,网络已经成为我们生活中不可或缺的一部分。然而,我们在使用网络时可能会遇到一种情况,那就是网络延迟。那么,什么是网络延迟呢...【详细内容】
2024-01-24    简易百科  Tags:网络延迟   点击:(146)  评论:(0)  加入收藏
网络延迟与网络速度有什么区别?分享具体的答案
通常,许多人抱怨网速测试。速度还是不错的,但是他们玩游戏的时候怎么会卡住,还是断开连接等等问题,这一系列问题始终困扰着大家。那么,网络延迟与网络速度有什么区别呢?请不要担心...【详细内容】
2024-01-24  萌新小郭    Tags:网络延迟   点击:(50)  评论:(0)  加入收藏
揭秘IP地址的网络威胁与攻击类型
在当今数字化时代,网络攻击已经成为网络安全的一大挑战。IP地址,作为互联网通信的基础,也成为网络威胁和攻击的焦点之一。本文将深入探讨不同类型的网络威胁和攻击,以及如何防范...【详细内容】
2024-01-22  IP数据云    Tags:IP地址   点击:(77)  评论:(0)  加入收藏
站内最新
站内热门
站内头条