如何用Node写页面爬虫的工具集

yizhihongxing

如何用Node写页面爬虫的工具集?

一、准备工作

  1. 安装Node.js环境。

  2. 安装Node.js的包管理器npm,安装方法为在终端中输入npm install npm -g

  3. 安装request、cheerio、iconv-lite等Node模块,这些模块用于发起网络请求、解析HTML页面内容和处理编码问题,命令行方式为npm install request cheerio iconv-lite -S

二、基础知识

  1. HTTP请求

Node.js中发起HTTP请求的方式比较简单,利用request模块实现对目标网页的请求。下面是一个最简单的request请求:

const request = require('request');

request('http://www.baidu.com', function (error, response, body) {
  console.log('error:', error); // 输出可能出现的错误信息
  console.log('statusCode:', response && response.statusCode); // 输出响应的状态码
  console.log('body:', body); // 输出响应的内容
});
  1. HTML解析

Node.js中有很多解析HTML的模块,其中比较常用的是cheerio模块。cheerio模块拥有和jQuery类似的API,操作起来比较简单。使用方式如下:

const cheerio = require('cheerio');

const html = '<div class="container"><h1>标题</h1><ul><li>条目1</li><li>条目2</li></ul></div>';
const $ = cheerio.load(html);
console.log($('h1').text()); // 输出“标题”
console.log($('li').text()); // 输出“条目1 条目2”

此外,对于每个节点可以使用attr方法获取它的属性值,例如:

console.log($('div').attr('class')); // 输出“container”
  1. 编码处理

有些页面可能会出现编码问题,比如HTML页面的编码是gbk,但是我们在Node.js中获取响应内容时却是utf-8的格式,因此需要使用iconv-lite模块将其中一个编码格式转成另一个编码格式,代码如下:

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

const content = '<meta charset="gbk"><div class="container">容器</div>';
const buffer = iconv.encode(content, 'gbk'); // 将内容按照gbk编码转成buffer对象
const decodedContent = iconv.decode(buffer, 'utf-8'); // 将buffer对象按照utf-8编码转成字符串
console.log(decodedContent); // 输出“容器”

三、编写页面爬虫的工具集

在了解了Node.js的基础知识之后,我们可以开始编写页面爬虫的工具集。

下面是一个最简单的爬虫程序,作用是获取目标网页的所有文本内容:

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

function getHtmlText(url, encoding, callback) {
  request({
    url,
    encoding: null, // 需要设置为null,才能获取到buffer对象
  }, (error, response, body) => {
    if (error || response.statusCode !== 200) {
      callback(error);
      return;
    }

    const decodedBody = iconv.decode(body, encoding || 'utf-8');
    const $ = cheerio.load(decodedBody);

    callback(null, $('body').text());
  });
}

上述代码中的getHtmlText函数包含三个参数:目标网页的URL、目标网页的编码和回调函数,其中回调函数的参数是error和text,表示请求过程中的错误信息和目标网页的文本内容。

我们可以扩展该工具集,添加一些有用的功能,比如获取页面中的所有链接,代码如下:

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

function getHtmlLinks(url, encoding, callback) {
  request({
    url,
    encoding: null, // 需要设置为null,才能获取到buffer对象
  }, (error, response, body) => {
    if (error || response.statusCode !== 200) {
      callback(error);
      return;
    }

    const decodedBody = iconv.decode(body, encoding || 'utf-8');
    const $ = cheerio.load(decodedBody);

    const links = [];
    $('a').each((index, element) => {
      links.push({
        text: $(element).text(),
        href: $(element).attr('href'),
      });
    });

    callback(null, links);
  });
}

上述代码中的getHtmlLinks函数通过遍历HTML页面中所有的a标签,获取它们的文本内容和href属性,最终返回一个包含所有链接的数组。

四、示例说明

下面是使用上述工具集编写的两个示例:

  1. 获取《百年孤独》的内容概要
const url = 'http://book.douban.com/subject/6082808/';
getHtmlText(url, 'utf-8', (error, text) => {
  if (error) {
    console.error(error);
    return;
  }

  const content = text.replace(/\n|\s/g, '');
  const re = /<h2>《百年孤独》内容简介<\/h2>(.*?)<divclass="clear">/i; // 获取书本简介的正则表达式
  const match = content.match(re);
  if (!match) {
    console.error('没有找到书本简介');
    return;
  }

  const summary = match[1].replace(/<[^<>]+?>/g, '').replace(/\s+/g, '');
  console.log(summary);
});

上述代码中的正则表达式是从豆瓣读书网站的HTML页面中手动整理出来的,通过正则匹配可以获取到《百年孤独》一书的内容概要。

  1. 获取百度搜索结果的所有链接
const query = 'Node.js';
const url = `http://www.baidu.com/s?wd=${query}`;
getHtmlLinks(url, 'utf-8', (error, links) => {
  if (error) {
    console.error(error);
    return;
  }

  links.forEach(link => console.log(link.href));
});

上述代码中的query变量表示搜索的关键词,通过请求百度搜索页面并解析所有a标签,最终可以获取到所有搜索结果的链接。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:如何用Node写页面爬虫的工具集 - Python技术站

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

相关文章

  • Node.js开发之访问Redis数据库教程

    Node.js开发之访问Redis数据库教程 什么是Redis数据库? Redis(Remote Dictionary Server)是一种基于键值对的开源数据结构存储系统,是一种高效的内存数据存储服务,它支持多种数据结构(string、hash、list、set、zset等),提供了丰富的数据操作命令,支持事务、持久化等高级功能,常用于缓存、消息队列、分布…

    node js 2023年6月8日
    00
  • 浅析node Async异步处理模块用例分析及常用方法介绍

    以下是“浅析node Async异步处理模块用例分析及常用方法介绍”的攻略: 一、异步处理模块Async 1.1 Async模块简介 Async是Node.js中最常用的异步处理模块,可以帮助我们简化异步流程的处理。Async提供了一系列方法,可以让我们轻松地控制异步代码的执行顺序,以及在任务完成后获取返回值。 1.2 Async模块的使用 使用Async模…

    node js 2023年6月8日
    00
  • JS新包管理工具yarn和npm的对比与使用入门

    JS新包管理工具yarn和npm的对比与使用入门 前言 JavaScript开发中我们经常会使用到包管理工具。传统的包管理工具npm已经被广泛使用,但是最近出现了一款新的包管理工具yarn。本文将简要介绍这两款工具的对比以及使用入门。 新版Node.js已预装npm 在开始使用npm之前,需要确保已经安装了Node.js,如果是新版的Node.js,那么np…

    node js 2023年6月9日
    00
  • node.js中的fs.mkdir方法使用说明

    当需要在Node.js中创建一个新的文件夹时,可以使用fs.mkdir()方法。下面是该方法的使用说明: fs.mkdir() 这个方法用于在文件系统中创建一个新的目录。它可以接受以下参数: 语法 fs.mkdir(path[, options], callback) 参数 path (string):创建目录的完整路径 options (Object) 可…

    node js 2023年6月8日
    00
  • Node.js如何使用Diffie-Hellman密钥交换算法详解

    Node.js如何使用Diffie-Hellman密钥交换算法详解 简介 Diffie-Hellman密钥交换算法是一种非对称加密算法,用于在两个或多个参与方之间安全地传输秘密信息。该算法由Whitfield Diffie和Martin Hellman在1976年提出,是公钥加密的先驱算法之一。 在本文中,我们将讲解如何使用Node.js实现Diffie-H…

    node js 2023年6月8日
    00
  • JS使用Prim算法和Kruskal算法实现最小生成树

    若要使用Prim算法和Kruskal算法实现最小生成树,可以按照以下步骤进行: 1. 了解最小生成树 最小生成树是一个连通无向图的生成树,其树上的所有边的权值之和最小。在解决一些通信网络、交通运输、电力网络等问题时,最小生成树有着重要的作用。 2. 了解Prim算法 Prim算法用于解决加权无向图的最小生成树问题。该算法通过选取当前生成树中与未选择顶点最近的…

    node js 2023年6月8日
    00
  • 支撑Java NIO与NodeJS的底层技术

    要详细讲解支撑Java NIO与NodeJS的底层技术,首先需要了解以下两个方面: 网络通信的基本原理及底层实现机制; Java NIO和NodeJS的核心概念和实现原理。 接下来,我们将分别从这两个方面展开讲解。 一、网络通信的基本原理及底层实现机制 在网络通信过程中,客户端和服务器通过IP地址和端口号进行连接,然后通过协议进行数据的传输。常见的网络协议有…

    node js 2023年6月8日
    00
  • 如何手动实现一个 JavaScript 模块执行器

    下面我将为你详细讲解”如何手动实现一个JavaScript模块执行器”的攻略。 什么是JavaScript模块执行器 JavaScript模块执行器是用来将JavaScript代码模块化的一种工具。它可以自动处理模块的依赖关系,确保每个模块都会按照正确的顺序加载,并且只会加载一次,从而避免了命名冲突和重复加载的问题。在ES6出现之前,JavaScript模块…

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