You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

运行Python的AWS Lambda出现HTTPS Read Timeout问题求助

问题分析与解决建议

本地运行代码完全正常,Lambda中其他出站请求也能正常工作,但调用https://api.nasdaq.com/api/calendar/dividends时偶尔出现超时(本地该接口响应耗时不到1秒,Lambda设置60秒超时仍报错:Exception: HTTPSConnectionPool(host='api.nasdaq.com', port=443): Read timed out. (read timeout=60)),以下是针对性的解决思路:

1. 应对Nasdaq API反爬限制

Nasdaq公开API可能对AWS Lambda这类服务器端IP的请求做了限流或拦截:

  • 优化请求头:当前User-Agent过于简略,替换成更贴近真实浏览器的UA,比如Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36,同时添加Referer: https://www.nasdaq.com/字段,模拟普通用户访问路径。
  • 控制请求频率:短时间内不要重复发起请求,添加1-3秒的随机延迟,避免被判定为爬虫。

2. 优化Lambda网络配置

Lambda的网络环境可能是超时诱因:

  • 检查VPC配置:如果Lambda部署在VPC内,确认NAT网关带宽充足、路由规则正确;若无需VPC,切换到Lambda默认网络环境,共享IP池的影响可能更小。
  • 启用预留并发:如果请求量较大,预留并发能让Lambda实例保持暖状态,避免冷启动带来的额外延迟,降低超时概率。

3. 细化超时设置

当前仅设置了总超时60秒,拆分连接超时和读取超时能更精准控制:

# 拆分超时参数:连接超时10秒,读取超时50秒
page = requests.get(self._url(), headers=self._headers(), params=params, timeout=(10, 50))

这样连接阶段卡住时会更快抛出异常,避免无意义等待。

4. 添加重试机制

针对偶尔的超时,通过重试提升成功率,示例用tenacity库实现指数退避重试:

from tenacity import retry, stop_after_attempt, wait_exponential

@retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=2, max=10))
def _scraper(self) -> dict:
    params = {'date': self._date_str()}
    page = requests.get(self._url(), headers=self._headers(), params=params, timeout=(10, 50))
    page.raise_for_status()  # 主动抛出HTTP状态码异常
    return page.json()

5. 校准日期参数时区

Lambda默认时区可能和本地不一致,虽然不直接导致超时,但日期格式异常可能引发接口慢响应,建议指定时区生成日期:

from datetime import datetime, timezone

def _date_str(self) -> str:
    date_obj = datetime.now(timezone.utc)
    return date_obj.strftime('%Y-%m-%d')

内容的提问来源于stack exchange,提问作者Jonathan Harker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 14:23:22