Nodejs抓取网页遇到重定向

Nodejs抓取网页遇到重定向

我用http模块抓取目标网页的时候遇到了N次重定向,怎么能方便获取最终状态码200的网页呢?不想自己去循环处理304…

5 回复

当然可以。在使用 Node.js 抓取网页时,经常会遇到重定向的情况。默认情况下,Node.js 的 http 模块不会自动处理重定向。为了方便地获取最终状态码为 200 的网页内容,我们可以使用 follow-redirects 这个第三方库来处理重定向。

以下是一个简单的示例代码,展示了如何使用 follow-redirects 库来抓取网页并处理重定向:

  1. 首先,安装 follow-redirects 库:
npm install follow-redirects
  1. 然后,编写抓取网页的代码:
const http = require('http');
const https = require('https');
const { request } = require('follow-redirects');

// 定义一个函数来抓取网页
async function fetchUrl(url) {
    return new Promise((resolve, reject) => {
        request(url, (error, response, body) => {
            if (error) {
                return reject(error);
            }
            resolve({
                statusCode: response.statusCode,
                body: body
            });
        });
    });
}

// 示例 URL
const url = 'http://example.com';

// 调用函数抓取网页
fetchUrl(url)
    .then(result => {
        console.log(`最终状态码: ${result.statusCode}`);
        console.log(`网页内容: ${result.body.slice(0, 100)}...`); // 只打印前100个字符
    })
    .catch(error => {
        console.error('抓取失败:', error);
    });

解释

  1. 安装 follow-redirects:

    • 使用 npm install follow-redirects 安装这个库。
  2. 定义 fetchUrl 函数:

    • 这个函数接受一个 URL,并返回一个 Promise。
    • 使用 request 方法从 follow-redirects 库中发起 HTTP 请求。
    • 当请求完成时,解析响应的状态码和主体内容,并通过 Promise 返回。
  3. 调用 fetchUrl 函数:

    • 提供一个示例 URL 并调用 fetchUrl 函数。
    • .then 中处理成功的响应,打印最终状态码和部分网页内容。
    • .catch 中处理任何可能发生的错误。

这样,你就可以方便地抓取经过多次重定向后的最终网页内容了。


cnodejs上已经有2次以上类似的帖子的,自己搜索一下

看request header,重定向到哪就去哪啊

当你使用Node.js的httphttps模块抓取网页时,如果目标网址发生了多次重定向(如301、302等),你可以通过设置请求选项来自动跟随重定向,并最终获得状态码为200的响应。以下是一个简单的示例,展示了如何使用http模块实现这一功能:

const http = require('http');

function followRedirect(url, callback) {
    let options = url.parse(url);
    options.method = 'GET';
    options.followRedirect = true; // 这里并没有直接提供跟随重定向的功能,需要手动处理

    const req = http.request(options, (res) => {
        if (res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) {
            followRedirect(res.headers.location, callback); // 如果有重定向,则递归调用
        } else {
            callback(null, res); // 最终返回状态码为200的响应
        }
    });

    req.on('error', (e) => {
        callback(e);
    });

    req.end();
}

// 使用示例
followRedirect('http://example.com', (err, res) => {
    if (err) {
        console.error('Error:', err.message);
        return;
    }
    console.log('Status Code:', res.statusCode);
    console.log('Headers:', res.headers);
});

在这个示例中,我们定义了一个followRedirect函数,该函数接受一个URL和一个回调函数作为参数。首先解析URL并创建HTTP GET请求。当接收到响应时,如果状态码在300-399之间且包含location头信息(表示存在重定向),则递归调用自身以继续跟踪重定向。一旦到达最终页面(状态码不再是3xx),则调用回调函数返回最终结果。

需要注意的是,在Node.js原生的httphttps模块中,并没有内置自动跟随重定向的功能。因此,你需要像上述示例那样手动处理重定向逻辑。如果你希望更简单地处理重定向,可以考虑使用第三方库如axiosnode-fetch,这些库通常提供了更友好的API来处理这类情况。

回到顶部