如何测量Python脚本指定代码段所消耗的互联网流量大小
统计这段Python代码流量消耗的可行方案
方案1:直接计算请求/响应字节数(无额外依赖)
你当前使用的urllib.request.urlopen(你代码里的uReq应该是该方法的别名)发起请求的流量主要由请求头、响应头、响应体三部分构成,直接计算三部分的字节和即可:
import urllib.request test_url = "替换为你的目标URL" req = urllib.request.Request(test_url) with urllib.request.urlopen(req) as uClient: # 计算请求头字节数 req_header_str = "\r\n".join([f"{k}: {v}" for k, v in req.header_items()]) request_size = len(req_header_str.encode("utf-8")) # 计算响应头字节数 response_header_size = len(uClient.info().as_string().encode("utf-8")) # 计算响应体字节数 testpage_html = uClient.read() response_body_size = len(testpage_html) # 总流量(单位:字节) total_traffic = request_size + response_header_size + response_body_size print(f"总流量:{total_traffic} B / {total_traffic/1024:.2f} KB / {total_traffic/1024/1024:.2f} MB")
该方案优势是实现简单无需额外依赖,误差可以控制在1%以内;缺点是默认不会统计3XX重定向过程中产生的跳转流量,如需统计需要自行实现重定向逻辑的流量累加。
方案2:进程级网络IO统计(包含底层网络开销)
如果需要统计TCP握手、DNS查询、重定向等所有底层网络流量,可以借助psutil库统计代码执行前后当前进程的网络IO差值:
- 先安装依赖:
pip install psutil - 代码实现:
import psutil import urllib.request test_url = "替换为你的目标URL" current_process = psutil.Process() # 记录执行前的网络收发字节数 io_before = current_process.io_counters() send_before, recv_before = io_before.write_bytes, io_before.read_bytes # 执行你的原有业务代码 uClient = urllib.request.urlopen(test_url) testpage_html = uClient.read() uClient.close() # 记录执行后的网络收发字节数 io_after = current_process.io_counters() send_after, recv_after = io_after.write_bytes, io_after.read_bytes # 总流量 = 发送增量 + 接收增量 total_traffic = (send_after - send_before) + (recv_after - recv_before) print(f"总流量:{total_traffic} B")
该方案优势是可以覆盖所有网络层面的开销,自动统计重定向等跳转流量;缺点是如果代码执行期间当前Python进程有其他网络操作,会被合并计入流量统计,适合单线程、仅当前请求发起网络调用的场景。
方案3:抓包统计(适合精准调试场景)
如果需要完全精准的流量统计,可以给urllib配置本地代理,通过Charles、Fiddler等抓包工具直接捕获所有请求流量,也可以通过mitmproxy的Python SDK在代码内自动完成流量统计,适合需要排查流量明细的复杂场景。
内容的提问来源于stack exchange,提问作者Fantarics
相关产品推荐
相关产品推荐

