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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:42:21