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

如何用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中Request模块处理HTTP协议请求的基本使用教程

    下面是关于“Node.js中Request模块处理HTTP协议请求的基本使用教程”的完整攻略。 1. 简介 Node.js是一个基于Chrome V8 JavaScript引擎的运行环境。它可以用来开发服务器端应用程序,也可以用来编写命令行工具。request模块是一个第三方模块,用于简化使用http模块的过程。 2. 安装 在使用request模块之前,需…

    node js 2023年6月8日
    00
  • 如何在node环境实现“get数据解析”代码实例

    下面是“如何在node环境实现‘get数据解析’代码实例”的完整攻略: 步骤一:安装依赖 在开始之前,你需要确保已经安装了 Node.js 环境。接下来,你需要使用 npm 安装一些必要的依赖: npm install express body-parser –save 其中,express 是一个 web 框架,而 body-parser 是一个用于解析…

    node js 2023年6月8日
    00
  • NodeJS模块Buffer原理及使用方法解析

    NodeJS模块Buffer原理及使用方法解析 什么是Buffer Buffer是Node.js提供的一个用于处理二进制数据的类,它是一个全局的构造函数,用于在Node.js中存储二进制数据。Buffer对象类似于整数数组,但它对应于V8堆内存之外的一块原始内存。 在Node.js中,二进制数据经常被传输和操作,例如读取文件、网络I/O等。Buffer类提供…

    node js 2023年6月8日
    00
  • JavaScript双向链表实现LRU缓存算法的示例代码

    首先,我们需要了解下什么是双向链表和LRU缓存算法。 双向链表:每个节点有两个指针,一个指向其前驱节点,一个指向其后继节点。双向链表的优势在于可以快速对链表中的任意节点进行插入、删除和移动操作,时间复杂度均为O(1)。 LRU缓存算法:Least Recently Used,即最近最少使用。LRU缓存算法通过记录缓存中每个数据项的访问时间,当缓存空间满时,将…

    node js 2023年6月8日
    00
  • Express 框架中使用 EJS 模板引擎并结合 silly-datetime 库进行日期格式化的实现方法 原创

    下面是如何在 Express 框架中使用 EJS 模板引擎并结合 silly-datetime 库进行日期格式化的实现方法,分为以下两个步骤: 步骤一:安装和配置 1. 安装 Express 和 EJS 在项目根目录中运行以下命令来安装 Express 和 EJS: npm install express ejs –save 2. 安装 silly-dat…

    node js 2023年6月8日
    00
  • nodejs实现jwt的示例代码

    请允许我详细讲解 “Node.js 实现 JWT 的示例代码” 的完整攻略。 概述 JWT(Json Web Token)是一种安全跨域的验证和交互方式,可以在不同的服务之间传递信息,而无需了解或共享用户登录信息。它由头部、载荷和签名组成,被称为 jwt 的三个部分。使用 Node.js 实现 JWT 是比较简单的,接下来我们就来看如何编写代码。 安装依赖 …

    node js 2023年6月8日
    00
  • 基于node搭建服务器,写接口,调接口,跨域的实例

    首先,我们需要明确基于node搭建服务器并写接口,其实就是利用node提供的http模块来实现服务器端的开发。在搭建服务器时,需要注意以下几个步骤: 步骤1:创建一个npm项目 首先,打开命令行工具,进入要创建项目的文件夹中,输入以下命令: npm init 然后,按照提示输入项目的相关信息,如名字、版本号、描述等等。 步骤2:安装依赖库 在项目中使用到的依…

    node js 2023年6月8日
    00
  • 测试驱动ChatGPT编程示例详解

    下面就是测试驱动ChatGPT编程示例的完整攻略: 总述 第一步是准备好ChatGPT模型。ChatGPT是一种语言模型,可以进行自然语言生成。它的原理是基于大量文本数据进行训练,并且在训练好的基础上进行生成。 第二步是准备好ChatGPT的测试数据集。这个测试数据集可以来源于真实的人机对话,也可以仿真出来。测试数据集的作用是验证ChatGPT模型的生成效果…

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