为什么NodeJS请求返回奇怪的字符?

桑德拉

我正在尝试删除一些网站。除了amazon.com会返回奇怪的字符之外,所有网站都可以正常运行并返回HTML内容:

���$����C����~/�2��!Ҧ�@@
PK���                   ;y������~�R�{t�$�)�؊")  ��N
������S�b��Db���y��D.e��%G~g���ú�6~�zB}}=�9)��.w��`�'D:��&�5�\��}�4;_{�s��a�mXo��P�!oD��]]|��V�9VC����5�Yr���f�BL:bm���93G���u���<�Y�C0�Vim��h�ʕ�@�Sx�P|5e<,��]�5���`S�������h
         �����3���zI����(��$\�

我刚开始在NodeJS和项目中工作,因此我的代码非常简单:

request('https://www.amazon.com/', (error, response, body) => {
    console.log('error:', error); // Print the error if one occurred
    console.log('statusCode:', response && response.statusCode); // Print the response status code if a response was received
    console.log('body:', body); // Print the HTML for the Google homepage.
})

一切在amazon.com的Postman中都能正确显示,但在console.log()中却不能。默认情况下,NPM请求以UTF8编码,这使其他网站正常工作,但显然不能使他工作……谢谢!

jfriend00

亚马逊真的很想向您发送压缩后的内容,这也许就是您所看到的。当我在Windows 10节点v12.13.1上以请求v2.88运行您的确切代码时,看不到您提到的问题。

但是,从以前的经验中我知道,Amazon会尝试检测gzip内容是否应该正常,如果这样,它将以gzip的形式发送。例如,如果您user-agent向请求添加标头,例如"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36",那么您确实会得到:

content-encoding: gzip

response.headers实际上,如果您这样做:

console.log(response.headers)

您可以查看这是否正在发生。

在我的系统中,当我传递requestoption时gzip: false,Amazon将继续发送纯文本。如果设置了grip: true,则Amazon发送gzip编码的内容,但是请求库将其正确解码。因此,似乎最好的选择是这样的:

const request = require('request');

request({
    url: 'https://www.amazon.com/',
    gzip: true,
}, (error, response, body) => {
    console.log('error:', error); // Print the error if one occurred
    console.log('statusCode:', response && response.statusCode); // Print the response status code if a response was received
    console.log(response.headers);
    console.log('body:', body); // Print the HTML for the Google homepage.
})

我在request文档中找到了这个

为了向后兼容,默认情况下不支持响应压缩。要接受gzip压缩的响应,请将gzip选项设置为true。请注意,在未修改响应对象的情况下,通过请求传递的正文数据将自动解压缩,并且如果服务器发送了压缩的响应,则将包含压缩的数据。


仅供参考,正如Ashish所提到的,该request()模块已进入维护模式,以后将不会进行增强。对于新项目,建议选择具有您感兴趣的功能的较新模块。有很多选择。您可以在此处看到它们的选择

got()您可以像这样使用一个非常简单的方法

 const got = require('got');

 got('https://www.amazon.com/').then(response => {
     console.log(response.body);
 }).catch(err => {
     console.log(err);
 });

注意:可以got()自动处理来自amazon.com的gzip解压缩。

一个可以在node.js和浏览器中都可以使用并且广受欢迎的选项是axios()

const axios = require('axios');

axios('http://www.amazon.com').then(response => {
    console.log(response.data);
}).catch(err => {
    console.log(err);
});

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么++ [[]] [+ []] + [+ []]返回字符串“ 10”?

为什么在字符串上+ +给出奇怪的结果

为什么fetch返回奇怪的整数散列?

CopyFromRecordset返回奇怪的字符

为什么UTTypeCreatePreferredIdentifierForTag返回奇怪的UTI?

TCPDF返回奇怪的字符

为什么cSplit返回TRUE而不是字符

为什么此请求返回一个空字符串?

为什么即使处理完路由请求后,nodejs仍返回404?

为什么我的Ajax请求从wordpress返回空对象?

为什么字符指针“ ==“返回true?

为什么此Mongo查询返回奇怪的结果?

python请求后返回奇怪的字符

当我尝试返回多维数组中某项的索引值时,我没有得到数字。我得到一组奇怪的字符。为什么?

nslookup为什么返回“ DNS请求超时”

为什么我的程序返回相同的字符?

用C打印字符?为什么奇怪?

为什么grep -H在这里返回奇怪的输出?

为什么 OpenCV 会为像素强度返回奇怪的值?

为什么,请求返回符号——'?'

为什么 Kubernetes 为 ioctl 返回奇怪的结果

请求API但返回空,为什么?

未返回 NodeJS 请求

为什么我的 nodejs POST 请求返回空值(我使用邮递员)?

为什么nodejs express post请求中的“body”为空?

为什么 Skealearn-NearestNeighbors 返回奇怪/错误的结果?

为什么 Django 的 AuthenticationForm 在错误消息中返回奇怪的 str

为什么 django cache.set() 存储奇怪的字符

为什么 XMLHttpRequest 请求正文返回 null?