如何向同一页面发送多次HTTP请求且不造成过高服务器CPU占用
优化方案
你当前代码的核心问题是循环内无间隔发送请求,短时间会产生大量请求打到目标服务器,导致服务端负载升高。可以通过以下方案优化:
- 增加固定请求间隔,降低请求频率
这是成本最低、见效最快的优化方式,每次请求处理完成后休眠固定时长,将请求频率控制在合理范围内,避免对服务端造成冲击。可根据业务对结果的敏感度调整间隔时长,比如要求低延迟的场景可以设为0.5秒,无特殊要求的场景设为1-5秒都可以。
同时你原有代码存在time模块被变量覆盖的风险,以及缺少单请求超时控制、请求异常处理的问题,优化后的代码示例如下:
import time import requests import re # pattern、matches初始化逻辑保持不变 if matches is None: txt = "No answer til now" print(txt) Solution = False start = time.time() interval = 0 # 自定义请求间隔,单位:秒 gap = 1 while interval < 180: try: # 增加单请求超时,避免网络波动导致整体逻辑超时不准 response = requests.get("page address", timeout=10) # 主动抛出4xx、5xx类的请求错误 response.raise_for_status() subject = response.text matches = re.search(pattern, subject, re.IGNORECASE) if matches is not None: Solution = matches.group(1) # 修正变量名,避免覆盖导入的time模块 cost = "{:.2f}".format(time.time()-start) txt = f"Found an answer {Solution} time needed : {cost}" print(txt) break except requests.exceptions.RequestException as err: # 可根据需求调整错误处理逻辑,此处仅打印日志继续重试 print(f"请求异常:{str(err)}") # 请求结束后休眠,降低频率 time.sleep(gap) interval = time.time()-start else: Solution = matches.group(1)
- 异步请求方案(对应你提到的PHP
curl_multi_select思路)
PHP的curl_multi_select是异步IO实现多请求监听的方案,Python场景下可以使用aiohttp+asyncio实现同等能力,该方案更适合你后续需要同时监听多个目标页面的场景,资源占用比多线程同步请求更低。如果你的需求只有单个目标页面,使用上面的同步加休眠方案就足够,不需要额外引入异步复杂度。
内容的提问来源于stack exchange,提问作者A.P Carvalho
相关产品推荐
相关产品推荐

