Node.js中Axios请求网页HTML响应乱码问题求助
解决Axios请求亚马逊网页返回乱码的问题
问题描述
使用Axios请求亚马逊网页并通过Cheerio解析时,返回的HTML响应呈现为乱码(如�a��{t��这类字符),尝试重新编码为UTF-8、改用HTTP协议均无效。
相关代码
const axios = require('axios'); const cheerio = require('cheerio'); axios.get('https://www.amazon.co.uk/Acer-XF243YPbmiiprx-Monitor-FreeSync-Adjustable/dp/B097F6DT45') .then((response) => { if (response.status === 200) { const html = response.data; const $ = cheerio.load(html); console.log($.html()) } }, (error) => console.log(err));
当前乱码响应示例
�Sn����M�٠��g���+=�������&x��.�@!�Q36�%�[�H�+ݴ�|��_/��d�8_ K�b&E�_�}[U1�@u梅Y����{T6ǞOrt��q���ri����eJ(���w����~}S� �4/��&�2�y���X, �Ǥ���0b�n��PS6O��kY��=�2k�Z��K�Z��r�t A4�����c���vnY�{t���u�_���C��C&��u����W)���He���O�X�� �]P� ��Ѐ�(�?�,y�m����b��|6���B�|�l6��ݻ+&�6�/vH�O�oX�;�X�s [����I��&��U �����v�=�vR{��֥����L�r��tG�l�ܓY�N)����( �(����qX���Z=f�b�-�����At舮�^U6���ف{�h�w�p���m��ϝ
解决方案
原因分析
亚马逊对请求做了GZIP压缩处理,Axios若未正确配置自动解压,会直接拿到二进制压缩数据,解析后出现乱码;同时亚马逊会检测请求头,缺少浏览器标识的请求可能返回异常内容。
具体解决步骤
- 配置Axios自动解压+模拟浏览器请求头
在请求配置中显式开启解压功能,并添加User-Agent、Accept等浏览器标识,让服务器返回正常可解析的内容。
修改后的代码:
const axios = require('axios'); const cheerio = require('cheerio'); axios.get('https://www.amazon.co.uk/Acer-XF243YPbmiiprx-Monitor-FreeSync-Adjustable/dp/B097F6DT45', { headers: { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'Accept-Encoding': 'gzip, deflate, br' }, decompress: true }) .then((response) => { if (response.status === 200) { const html = response.data; const $ = cheerio.load(html); console.log($.html()); } }) .catch((error) => console.log(error));
手动解压备选方案
如果自动解压仍失效,可借助zlib模块手动处理压缩数据:const axios = require('axios'); const cheerio = require('cheerio'); const zlib = require('zlib'); axios.get('https://www.amazon.co.uk/Acer-XF243YPbmiiprx-Monitor-FreeSync-Adjustable/dp/B097F6DT45', { headers: { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36', 'Accept-Encoding': 'gzip' }, responseType: 'arraybuffer' // 以二进制格式接收数据 }) .then((response) => { let html; // 判断压缩类型并解压 if (response.headers['content-encoding'] === 'gzip') { html = zlib.gunzipSync(response.data).toString('utf8'); } else { html = response.data.toString('utf8'); } const $ = cheerio.load(html); console.log($.html()); }) .catch((error) => console.log(error));额外注意
亚马逊有反爬机制,频繁请求可能触发IP封禁,建议添加请求间隔或使用代理IP。
内容的提问来源于stack exchange,提问作者TriThomas
相关产品推荐
相关产品推荐

