AWS Lambda中Python requests.get对特定网站请求超时问题
解决AWS Lambda中requests.get()请求部分URL超时的问题
可能原因分析
- 网络配置限制:如果Lambda部署在自定义VPC内,未配置NAT网关则无法访问公网;即使在默认无VPC环境,部分网站可能屏蔽AWS公网IP段,导致请求被拦截或延迟。
- 反爬机制拦截:
nseindia.com和makemytrip.com这类网站有严格反爬策略,会识别云服务商IP并限制响应,引发超时。 - 请求头不完整:仅设置
User-Agent不足以模拟真实浏览器请求,缺少必要请求头会被识别为爬虫,导致拒绝或延迟响应。 - Lambda超时设置不足:Lambda默认超时为3秒,即使代码里设了
timeout=60,函数本身的超时限制会先触发中断。
解决方案
1. 修正Lambda网络配置
- 若Lambda在自定义VPC中:确保所在子网关联NAT网关,并配置正确路由表,让Lambda能通过NAT网关访问公网。
- 若Lambda在默认无VPC环境:尝试用AWS Global Accelerator为Lambda分配固定弹性IP,或通过CloudFront中转请求,规避目标网站的IP屏蔽。
2. 完善请求头,模拟真实浏览器
补充浏览器常用请求头,降低被反爬识别的概率:
import json import requests def lambda_handler(event, context): url3 = 'https://www.nseindia.com/' header = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8', 'Accept-Encoding': 'gzip, deflate, br', 'Accept-Language': 'en-US,en;q=0.5', 'Connection': 'keep-alive', 'Upgrade-Insecure-Requests': '1' } # 使用会话保持模拟浏览器会话 session = requests.Session() session.headers.update(header) response = session.get(url=url3, allow_redirects=False, timeout=60) for i in response.cookies: print(i.name +"==>>", i.value) return
3. 调整Lambda函数超时时间
- 登录AWS Lambda控制台,找到目标函数。
- 进入配置→常规配置→编辑。
- 将超时时间设置为60秒或更长(最长支持15分钟),确保函数有足够时间等待响应。
4. 优先使用官方API
部分网站(如nseindia.com)提供官方API接口,建议优先使用官方API替代网页抓取,既避免触发反爬机制,也符合网站使用条款。
测试建议
- 在Lambda中添加简单连通性测试,用
requests.head()快速验证目标网站是否可达:
response = session.head(url=url3, timeout=10) print(response.status_code)
- 逐步添加请求头,观察请求成功率变化,定位缺失的关键请求头。
内容的提问来源于stack exchange,提问作者Saptarsi Basu
相关产品推荐
相关产品推荐

