详解nodejs爬虫程序解决gbk等中文编码问题

下面给出 “详解nodejs爬虫程序解决gbk等中文编码问题”的完整攻略。

背景

在编写爬虫程序时,如果在抓取中文网页时,如果网页编码为 gbk 或其他不是 utf-8 的编码,那么会因为编码不匹配而出现乱码,无法正确获取中文数据。因此必须对编码进行转换。

解决方法

方法一:使用iconv-lite包

iconv-lite 是一个将字符串从一种字符编码转换为另一种字符编码的库。具体使用方法如下:

  1. 安装iconv-lite
npm install --save iconv-lite
  1. 引入iconv-lite
const iconv = require('iconv-lite');
  1. 将响应体数据(Buffer类型)转换为字符串
const body = iconv.decode(res.body, 'gbk');

这里的 'gbk' 表示将 res.body 从 gbk 编码转为 utf-8 编码,也可以根据实际情况修改编码类型。

方法二:使用request包

request 是一个非常流行的 Node.js 请求库,同时也能够解决编码问题,具体使用方法如下:

  1. 安装request和iconv-lite
npm install --save request iconv-lite
  1. 引入request和iconv-lite
const request = require('request');
const iconv = require('iconv-lite');
  1. 发送请求
request({
  url: 'http://www.example.com',
  encoding: null  // 告诉request不要自动处理编码
}, (error, response, body) => {
  const html = iconv.decode(body, 'gbk');
  console.log(html);
});

也可以在全局初始化时设置全局默认编码类型,具体代码如下:

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

request.defaults({
  encoding: null,    // 告诉request不要自动处理编码
  headers: {          // 伪造浏览器User-Agent,避免被识别为爬虫
    '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',
  }
});

request('http://www.example.com', (error, response, body) => {
  const html = iconv.decode(body, 'gbk');
  console.log(html);
});

这里设置 headers 是为了避免被目标网站的反爬机制识别为爬虫。

示例说明

下面给出两个例子来说明上述两种方法的使用。

示例一:使用iconv-lite

在这个例子中,我们使用iconv-lite将获取网易云音乐的歌曲列表。

  1. 安装依赖
npm install --save request request-promise iconv-lite cheerio
  1. 引入依赖
const request = require('request');
const rp = require('request-promise');
const iconv = require('iconv-lite');
const cheerio = require('cheerio');
  1. 发送请求
const options = {
    uri: 'https://music.163.com/discover/toplist?id=645191942',
    transform: (body) => {
        return iconv.decode(body, 'gbk');
    }
};

rp(options)
    .then((html)=> {
        const $ = cheerio.load(html);
        const list = $('.f-hide li a');
        console.log('网易云热歌榜:');
        list.each(function (index, element) {
            console.log($(element).text());
        });
    })
    .catch((err) => {
        console.log(err);
    });

这里我们使用了 request-promise 来发送异步请求。通过 iconv.decode() 方法将响应体从 gbk 转换成 utf-8 编码,然后使用 cheerio 解析 HTML 代码,获取到歌曲列表信息。

示例二:使用request

在这个例子中,我们使用request获取豆瓣图书的信息。

  1. 安装依赖
npm install --save request iconv-lite cheerio
  1. 引入依赖
const request = require('request');
const iconv = require('iconv-lite');
const cheerio = require('cheerio');
  1. 发送请求
const url = 'https://book.douban.com/subject/1084336/';

request({
    url,
    encoding: null,    // 告诉request不要自动处理编码
    headers: {          // 伪造浏览器User-Agent,避免被识别为爬虫
        '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',
    }
}, (error, response, body) => {
    if (!error && response.statusCode === 200) {
        const html = iconv.decode(body, 'gbk');
        const $ = cheerio.load(html);
        const title = $('h1 span').text();
        const author = $('span.pl:contains("作者")').next().text();
        const publisher = $('span.pl:contains("出版社")').next().text();
        const pubdate = $('span.pl:contains("出版年")').next().text();
        const price = $('span.pl:contains("定价")').next().text();

        console.log('书名:' + title);
        console.log('作者:' + author);
        console.log('出版社:' + publisher);
        console.log('出版日期:' + pubdate);
        console.log('价格:' + price);
    } else {
        console.log(error);
    }
});

此处使用了 request 发送请求,通过设置 encoding: null 不自动处理编码,然后使用 iconv.decode() 方法将响应体从 gbk 转换成 utf-8 编码,接着通过 cheerio 解析 HTML 代码,获取到图书信息。

总结

通过本篇文章,我们介绍了两种解决Node.js中爬虫程序中文编码问题的方法,并且通过两个示例来验证了这两种方法的可行性。同时,对于网站爬取还需注意网站反爬虫机制和版权问题,建议使用爬虫预处理技术和 respect IP 遵守相关法规。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解nodejs爬虫程序解决gbk等中文编码问题 - Python技术站

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

相关文章

  • 如何自定义Jackson序列化 @JsonSerialize

    下面是我对于如何自定义Jackson序列化 @JsonSerialize的完整攻略,包括两条示例说明: 什么是Jackson序列化? Jackson是一个常用的Java数据序列化库,可以将Java对象转换为JSON格式的数据并输出。在序列化的过程中,Jackson将Java对象属性映射为JSON键值对,同时支持自定义序列化逻辑。 @JsonSerialize…

    Java 2023年5月26日
    00
  • 详解SpringMVC中使用Interceptor拦截器

    详解SpringMVC中使用Interceptor拦截器的完整攻略 在SpringMVC中,Interceptor拦截器是一种非常常用的组件,它可以在请求到达Controller之前或之后进行一些处理,例如权限验证、日志记录等。本文将介绍如何在SpringMVC中使用Interceptor拦截器,并提供两个示例说明。 步骤一:创建Interceptor拦截器…

    Java 2023年5月17日
    00
  • 什么是强引用?

    强引用是指在代码中通过变量名来引用一个对象,这个引用会使得对象的引用计数 +1,因此只要有强引用存在,对象就不会被垃圾回收器回收。 在实际的开发中,如果使用强引用过度,会导致内存泄漏的问题,因此我们需要尽可能减少对强引用的使用。 下面是解释如何在代码中使用强引用的攻略: 使用强引用 在代码中使用强引用非常简单,只需要定义一个变量,然后将其初始化为要引用的对象…

    Java 2023年5月10日
    00
  • Java的Struts框架报错“ActionForwardInvalidateException”的原因与解决办法

    当使用Java的Struts框架时,可能会遇到“ActionForwardInvalidateException”错误。这个错误通常由以下原因之一起: ActionForward配置错误:如果配置文件中没有正确配置ActionForward,则可能会现此错误。在这种情况下,需要检查文件以解决此问题。 ActionForward无效:如果ActionForwa…

    Java 2023年5月5日
    00
  • Java SpringMVC 集成静态资源的方式你了解吗

    Java SpringMVC 集成静态资源的方式 在Java SpringMVC中,我们可以使用多种方式来集成静态资源,如CSS、JavaScript、图片等。本文将详细讲解Java SpringMVC集成静态资源的方式。 方式一:使用标签 标签是SpringMVC提供的一种集成静态资源的方式。下面是一个使用标签的示例代码: <mvc:resource…

    Java 2023年5月18日
    00
  • Struts2开发环境搭建 附简单登录功能实例

    Struts2开发环境搭建 附简单登录功能实例 开发环境要求 首先,我们需要准备好以下开发环境:- Java JDK 1.7或者更高版本- Apache Tomcat 7或者更高版本- Eclipse IDE 或者其他Java集成开发环境 下载安装Tomcat 下载Tomcat 在Apache Tomcat的官网上,我们可以选择合适的版本进行下载和安装。一般…

    Java 2023年5月20日
    00
  • 基于Mongodb分布式锁简单实现,解决定时任务并发执行问题

    前言 我们日常开发过程,会有一些定时任务的代码来统计一些系统运行数据,但是我们应用有需要部署多个实例,传统的通过配置文件来控制定时任务是否启动又太过繁琐,而且还经常出错,导致一些异常数据的产生 网上有很多分布式锁的实现方案,基于redis、zk、等有很多,但是我的就是一个用了mysql和mongo的小应用,不准备引入其他三方中间件来解决这个问题,撸一个简单的…

    Java 2023年4月19日
    00
  • 详解Spring Data Jpa当属性为Null也更新的完美解决方案

    下面是详细讲解“详解Spring Data Jpa当属性为Null也更新的完美解决方案”的完整攻略。 1. 背景介绍 在使用Spring Data JPA时,我们通常会遇到这样的情况:当我们更新一个实体时,如果某些属性的值为Null,则这些属性值不会被更新到数据库中。这是因为Spring Data JPA默认情况下只会更新实体中不为Null的属性值。这可能会…

    Java 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部