nodejs+axios爬取html出现中文乱码并解决示例

yizhihongxing

下面是详细的攻略:

1. 前置知识

在讲解 nodejs+axios 爬取html出现中文乱码并解决示例之前,我们需要先了解以下术语和知识点:

  • Node.js:一个基于Chrome V8引擎的JavaScript运行时,让JavaScript可以脱离浏览器运行,即在服务器端运行。
  • Axios:一个基于Promise的HTTP客户端,用于浏览器和Node.js中发起HTTP请求。
  • 编码方式(Encoding):字符编码是一种将字符集中的字符编码为计算机可识别的表示的方式。在HTTP请求和响应中,采用的编码方式有多种,例如 UTF-8、GBK、ISO-8859-1 等。

2. 问题分析

在使用 nodejs+axios 爬取网页时,如果出现中文乱码,主要原因是网页在响应过程中采用了一种和机器默认编码方式不一致的编码方式,导致浏览器无法正常解析。因此解决中文乱码问题,关键点在于识别响应的编码方式,并将其转换为机器可识别的编码方式。

3. 解决方案

3.1 方案一:手动指定编码方式

由于 axios 默认采用 utf8 编码方式,因此我们可以尝试手动指定编码方式来解决中文乱码问题。假设响应的编码方式为 GBK,则可以按照以下方式进行编码处理:

const axios = require('axios');
const iconv = require('iconv-lite');

axios.get(url, {
  responseType: 'arraybuffer'
}).then(response => {
  const html = iconv.decode(Buffer.from(response.data), 'gbk');
  console.log(html);
}).catch(error => {
  console.log(error);
});

上述代码通过 iconv 模块来处理编码方式,首先将响应数据转换为 arraybuffer 类型,然后调用 iconv.decode() 方法将响应数据的 GBK 编码转换为 UTF-8 编码,最后输出转换后的 HTML 内容。

3.2 方案二:自动检测编码方式

如果不确定响应的编码方式,或者需要自动识别多种编码方式,可以使用第三方库 chardet 来自动检测编码方式并对响应内容进行解码。示例如下:

const axios = require('axios');
const chardet = require('chardet');
const iconv = require('iconv-lite');

axios.get(url, {
  responseType: 'arraybuffer'
}).then(response => {
  const encoding = chardet.detect(response.data);
  const html = iconv.decode(Buffer.from(response.data), encoding);
  console.log(html);
}).catch(error => {
  console.log(error);
});

上述代码中,chardet.detect() 方法会根据响应数据的内容自动推断响应的编码方式,并返回编码方式名称,然后使用 iconv.decode() 方法按照返回的编码方式对响应进行转换,最终输出转换后的 HTML 内容。

4. 示例说明

下面介绍两个实际应用场景,以帮助理解 nodejs+axios 爬取html出现中文乱码并解决的方法:

4.1 示例一:爬取豆瓣电影列表

const axios = require('axios');
const iconv = require('iconv-lite');

axios.get('https://movie.douban.com/top250', {
  responseType: 'arraybuffer'
}).then(response => {
  const html = iconv.decode(Buffer.from(response.data), 'utf8');
  console.log(html);
}).catch(error => {
  console.log(error);
});

上述示例中,我们通过 axios 发起 GET 请求,获取豆瓣电影 TOP250 的页面内容。响应消息使用 arraybuffer 类型处理,接着使用 iconv 对响应内容进行编码处理,并将处理后的 HTML 内容输出至控制台。

4.2 示例二:自动检测编码方式爬取新浪新闻

const axios = require('axios');
const chardet = require('chardet');
const iconv = require('iconv-lite');

axios.get('https://news.sina.com.cn/', {
  responseType: 'arraybuffer'
}).then(response => {
  const encoding = chardet.detect(response.data);
  const html = iconv.decode(Buffer.from(response.data), encoding);
  console.log(html);
}).catch(error => {
  console.log(error);
});

上述示例中,我们通过 axios 发起 GET 请求,获取新浪新闻的首页。同样使用 arraybuffer 处理响应消息,然而此处并未手动指定编码方式,而是通过第三方库 chardet 自动检测编码方式,并使用 iconv 按照返回的编码方式对响应进行转换处理。最终将转换后的 HTML 内容输出至控制台。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:nodejs+axios爬取html出现中文乱码并解决示例 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • Nodejs如何搭建Web服务器

    下面是关于如何搭建Node.js Web服务器的完整攻略。 1. 安装Node.js 首先,你需要在你的计算机上安装Node.js。你可以从Node.js的官方网站 https://nodejs.org 下载安装程序,按照提示安装Node.js,安装完成后,你可以通过在命令行中输入以下命令来检查Node.js是否成功安装: node -v 如果你看到输出了N…

    node js 2023年6月8日
    00
  • node.js支持多用户web终端实现及安全方案

    Node.js是一个非常流行的服务器端JavaScript运行环境,它提供了强大的网络编程支持,使得我们能够用JavaScript开发高性能、可扩展的Web应用。在本文中,我们将讨论如何通过Node.js支持多用户Web终端实现以及如何保证其安全性的问题。 Node.js支持多用户Web终端实现 在Node.js中,可以使用WebSocket来实现多用户We…

    node js 2023年6月8日
    00
  • JavaScript支持的最大递归调用次数分析

    下面是详细讲解 JavaScript 支持的最大递归调用次数的完整攻略。 什么是递归 在 JavaScript 中,递归是指一个函数调用自身的过程。递归函数通常包括两个部分:基线条件(停止递归)和递归条件(继续递归)。 一个简单的递归函数示例: function countdown(n) { if (n <= 0) { console.log(&quo…

    node js 2023年6月8日
    00
  • Node.js的Koa框架上手及MySQL操作指南

    Node.js的Koa框架上手及MySQL操作指南 1. 什么是Koa框架? Koa是一个Node.js的Web框架,由Express的创造者TJ Holowaychuk在2013年创建。它具有轻量、简洁、灵活的特点,对ES6语法的支持也很好,是在Node.js平台下开发Web应用程序的良好选择。 2. Koa框架的安装及使用 要使用Koa框架,首先需要在本…

    node js 2023年6月8日
    00
  • nodejs代码执行绕过的一些技巧汇总

    标题:Node.js代码执行绕过的一些技巧汇总 一、概述 Node.js是一款非常流行的JavaScript运行环境,但在代码执行过程中可能也会出现漏洞使得攻击者可以执行一些不受欢迎的代码。本文将探讨几种绕过代码执行漏洞的技巧。 二、技巧汇总 绕过输入过滤 当从前端获取用户输入时,很重要的一步就是对数据进行输入检查。但只是检查数据的类型是不够的,因为攻击者可…

    node js 2023年6月8日
    00
  • Nodejs + sequelize 实现增删改查操作

    下面是详细讲解 “Node.js + Sequelize 实现增删改查操作” 的完整攻略。 简介 Sequelize 是一个基于 Node.js 的 ORM(Object-Relational Mapping) 框架,提供了方便的方式操作各种不同类型的数据库。 Node.js 是一个基于 Chrome V8 JavaScript 引擎构建的 JavaScri…

    node js 2023年6月8日
    00
  • vscode 调试 node.js的方法步骤

    下面是详细讲解“vscode 调试 node.js的方法步骤”的完整攻略: 前置条件 安装 Node.js 和 Visual Studio Code; 对 Node.js 和 TypeScript 有基本的了解。 方法步骤 打开 Visual Studio Code,打开项目文件夹; 在项目根目录下创建 .vscode 目录,若已经存在则跳过; 在 .vsc…

    node js 2023年6月8日
    00
  • 我的Node.js学习之路(四)–单元测试

    下面是我的Node.js学习之路(四)–单元测试的完整攻略: 1. 什么是单元测试? 单元测试是针对软件系统中的最小可测试单元进行验证和检验的过程。在Node.js中,单元通常是指一个函数、一个方法或者一个模块。 单元测试的目的是在代码实现之前或者之后,尽早地发现代码中的问题,使得我们能够及早地进行修改和优化。通过单元测试,我们可以确保代码在各种情况下都能…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部