EC2实例中requests.get返回403,本地请求同一URL正常如何解决?
解决EC2请求返回403、本地正常的问题
这种情况我碰到过不少,大概率是目标网站把EC2的IP段识别成了服务器/爬虫IP,直接拦截了。咱们一步步来尝试解决:
1. 补全请求头,模拟更真实的浏览器
你当前只设置了User-Agent,但很多反爬系统会检查完整的请求头字段。可以把你本地浏览器的请求头(比如Chrome开发者工具里Network面板的请求头)完整复制过来,比如:
import requests url = 'http://www.americanas.com.br/categoria/eletrodomesticos/freezer/vertical' 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/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8', 'Accept-Language': 'en-US,en;q=0.5', 'Referer': 'https://www.google.com/', 'DNT': '1', 'Connection': 'keep-alive', 'Upgrade-Insecure-Requests': '1' } response = requests.get(url, verify=False, headers=headers) print(response.status_code)
这样的请求头更接近真实用户的访问,能降低被识别为爬虫的概率。
2. 使用代理IP规避EC2 IP段拦截
EC2的公共IP属于云服务商的已知IP段,很多电商网站会直接标记这类IP为爬虫。你可以尝试使用 residential 代理(residential代理是普通用户的家庭IP,比数据中心代理更难被拦截),修改代码如下:
proxies = { 'http': 'http://your-residential-proxy:port', 'https': 'http://your-residential-proxy:port' } response = requests.get(url, verify=False, headers=headers, proxies=proxies)
注意要选择可靠的代理服务,避免代理IP本身已经被目标网站拉黑。
3. 添加请求延迟与随机化
如果你的代码是批量请求,EC2上的请求频率可能远高于本地手动访问,触发了网站的频率限制。可以在请求之间添加随机延迟,模拟人类浏览的间隔:
import time import random # 每次请求后随机等待1-3秒 time.sleep(random.uniform(1, 3))
4. 检查EC2 IP是否被拉黑
先在EC2实例里执行curl ifconfig.me获取当前出站IP,然后手动用这个IP访问目标网站(比如用在线代理工具),如果直接返回403,说明这个IP已经被拉黑。这种情况下,你可以:
- 停止当前EC2实例,重新启动(部分AWS区域会分配新IP)
- 切换到其他区域创建新的EC2实例
5. 用浏览器自动化工具模拟真实访问
如果上面的方法都无效,说明网站的反爬机制比较严格,可能检测了JS渲染或浏览器指纹。可以用Selenium或Playwright启动真实浏览器来请求:
from selenium import webdriver from selenium.webdriver.chrome.options import Options options = Options() options.add_argument('--headless=new') # 无头模式,适合服务器运行 options.add_argument('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') driver = webdriver.Chrome(options=options) driver.get(url) print(driver.page_source) # 获取页面内容 print(driver.title) driver.quit()
这种方式完全模拟真实用户的浏览器操作,能绕过大部分基于HTTP层的反爬。
内容的提问来源于stack exchange,提问作者Filipe Ferminiano
相关产品推荐
相关产品推荐

