Requests.get请求耗时突增问题求助(附Python相关代码)
Python Requests.get 请求耗时过长的排查与优化方案
核心问题定位
你的代码里有几个直接导致请求耗时飙升的问题:
- 重复请求同一个URL:if判断时发起一次
requests.get(),满足条件后又发起一次,同一个URL被请求两次,直接翻倍了请求耗时。 - 未复用HTTP连接:每次请求都新建TCP连接,重复消耗连接建立的开销,这在批量请求里会累积成巨大的时间浪费。
- 单元格访问效率低下:用
sheet["C"+str(i)]这种字符串拼接方式定位单元格,openpyxl对这种方式的解析效率远低于直接用cell(row, column)的方式,还额外增加了字符串拼接的开销。 - 无超时控制:如果某个请求遇到服务器无响应的情况,会一直阻塞等待,拖慢整个循环的进度。
- 串行请求效率瓶颈:1万+次请求串行执行,总耗时是单次请求耗时的累加,完全没利用并发提升效率。
基础优化代码(解决核心耗时问题)
先把最影响效率的重复请求、连接复用、单元格访问这几个问题解决,代码如下:
from openpyxl import load_workbook import requests # 只读模式加载Excel,提升大文件读取速度 wb = load_workbook(r"C:\TranslateMfestSite\ProductsInformation.xlsx", read_only=True) sheet = wb['Sheet'] Designer = 551 # 用Session复用HTTP连接,减少TCP连接建立开销 session = requests.Session() # 设置超时,避免请求卡住(连接超时5秒,读取超时15秒,可根据实际调整) timeout = (5, 15) for i in range(1, 14498): # 直接通过行列号定位单元格,避免字符串拼接 c_cell = sheet.cell(row=i, column=3) b_cell = sheet.cell(row=i, column=2) # 跳过空值,避免后续类型转换报错 if c_cell.value is None or b_cell.value is None: continue try: if int(c_cell.value) == Designer: url = str(b_cell.value) # 只请求一次URL,复用响应结果 response = session.get(url, timeout=timeout) response.raise_for_status() # 主动捕获HTTP错误(比如404、500) html_content = response.text if 'xlink:href="' in html_content: r = html_content # 这里添加你需要的后续处理逻辑 except (ValueError, requests.exceptions.RequestException) as e: # 捕获异常,避免单个请求失败导致整个循环中断 print(f"第{i}行处理失败: {str(e)}")
进一步优化方向
如果基础优化后速度还是不够,可以尝试以下方案:
- 并发请求:用多线程(比如
concurrent.futures.ThreadPoolExecutor)或异步请求(比如aiohttp)批量处理请求,把串行的耗时变成并行的,大幅压缩总耗时。注意线程数不要设置太高,避免触发目标服务器的限流机制。 - 排查网络与服务器状态:
- 用
curl或浏览器测试单个目标URL的响应时间,对比之前的正常情况,确认是网络变慢还是服务器响应变慢。 - 检查是否被目标网站限流(比如IP被限制访问频率),可以尝试降低请求频率或更换IP测试。
- 用
- 预筛选URL:先遍历Excel把所有符合条件的URL收集起来,再统一处理,避免在循环里同时做Excel读取和网络请求的混合操作。
内容的提问来源于stack exchange,提问作者Pythoner
相关产品推荐
相关产品推荐

