使用axios抓取HTML页面返回301/302重定向错误如何解决
问题原因
这个重定向循环是站点反爬风控触发的,和maxRedirects参数配置、代理类型本身没有直接关系,Postman能正常请求是因为它默认的请求指纹、cookie处理逻辑和裸axios请求存在差异,没有触发风控规则。具体触发点包括:
- 你当前使用的User-Agent是2016年发布的Firefox 47版本,版本过旧,和当前真实浏览器的特征完全不符,会被直接判定为爬虫请求,持续重定向到校验页面形成循环。
- 请求头缺失关键特征字段:当前仅配置了3个基础头,真实浏览器请求会携带
Accept-Language、Accept-Encoding、Sec-Fetch-*系列、Upgrade-Insecure-Requests等特征头,字段缺失会导致请求指纹和真实浏览器不匹配,触发风控。 - 未做cookie持久化:首次访问站点时会下发风控校验类cookie,后续重定向请求必须携带该cookie才能通过校验,axios默认不会自动持久化、携带重定向过程中set-cookie的内容,会导致一直被打回重定向。
- 代理节点质量不达标:Macys对非美国本土IP、机房IP、公开免费代理IP的校验非常严格,这类IP发起的请求会被持续重定向到地区选择页或人机验证页,Postman如果使用的是本地正常网络或干净的美国住宅IP节点,就不会触发这类拦截。
- 你遇到的
maxRedirects=0时的未处理Promise报错是基础写法问题,所有axios请求都需要通过try/catch或者.catch()捕获异常,和重定向逻辑本身无关。
解决方案
- 先安装cookie持久化依赖,解决重定向过程中cookie丢失的问题:
npm install axios tough-cookie axios-cookiejar-support
- 替换为最新的真实浏览器User-Agent,补全必要的请求头,将
maxRedirects设置为合理值(5-10即可,正常合法请求最多3次跳转就能到达目标页,设1000无意义还会导致死循环),参考配置代码如下:
const axios = require('axios'); const { wrapper } = require('axios-cookiejar-support'); const { CookieJar } = require('tough-cookie'); // 初始化cookie持久化实例 const jar = new CookieJar(); const client = wrapper(axios.create({ jar })); client("https://www.macys.com", { method: "GET", maxRedirects: 5, // 确认代理为美国本土干净住宅IP再开启下面的代理配置 // proxy: { // host: "你的代理地址", // port: 代理端口, // auth: { // username: "代理认证用户名", // password: "代理认证密码" // } // }, headers: { "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8", "Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3", "Accept-Encoding": "gzip, deflate, br", "Connection": "keep-alive", "Upgrade-Insecure-Requests": "1", "Sec-Fetch-Dest": "document", "Sec-Fetch-Mode": "navigate", "Sec-Fetch-Site": "none", "Sec-Fetch-User": "?1", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" }, }).then(res => { console.log(res.data); }).catch(err => { // 排查时可以临时打开下面的注释,打印3xx响应的跳转地址,判断跳转目标 // if (err.response && err.response.status >=300 && err.response.status <400) { // console.log("跳转目标地址:", err.response.headers.location); // } console.error(err); })
- 排查代理节点质量:如果配置代理后依然出现循环重定向,先把上面代码里打印跳转地址的注释打开,若跳转到路径带
/international的地址,说明代理IP非美国本土;若跳转到路径带validate、captcha的地址,说明代理IP是机房IP或已经被拉黑,需要更换干净的美国住宅IP。
内容的提问来源于stack exchange,提问作者CursedMun
相关产品推荐
相关产品推荐

