Nodejs http.get(‘网址’) 得到的是一个wml文件,不是我想要的html 里面有什么玄机?

Nodejs http.get(‘网址’) 得到的是一个wml文件,不是我想要的html 里面有什么玄机?

百度了一下wml:

WML是一种基于XML(扩展标记语言)的一种标记语言。这种语言是为无线设备用户提供交互界面而设计的。这些无线设备包括电话、呼机和个人…

6 回复

Nodejs http.get(‘网址’) 得到的是一个wml文件,不是我想要的html 里面有什么玄机?

在使用Node.js的http.get方法请求一个URL时,你可能会遇到一个意料之外的情况:返回的内容并不是HTML,而是WML(Wireless Markup Language)。这背后可能有几个原因。

WML是什么?

WML(Wireless Markup Language)是一种专门为无线设备如手机和平板电脑设计的标记语言。它类似于HTML,但更轻量级,专为低带宽网络环境设计。如果你请求的URL是针对移动设备优化的,那么服务器可能会返回WML格式的内容。

示例代码

假设你有一个目标URL https://example.com,并且你想通过Node.js获取该页面的内容。以下是一个简单的示例代码:

const http = require('http');

// 定义请求的URL
const url = 'https://example.com';

// 创建http.get请求
http.get(url, (response) => {
    let data = '';

    // 监听data事件,每次接收到数据块时触发
    response.on('data', (chunk) => {
        data += chunk;
    });

    // 监听end事件,当整个响应体被接收完毕后触发
    response.on('end', () => {
        console.log(data);
    });
});

// 错误处理
http.get(url, (res) => {
    if (res.statusCode !== 200) {
        console.error(`请求失败,状态码: ${res.statusCode}`);
        return;
    }
}).on("error", (err) => {
    console.error(`请求错误: ${err.message}`);
});

解释

  1. 创建请求:我们使用http.get方法来发起一个GET请求。
  2. 监听data事件:每次接收到数据块时,都会触发data事件,并将数据累积到变量data中。
  3. 监听end事件:当整个响应体被接收完毕后,触发end事件,此时可以在回调函数中处理完整的内容。
  4. 错误处理:添加错误处理逻辑以捕获请求过程中可能出现的任何问题。

可能的原因

  • 服务器配置:某些网站根据请求头中的User-Agent来判断客户端是否是移动设备,如果是,则返回WML内容。
  • 请求头:你可能需要修改请求头中的User-Agent,使其看起来像来自桌面浏览器的请求。

修改请求头

你可以尝试修改请求头中的User-Agent,使其看起来像是来自桌面浏览器的请求:

http.get({
    hostname: 'example.com',
    path: '/',
    headers: {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
    }
}, (response) => {
    // 处理响应
});

这样可以确保服务器返回的内容符合你的期望。


可能识别了你的 ua,换个 ua 试试

比较一下你的http header和浏览器的http header,应该就有答案了。

楼上正解,问题已解决,thx very much

我只是想说这种问题很好百度吧,我都是百度,goo*** 一圈以后再来问的

当你使用 http.get 方法请求一个 URL 时,如果返回的内容是 WML 而不是 HTML,这通常意味着服务器根据某种条件(如 User-Agent 或其他 HTTP 头信息)返回了不同的内容类型。

示例代码

你可以检查响应头来确认返回的内容类型,并决定如何处理它:

const http = require('http');

const options = {
    hostname: 'example.com',
    path: '/',
    method: 'GET'
};

const req = http.request(options, (res) => {
    console.log(`STATUS: ${res.statusCode}`);
    console.log(`HEADERS: ${JSON.stringify(res.headers)}`);

    res.setEncoding('utf8');
    let rawData = '';
    res.on('data', (chunk) => { rawData += chunk; });
    res.on('end', () => {
        console.log(`BODY: ${rawData}`);
        // 这里可以根据 content-type 来处理返回的数据
        if (res.headers['content-type'] === 'text/vnd.wap.wml') {
            console.log('Received WML content');
            // 处理 WML 数据
        } else if (res.headers['content-type'] === 'text/html') {
            console.log('Received HTML content');
            // 处理 HTML 数据
        }
    });
});

req.on('error', (e) => {
    console.error(`Problem with request: ${e.message}`);
});

req.end();

解释

  • HTTP 请求:我们使用 http.request 发送一个 GET 请求。
  • 响应处理:通过监听 dataend 事件,我们可以读取整个响应体。
  • Content-Type 检查:在 res.on('end') 回调中,我们可以检查 res.headers['content-type'] 的值来确定返回的内容类型,并据此进行相应的处理。

可能的解决方案

  1. 修改 User-Agent:有些服务器会根据 User-Agent 返回不同的内容。你可以尝试修改 User-Agent 来获取 HTML 内容:

    const options = {
        hostname: 'example.com',
        path: '/',
        method: 'GET',
        headers: {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
        }
    };
    
  2. 检查其他 HTTP 头:如果服务器使用其他 HTTP 头来决定返回哪种内容,你需要调整请求以匹配正确的条件。

回到顶部