AWS Lambda调用dan.me.uk/torlist遇403错误求助
解决AWS Lambda调用Tor节点列表接口返回403的问题
原因分析与解决方案
1. 云IP被站点反爬机制拦截
https://www.dan.me.uk/torlist/这类公共列表站点通常会屏蔽云服务商(包括AWS Lambda)的出口IP段,因为云IP常被用于批量爬取,直接触发反爬规则。
解决办法:
- 给Lambda配置固定出口IP:将Lambda部署到VPC内,搭配NAT网关使用弹性IP,让请求的出口IP固定。若站点支持白名单申请,可将该IP提交给站点方解锁。
- 更换稳定的Tor节点数据源:改用Tor官方提供的出口节点列表接口
https://check.torproject.org/torbulkexitlist,该接口对自动化请求的兼容性更好,反爬限制更少。
2. 请求头配置不完整
仅添加User-Agent可能不足以通过站点验证,部分站点会校验Accept等其他请求头字段。
修改后的代码示例:
from urllib import request def is_tor_ip(ip_address): tor_list_url = "https://check.torproject.org/torbulkexitlist" # 配置完整请求头模拟正常浏览器请求 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36', 'Accept': 'text/plain, */*' } try: req = request.Request(tor_list_url, headers=headers) with request.urlopen(req) as response: tor_exit_nodes = response.read().decode('utf-8').split('\n') # 过滤空行避免无效匹配 tor_exit_nodes = [node.strip() for node in tor_exit_nodes if node.strip()] return ip_address in tor_exit_nodes except Exception as e: print(f"Error checking Tor exit node: {e}") return False
3. 权限问题排除
你当前配置的Lambda角色权限均为S3相关,调用外部HTTP接口不需要额外IAM权限,因此权限不是导致403的原因,可直接排除。
额外优化建议
- 缓存节点列表:将拉取到的Tor节点列表缓存到S3或Lambda临时存储中,设置1小时左右的过期时间,减少重复请求频率,降低触发反爬的概率。
- 添加重试逻辑:针对临时网络波动或拦截,可添加简单的重试机制(比如最多重试2次),提升接口调用稳定性。
内容的提问来源于stack exchange,提问作者witch-of-winter
相关产品推荐
相关产品推荐

