AWS EC2服务器Python3请求网站返回403,本地正常求助
解决EC2上Python请求返回403但本地正常的问题
这种情况我碰到过好几次,大概率是目标网站的反爬机制或者IP限制在搞鬼,下面给你拆解可能的原因和对应的解决办法:
1. 请求头缺少关键识别信息
很多网站会通过User-Agent这类请求头判断访问者是否为合法客户端。本地发起请求时,你的Python环境(或者浏览器)自带的User-Agent可能被网站认可,但EC2上的requests库默认的UA字符串很容易被识别为非人工请求,直接触发403拦截。
解决办法:手动添加模拟浏览器的请求头,示例代码:
import requests # 模拟Chrome浏览器的请求头 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-Language': 'en-US,en;q=0.9' } response = requests.get('https://volusia.county-taxes.com', headers=headers) print(response.status_code)
2. EC2实例IP被目标网站封禁
云服务商(包括AWS)的IP段经常被反爬系统标记为高风险,因为大量爬虫会部署在云主机上。你的EC2 IP可能已经被目标网站加入了黑名单,导致直接拒绝访问。
解决办法:
- 最简单的方式:停止当前EC2实例,重新启动(如果没有绑定弹性IP,重启后会分配新的公网IP),再测试请求
- 如果重启后还是不行:更换EC2实例的可用区,不同可用区的IP段通常不同
- 合法用途下:可以尝试联系目标网站的管理员,说明你的访问需求,申请解封IP
3. 地区访问限制
目标网站可能只允许特定地区的IP访问,你的本地IP在允许范围内,但EC2实例所在的AWS区域不在允许列表里。
解决办法:
- 切换EC2实例到和本地IP同地区的AWS可用区(比如本地是美国东部,就把EC2部署在us-east-1区域)
- 如果无法切换区域,可以考虑使用AWS CloudFront作为中转,配置CloudFront的边缘节点到允许访问的地区
4. AWS网络配置限制(概率较低)
虽然默认情况下EC2的安全组和NACL是允许所有出站流量的,但也有可能你不小心配置了限制HTTPS(443端口)的规则。
解决办法:
- 检查EC2实例绑定的安全组,确保出站规则里允许
0.0.0.0/0访问443端口 - 检查VPC的网络访问控制列表(NACL),同样确保出站规则允许443端口的流量
额外验证步骤
你可以先在EC2上用curl命令测试,看看能不能得到更多拦截细节:
curl -v "https://volusia.county-taxes.com"
查看返回的响应内容,有些网站会在403页面里说明拦截原因(比如"IP blocked"或者"Invalid User Agent"),能帮你更快定位问题。
内容的提问来源于stack exchange,提问作者Sravan kunnummal.
相关产品推荐
相关产品推荐

