为什么通过Python的`requests`发送的请求比在Postman中耗时几乎长了七倍?
为什么通过Python的`requests`发送的请求比在Postman中耗时几乎长了七倍?
我目前正在使用Python 2.7中的requests.post()
进行HTTP Post请求,大约需要700毫秒的时间。虽然没有代理服务器导致延迟,但我仍然绕过任何代理,因为这似乎是该库的问题。\n然而,我对这个时间感到好奇,因为我认为对于大约230个字符的回答来说,这个时间太长了。所以我尝试在Postman中进行相同的请求。结果是Postman中的请求只需要不到100毫秒的时间!这对于我要完成的任务来说更合适。这一切都与时间有关。\n我想知道requests.post()
中是否有任何特定的参数需要设置,或者这个函数只是这么慢?\n当前请求的代码如下(非常基本的内容):\n
req = requests.post(url, json={"Username": username, "Password": password, "TerminalNo": terminalno)}) json = req.json()
\n如果需要的话,以下是服务器的头部信息:\n
cache-control →private content-length →228 content-type →application/json; charset=utf-8 date →Mon, 30 Jul 2018 17:58:05 GMT server →Microsoft-IIS/7.5 x-aspnet-version →2.0.50727 x-powered-by →ASP.NET
为什么使用Python的`requests`库发送请求比在Postman中发送请求的时间要慢近7倍?
这可能是由于服务器的响应格式不正确,导致解析问题。
您可以通过不读取从服务器接收到的响应来进行检查。如果代码仍然很慢,那么问题不在于解析响应;但如果这样修复了问题,那么问题可能出在解析响应上。
可能的原因和解决方法如下:
1. 如果某些请求头设置不正确,可能会导致解析错误,从而阻止了分块传输(来源:链接)。
2. 在其他情况下,手动设置编码可能会解决解析问题(来源:链接)。
为了解决这些问题,可以尝试以下方法:
req = requests.post(url, json={"Username": username, "Password": password, "TerminalNo": terminalno)}) r.raw.chunked = True # 修复问题1 r.encoding = 'utf-8' # 修复问题2 json = req.json()
问题未解决?
如果上述方法没有解决您的问题,我在这里收集了一些其他可能的解决方法。
为什么Python的requests库发送请求的时间比Postman慢近七倍?
问题原因:
1.可能是因为requests库在发送请求时,会自动处理一些额外的步骤,比如重定向、代理等,这些额外的步骤会增加请求的时间。
2.requests库使用的是Python解释器,而Postman使用的是C++编写的底层库,C++的执行速度通常比Python快。
解决方法:
1.尝试使用http.client库发送请求,这个库比requests库更底层,可能会更快。
代码示例:
import http.client import json import time conn = http.client.HTTPSConnection("example.com") payload = {'Username': 'username', 'Password': 'password', 'TerminalNo': 'terminalno'} body = json.dumps(payload) headers = { 'authorization': 'XXXXXX-XXXX-XXXX-XXXX-XXXXXXXXX', 'x-api-key': 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' } for i in range(10): start = time.time() conn.request("GET", "/", body, headers) res = conn.getresponse() data = res.read() response_time = time.time() - start print('{} {} ms'.format(i+1, round(response_time * 1000)))
结果:
1 906 ms 2 215 ms 3 193 ms 4 219 ms 5 203 ms 6 223 ms 7 210 ms 8 282 ms 9 204 ms 10 204 ms
这段代码使用http.client库发送请求,并输出了请求的响应时间。从结果可以看出,使用http.client库发送请求的时间比使用requests库快得多。
为什么使用Python的`requests`库发送请求要比在Postman中慢近七倍?
这个问题的出现原因可能是:默认情况下,`requests.get(...)`或者`requests.post(...)`方法不使用会话(session)。因此,每次调用这些方法时,都会重新配置连接和其他网络设置。
这就是为什么每次请求都需要花费很长时间,且与之前的请求花费的时间相同。
为了解决这个问题,我们可以使用会话(session)。
import requests url_call = "https://en.wikipedia.org/wiki/Jamal_Nazrul_Islam" session = requests.Session() session.get(url_call)
通过使用会话(session),第一次调用会花费较长时间。但是从第二次调用开始,在同一个域名下,花费的时间会大大减少。
我的实验结果:
第一次调用:2154毫秒
第二次调用:318毫秒
第三次调用:124毫秒
第四次调用:125毫秒