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

下面是详细的攻略:

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日

相关文章

  • node.js中的buffer.slice方法使用说明

    我给您详细讲解一下 Node.js 中的 Buffer.slice 方法的使用说明。 Buffer.slice 方法的作用 Buffer.slice 方法用于从现有的 Buffer 对象中创建一个新的 Buffer 实例,并将它们之间的指定位置之间的数据复制到新的 Buffer 中。新的 Buffer 实例是现有 Buffer 的一个视图(也就是使用相同的内…

    node js 2023年6月8日
    00
  • NodeJs通过async/await处理异步的方法

    下面是关于Node.js通过async/await处理异步的方法的完整攻略。 什么是async/await async/await是ES2017中引入的一种处理异步方法的语法糖。通过async/await指令,我们可以编写出类似于同步代码的方式来处理异步代码,让异步代码看上去更加整洁和易于理解。 在async函数中使用await指令会等待异步的Promise…

    node js 2023年6月8日
    00
  • nodejs图片处理工具gm用法小结

    Node.js图片处理工具gm用法小结 简介 GraphicsMagick (GM) 是一个命令行图象处理程序,所以需要在终端下运行,较为麻烦。而 gm 模块就是对 GraphicsMagick 程序进行封装,使其可以通过 Node.js 调用,在 Node.js 中操作图片变得异常方便。 安装 首先,需要在本地安装 GraphicsMagick 或者 Im…

    node js 2023年6月8日
    00
  • express+multer上传图片打开乱码问题及解决

    首先,我们需要明确一下什么是“乱码”问题。在计算机领域,乱码通常指的是字符集不匹配或者编码格式错误导致的文本显示异常。在网站开发中,上传图片并展示时,会遇到乱码问题,这可能是因为图片编码格式的问题导致的。 针对该问题,我们可以使用express和multer解决。以下是具体的解决方法: 1. 安装multer 我们首先需要安装multer依赖包,可以使用以下…

    node js 2023年6月8日
    00
  • node.js中的console.assert方法使用说明

    Node.js中的console.assert方法使用说明 简介 console.assert()是Node.js中自带的一个断言方法,其主要功能是在表达式为“假”的情况下输出错误信息。 语法 console.assert(expression, message) expression: 必需。一个布尔表达式,如果为false,则会触发一个Assertion…

    node js 2023年6月8日
    00
  • 详解vue+nodejs获取多个表数据的方法

    关于“详解vue+nodejs获取多个表数据的方法”的完整攻略,以下是详细步骤和示例说明。 步骤: 创建一个Vue项目: vue create project_name 安装axios和vue-resource: npm install axios vue-resource –save 在main.js中引入Vue和vue-resource: import…

    node js 2023年6月8日
    00
  • 详解javascript中的babel到底是什么

    详解JavaScript中的Babel到底是什么 什么是Babel? Babel是流行的JavaScript编译器,它的目的是将最新的JavaScript代码转换成向后兼容的版本,以便在所有浏览器和环境中运行。JavaScript在不断更新,但并非所有的浏览器都支持最新的语法和功能。因此,Babel通过将新代码转换为旧版代码,使之在旧版浏览器和环境中运行。 …

    node js 2023年6月9日
    00
  • node.js中module模块的功能理解与用法实例分析

    我很乐意为您详细讲解“Node.js中module模块的功能理解与用法实例分析”的攻略。 什么是Node.js中的模块(module) 在Node.js中,每一个文件都被视为一个独立的模块。模块在Node.js中是被用来实现代码复用,并且可以避免命名冲突。Node.js中具有将代码拆分为小部分和后续加载它们的能力,这样在项目开发中只需要加载需要的部分代码就可…

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