关于 Nodejs 抓取网页时遇到的 301 错误

关于 Nodejs 抓取网页时遇到的 301 错误

website: mafengwo

nodejs 抓取网页时 301 错误, 用 request (It supports HTTPS and follows redirects by default.) 包也还是不可以,其他的网站都可以,唯独目标网站不行。

用其他语言抓取就可行, 求解!

6 回复

关于 Node.js 抓取网页时遇到的 301 错误

在使用 Node.js 进行网页抓取时,你可能会遇到 301 状态码错误。这种错误通常表示网页已经永久移动到新的 URL 地址。尽管 request 库默认支持 HTTPS 并且可以自动跟随重定向,但在某些情况下,特定的网站(例如你提到的 mafengwo)可能需要一些额外的配置来正确处理重定向。

示例代码及解释

首先,确保你已经安装了 request 库。如果没有安装,可以通过 npm 安装:

npm install request

接下来,你可以使用以下代码来尝试抓取 mafengwo 网站,并处理 301 重定向问题:

const request = require('request');

const url = 'https://www.mafengwo.cn';

request.get({
    url: url,
    followRedirect: true, // 强制跟随重定向
    maxRedirects: 10, // 设置最大重定向次数
}, (error, response, body) => {
    if (error) {
        console.error(`Error fetching the page: ${error}`);
        return;
    }

    if (response.statusCode === 301) {
        console.log('Received a 301 redirect. This should not happen with followRedirect enabled.');
    } else if (response.statusCode === 200) {
        console.log('Successfully fetched the page.');
        console.log(body);
    } else {
        console.error(`Unexpected status code: ${response.statusCode}`);
    }
});

解释

  1. 强制跟随重定向 (followRedirect: true):

    • request 库默认支持重定向,但有时需要显式启用以确保它正常工作。
  2. 设置最大重定向次数 (maxRedirects: 10):

    • 设置一个合理的重定向次数限制,以防无限循环。
  3. 错误处理:

    • 检查是否有错误发生,如果有,输出错误信息。
    • 如果响应状态码为 301,则打印一条消息。这应该不会发生,因为 followRedirect 已经被启用。
    • 如果状态码为 200,则表示成功抓取页面,并打印页面内容。
    • 对于其他状态码,输出错误信息。

通过上述方法,你应该能够解决大部分 301 重定向问题。如果仍然存在问题,可能是网站的特定配置或限制导致的,可能需要进一步分析服务器返回的头部信息或调整请求头。


这个是重定向,你可以直接抓取目标网页,或者根据响应头去做正理 request里面有个参数followRedirects:false

已经用了request该插件,自动会follows redirects的

http包就有这个问题

用request包就行了,自动转向。 http://blog.fens.me/nodejs-crawler-douban/

如果request的时候响应了cookie重定向之后是不会把cookie加到头中的

当你在使用 Node.js 抓取网页时遇到 301 错误,通常是因为目标网站进行了重定向。request 库默认是支持重定向的,所以问题可能出在其他地方。这里提供一个示例代码,并且解释一下可能的原因及解决方法。

示例代码

首先,确保你已经安装了 axios 库,它也是一个常用的 HTTP 客户端:

npm install axios

然后,你可以使用以下代码来处理重定向问题:

const axios = require('axios');

async function fetchWebsite() {
    try {
        const response = await axios({
            url: 'https://www.mafengwo.cn',
            maxRedirects: 5, // 设置最大重定向次数
            validateStatus: function (status) {
                return status >= 200 && status < 400; // 只处理成功状态码
            }
        });

        console.log(response.data);
    } catch (error) {
        console.error("Error fetching the website:", error.message);
    }
}

fetchWebsite();

解释

  • maxRedirects: 设置最大重定向次数,避免无限循环。
  • validateStatus: 自定义状态码验证函数,只处理成功状态码(2xx)。

可能的原因及解决方法

  1. HTTPS 证书问题:

    • 如果目标网站使用的是自签名证书,可能会导致连接失败。你可以尝试忽略 SSL 证书错误:

      const axios = require('axios');
      
      async function fetchWebsite() {
          try {
              const response = await axios({
                  url: 'https://www.mafengwo.cn',
                  httpsAgent: new https.Agent({ rejectUnauthorized: false }), // 忽略 SSL 证书错误
                  maxRedirects: 5,
                  validateStatus: function (status) {
                      return status >= 200 && status < 400;
                  }
              });
      
              console.log(response.data);
          } catch (error) {
              console.error("Error fetching the website:", error.message);
          }
      }
      
      fetchWebsite();
      
  2. User-Agent 问题:

    • 有些网站会检查请求头中的 User-Agent,如果不符合预期,则会返回 301 错误。可以尝试设置一个常见的浏览器 User-Agent:

      const axios = require('axios');
      
      async function fetchWebsite() {
          try {
              const response = await axios({
                  url: 'https://www.mafengwo.cn',
                  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'
                  },
                  maxRedirects: 5,
                  validateStatus: function (status) {
                      return status >= 200 && status < 400;
                  }
              });
      
              console.log(response.data);
          } catch (error) {
              console.error("Error fetching the website:", error.message);
          }
      }
      
      fetchWebsite();
      

通过以上方法,你应该能够解决大多数情况下 Node.js 抓取网页时遇到的 301 错误。

回到顶部