详解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日

相关文章

  • Springboot详解线程池与多线程及阻塞队列的应用详解

    Spring Boot详解线程池与多线程及阻塞队列的应用详解 概述 在 Java 中使用线程池和多线程可以提高程序的并发处理能力,加快计算速度。Spring Boot 提供了良好的支持,本文将介绍 Spring Boot 中线程池与多线程及阻塞队列的应用,并通过示例说明。 线程池 线程池的作用 线程池可以减少线程的创建和销毁所带来的性能开销,并可以对并发执行…

    Java 2023年5月19日
    00
  • SpringBoot多数据源配置并通过注解实现动态切换数据源

    下面就为你详细讲解如何实现Spring Boot多数据源配置,并通过注解实现动态切换数据源的完整攻略。 1. 添加依赖 首先,在pom.xml文件中添加Spring Boot与MySQL相关的依赖: <dependencies> <!– Spring Boot相关依赖 –> <dependency> <group…

    Java 2023年5月20日
    00
  • 源码解读Spring-Integration执行过程

    源码解读Spring-Integration执行过程的完整攻略: 简介 Spring-Integration 是 Spring 基于事件驱动、消息推送的一种框架。它是 Spring 企业级开发的一个扩展模块,用于实现不同系统之间的数据交换。Spring-Integration 同时也是 Spring Boot 的子模块之一。它可以使用各种类型的消息传输协议,…

    Java 2023年5月20日
    00
  • Java数据结构及算法实例:冒泡排序 Bubble Sort

    Java数据结构及算法实例:冒泡排序 Bubble Sort 冒泡排序概念 冒泡排序算法是通过不断地比较相邻两个元素,把较大的元素交换到后面,较小的元素交换到前面,以此类推,直到整个数组有序的排序算法。 冒泡排序基本思路 冒泡排序的基本思路是不断地比较相邻的元素,如果前面的元素比后面的元素大,则交换这两个元素。这样,每一次都可以将最大的元素“浮”到最后面。由…

    Java 2023年5月19日
    00
  • Java8加java10等于Java18的版本查看及特性详解

    Java8加Java10等于Java18的版本查看及特性详解 在本篇攻略中,我们会讲解如何通过一些简单的命令来查看Java版本,并介绍一些Java8和Java10的重要特性。同时,我们还会提到Java18这一版本是否真实存在的问题。 1. 查看Java版本 1.1 使用java -version命令 在命令行中键入java -version命令,可查看当前系…

    Java 2023年5月19日
    00
  • 一文讲解如何优雅的调试jar包

    一文讲解如何优雅地调试jar包 在开发过程中,我们经常会用到jar包来提供或使用某些功能,而在使用过程中,有时需要调试jar包中的代码,以定位或解决问题。本文将介绍如何优雅地调试jar包,以提高我们的开发效率。 1. 使用源码依赖 当我们使用某些jar包时,如果其提供了源码,我们可以将其作为项目的依赖包,这样就可以在IDE中直接调试jar包源码了。 具体步骤…

    Java 2023年5月26日
    00
  • Java面向对象三大特性及多态解析

    Java面向对象编程是Java语言的基础,它支持三大特性:继承、封装和多态。其中,多态是Java最核心的特性,常常用于实现高效的代码重用和面向接口的编程。本篇攻略将详细讲解Java面向对象三大特性及多态解析。 一、继承 1.继承的定义 继承(Inheritance)是指一个类(称为子类、派生类)继承另外一个类(称为父类、基类)所有非私有的方法和属性。通过继承…

    Java 2023年5月26日
    00
  • Java常用类之日期相关类使用详解

    Java常用类之日期相关类使用详解 Java提供了很多日期相关的类,包括日期、时间、日期时间、时间戳等类型,本文将对这些类的使用进行详解,方便大家在Java开发中更加灵活、方便的操作日期。 Date类 java.util.Date类是Java日期相关类的源头,代表着一个精确到毫秒级别的时间戳。但是,它已经过时不建议使用了。我们现在推荐使用java.time包…

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