axios GET请求如何正确发送Viewport-Width获取桌面版站点内容
问题根因
服务端做移动端/桌面端适配时,不会识别你自定义添加的Width、Viewport-Width请求头——这两个字段不属于普通网页请求的标准请求头,常规桌面浏览器访问时不会携带这类字段,加了反而可能被服务端的反爬规则标记为异常请求。
绝大多数站点的版本判定优先级从高到低为:Cookie中存储的用户版本偏好、标准客户端提示头(Client Hints)中的移动端标识、User-Agent字段中的移动端特征、请求来源特征。你当前的请求缺少桌面端的标准特征标识,才会被默认返回移动端内容。
修复方案
- 移除无效自定义头:删掉
Width、Viewport-Width两个自定义字段,同时移除GET请求不需要的Content-type头(该头仅用于标记请求体格式,无请求体时携带会触发部分服务端的校验异常)。 - 补全桌面端标准请求头:重点添加现代桌面浏览器默认携带的
Sec-*系列安全头、客户端提示头,明确标记非移动端身份。 - 开启会话保持:配置axios自动维护Cookie,避免服务端通过会话标记反复重定向到移动端站点。
修正后可运行代码
const axios = require('axios'); const cheerio = require('cheerio'); // 初始化带会话保持的axios实例,模拟浏览器cookie存储逻辑 const req = axios.create({ withCredentials: true, timeout: 10000, headers: { // 桌面端浏览器UA,确保无Mobile、Android等移动端关键词 "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8", "Accept-Language": "uk,en-US;q=0.7,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", // 关键标识:明确告知服务端当前请求不是移动端发起 "Sec-CH-UA-Mobile": "?0", "Sec-CH-UA-Platform": "\"Windows\"", "DNT": "1" } }); async function fetchDesktopPage() { const resp = await req.get('https://ukrparts.com.ua/category/komplekt-stsepleniya/c-134/'); const $ = cheerio.load(resp.data); // 提取目标内容 const listContent = $('ul').html(); return listContent; } // 调用测试 fetchDesktopPage().then(data => { console.log('获取桌面版内容成功:', data); }).catch(err => { console.error('请求失败:', err); });
特殊情况处理:如果按上述配置后仍返回移动端内容,可以先在桌面浏览器打开目标站点,手动确认站点已切换到桌面版后,复制该站点下存储的Cookie值,在axios请求头中添加
Cookie字段携带对应值,即可强制获取桌面版响应。
内容的提问来源于stack exchange,提问作者Alex_Ku
相关产品推荐
相关产品推荐

