请求https://www.norwegian.com/en持续返回Status code 403而非200求助
解决请求norwegian.com返回403的问题
我之前也遇到过类似的反爬拦截情况,403状态码通常意味着网站已经识别出你的请求不是来自真实浏览器——哪怕你复制了请求头,可能还有几个关键点没覆盖到,下面给你分析原因和针对性的解决方案:
可能的触发原因
- 缺少会话Cookie:很多网站会在首次请求时设置Cookie,后续请求需要携带这些Cookie才能通过验证,你当前的代码没有处理Cookie的存储和自动携带逻辑。
- request库的隐式行为差异:虽然你复制了请求头,但request库在一些细节上和浏览器不同,比如默认不自动跟随重定向,或者没有显式设置Host头(部分网站会严格校验这个字段)。
- JS级反爬检测:部分网站会通过JavaScript检测浏览器环境(比如是否存在
window对象、能否执行特定JS逻辑),而request是纯HTTP请求库,没有JS引擎,直接被拦截。
具体解决方案
1. 启用Cookie会话并补充关键请求头
修改你的代码,添加CookieJar维护会话,同时显式指定Host头,模拟真实浏览器的Cookie存储和请求逻辑:
const request = require('request'); const cheerio = require('cheerio'); const jar = request.jar(); // 创建Cookie容器,模拟浏览器的Cookie存储 let options = { url: 'https://www.norwegian.com/en', headers: { "Cache-Control": "max-age=0", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", "Accept-Encoding": "gzip, deflate, br", "Accept-Language": "en-US,en;q=0.5", "Connection": "keep-alive", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:72.0) Gecko/20100101 Firefox/72.0", "Host": "www.norwegian.com" // 显式指定Host,避免库自动生成的差异 }, jar: jar, // 启用CookieJar自动管理Cookie followAllRedirects: true, // 自动跟随重定向,模拟浏览器行为 gzip: true // 支持gzip压缩,匹配请求头里的Accept-Encoding }; request(options, function (err, resp, html) { if (err) { console.error('请求出错:', err); return; } console.log('状态码:', resp.statusCode); if (resp.statusCode === 200) { const $ = cheerio.load(html); // 这里可以正常处理页面内容了 console.log('页面标题:', $('title').text()); } else { // 打印响应头,看看有没有拦截提示 console.log('响应头:', resp.headers); } })
2. 使用无头浏览器绕过JS检测
如果上面的方法还是返回403,说明网站可能有JS级别的反爬,这时候用puppeteer(无头Chrome)模拟真实浏览器环境是更可靠的选择:
首先安装puppeteer:
npm install puppeteer
然后编写代码:
const puppeteer = require('puppeteer'); const cheerio = require('cheerio'); (async () => { // 启动无头浏览器,设置headless: false可以看到真实浏览器的运行过程 const browser = await puppeteer.launch({ headless: 'new' }); const page = await browser.newPage(); // 设置和你之前一致的User-Agent await page.setUserAgent('Mozilla/5.0 (X11; Linux x86_64; rv:72.0) Gecko/20100101 Firefox/72.0'); // 访问页面,等待网络空闲后再获取内容,确保页面加载完成 const response = await page.goto('https://www.norwegian.com/en', { waitUntil: 'networkidle2' }); console.log('状态码:', response.status()); // 获取页面HTML并解析 const html = await page.content(); const $ = cheerio.load(html); console.log('页面标题:', $('title').text()); await browser.close(); })();
注意事项
- 请务必遵守目标网站的
robots.txt和使用条款,避免频繁请求给服务器造成压力,否则可能会被永久封禁IP。 - 部分网站可能还有更严格的反爬机制(比如IP封禁、验证码),这类场景下需要谨慎使用代理IP或验证码识别服务,避免违反网站规则。
内容的提问来源于stack exchange,提问作者M.Baranauskas
相关产品推荐
相关产品推荐

