5分钟从零开始构建一个Node.js小爬虫程序并生成网站

2024-02-01 22:48

本文主要是介绍5分钟从零开始构建一个Node.js小爬虫程序并生成网站,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

通过RSS2JSON和Node.js设计一个简单的小爬虫

阅读这篇blog大约需要5分钟

之前我们学习了解了很多Node.js、云部署的基础知识,今天通过一个小爬虫练习实践一下,你会发现从零开始构建一个小爬虫超级简单和方便。主要会涉及到这些知识点:

  • 通过RSS2JSON将rss转化为json格式
  • MUI CSS设计极简风格
  • Node.js异步编程
  • axios模块
  • cheerio模块
  • 通过heroku上云

The first 90% of the code accounts for the first 90% of the development time. The remaining 10% of the code accounts for the other 90% of the development time. --Tom Cargill

介绍

这是下面的主要内容:

  1. RSS2JSON
  2. MUI
  3. 编写Node.js代码
  4. 测试运行
  5. 部署到云服务

Here we go!

RSS2JSON

RSS2JSON是一个帮助把rss转化为json的api工具,网址是:

https://rss2json.com/

下面我把国外某博客网站flutter文章的rss转化为json内容:

https://api.rss2json.com/v1/api.json?rss_url=https%3A%2F%2Fmedium.com%2Ffeed%2Fflutter

输出:

{
"status": "ok"
"feed": {
"url": "https://medium.com/feed/flutter"
"title": "Flutter - Medium"
"link": "https://medium.com/flutter?source=rss----4da7dfd21a33---4"
"author": ""
"description": "Flutter is Google's mobile UI framework for crafting high-quality native interfaces on iOS and Android in record time. Flutter works with existing code, is used by developers and organizations around the world, and is free and open source. Learn more at https://flutter.dev - Medium"
"image": "https://cdn-images-1.medium.com/proxy/1*TGH72Nnw24QL3iV9IOm4VA.png"
}
"items": [
{
"title": "When should I useAnimatedBuilder or AnimatedWidget?"
"pubDate": "2020-01-19 20:57:30"
"link": "https://medium.com/flutter/when-should-i-useanimatedbuilder-or-animatedwidget-57ecae0959e8?source=rss----4da7dfd21a33---4"
"guid": "https://medium.com/p/57ecae0959e8"
"author": "Emily Fortuna"
"thumbnail": "https://cdn-images-...

如何通过Node的axios来调用api,可以我之前的blog:

  • Node.js学习笔记6-网络请求和API调用

MUI

一个极简风格的CSS库,项目主页:

https://www.muicss.com/

使用非常简单,直接引用css和js代码即可,文件很小:

mui.min.css - 6.6KB (gzipped)
mui.min.js - 5.4KB (gzipped)

推荐大家可以自己随意测试一下,界面还蛮漂亮的。

编写Node.js代码

主要的逻辑:

  1. 我先提前准备了两个模板页面: index_template.html,body_template.html。
  2. 根据rss地址下载json内容。
  3. 提取header信息生成一个列表-主页。
  4. 根据每篇blog内容分别生成blog页面。

异步代码的写法可以参考我的blogs:

  • Node.js学习笔记5-异步编程

主要的代码tools.js:

const fs = require('fs').promises;
const axios = require('axios');
const cheerio = require('cheerio');const url = 'https://api.rss2json.com/v1/api.json?rss_url=https%3A%2F%2Fmedium.com%2Ffeed%2Fflutter';async function download() {const resp = await axios.get(url);const data = resp.data;generateIndex(data);for (const item of data.items) {downloadBlogs(item);}}const generateIndex = async (data) => {try {const index = await fs.readFile('./Templates/index_template.html');let indexString = index.toString();const contenct = getIndexContent(data);indexString = indexString.replace('index-place', contenct);indexString = indexString.replace('date-place', Date());await fs.writeFile('./public/index.html', indexString);console.log('index.html completed.');} catch (e) {console.log(e);}
}const downloadBlogs = async (item) => {const guid = item.guid.split('/').pop();const title = item.title;const description = item.description;try {const index = await fs.readFile('./Templates/blog_template.html');let indexString = index.toString();indexString = indexString.replace('title-place', title);indexString = indexString.replace('body-place', description);await fs.writeFile('./public/Flutter/' + guid + '.html', indexString);console.log(`${guid} completed.`);} catch (e) {console.log(e);}}const getIndexContent = (data) => {let content = "";for (const item of data.items) {content = content + getHeader(item) + '<br>\n<br>\n';}return content;
}const getHeader = (item) => {const guid = item.guid.split('/').pop();const header = `<div class=\"mui--text-headline\">${item.title}</div>`;const author = `<div class=\"mui--text-black-54\">By ${item.author}, ${item.pubDate}</div>`;const description = getDescription(item.description);const body = `<div>${description}<a href=\"./Flutter/${guid}.html\"> Read more...</a></div>`;return `${header}\n<br>\n${author}\n<br>\n${body}\n<br>\n`;
}const getDescription = (body) => {$ = cheerio.load(body);const desc = $('p').text().substring(0, 400);return desc;
};module.exports = {download
};

这里通过axios来发送请求,axios是Node里面应用广泛的网络请求模块,支持Promise格式。

通过强大的cheerio来解析网页内容。

然后启动一个express服务,并设定一个定时任务每隔一小时更新数据:

server.js:

const express = require('express');
const tools = require('./tools');const app = express();const PORT = process.env.PORT || 3000;setInterval(tools.download, 3600000);app.use(express.static(__dirname + '/public'));app.listen(PORT);

express.static()可以提供静态网页的web服务。

测试运行

就是这么简单,下面测试一下:

  1. 手动测试运行可以直接运行download函数:
node app.js

可以看到所有的页面都自动生成完毕。

  1. 然后启动express web服务:
npm start
  1. 现在可以通过localhost:3000来查看我们的blogs网站,极简风格:

在这里插入图片描述

部署到云服务

在heroku上创建一个应用,将node应用部署上去,具体步骤可以参见之前的blog:

  • 将Node.js应用上云(heroku)

访问demo站点:

https://lit-caverns-74731.herokuapp.com/

小结

一般我们都会通过python来编写爬虫,通过Node.js来做其实也超级方便。首先Node基于JavaScript,而且也提供了完善的生态和异步编程,所以开发效率也非常高。

特别声明

本项目作为个人学习笔记,非商业用途,仅供个人研究学习使用。

项目代码

  • medium-blogs

参考阅读

  • https://rss2json.com/
  • https://www.muicss.com/
  • https://www.npmjs.com/package/axios
  • https://www.npmjs.com/package/cheerio
  • https://blog.csdn.net/starshus/category_9699665.html

这篇关于5分钟从零开始构建一个Node.js小爬虫程序并生成网站的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/668716

相关文章

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

Three.js构建一个 3D 商品展示空间完整实战项目

《Three.js构建一个3D商品展示空间完整实战项目》Three.js是一个强大的JavaScript库,专用于在Web浏览器中创建3D图形,:本文主要介绍Three.js构建一个3D商品展... 目录引言项目核心技术1. 项目架构与资源组织2. 多模型切换、交互热点绑定3. 移动端适配与帧率优化4. 可

Python从Word文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W

Python利用PySpark和Kafka实现流处理引擎构建指南

《Python利用PySpark和Kafka实现流处理引擎构建指南》本文将深入解剖基于Python的实时处理黄金组合:Kafka(分布式消息队列)与PySpark(分布式计算引擎)的化学反应,并构建一... 目录引言:数据洪流时代的生存法则第一章 Kafka:数据世界的中央神经系统消息引擎核心设计哲学高吞吐

Springboot项目构建时各种依赖详细介绍与依赖关系说明详解

《Springboot项目构建时各种依赖详细介绍与依赖关系说明详解》SpringBoot通过spring-boot-dependencies统一依赖版本管理,spring-boot-starter-w... 目录一、spring-boot-dependencies1.简介2. 内容概览3.核心内容结构4.

C#使用Spire.XLS快速生成多表格Excel文件

《C#使用Spire.XLS快速生成多表格Excel文件》在日常开发中,我们经常需要将业务数据导出为结构清晰的Excel文件,本文将手把手教你使用Spire.XLS这个强大的.NET组件,只需几行C#... 目录一、Spire.XLS核心优势清单1.1 性能碾压:从3秒到0.5秒的质变1.2 批量操作的优雅

Python使用python-pptx自动化操作和生成PPT

《Python使用python-pptx自动化操作和生成PPT》这篇文章主要为大家详细介绍了如何使用python-pptx库实现PPT自动化,并提供实用的代码示例和应用场景,感兴趣的小伙伴可以跟随小编... 目录使用python-pptx操作PPT文档安装python-pptx基础概念创建新的PPT文档查看

基于Python编写自动化邮件发送程序(进阶版)

《基于Python编写自动化邮件发送程序(进阶版)》在数字化时代,自动化邮件发送功能已成为企业和个人提升工作效率的重要工具,本文将使用Python编写一个简单的自动化邮件发送程序,希望对大家有所帮助... 目录理解SMTP协议基础配置开发环境构建邮件发送函数核心逻辑实现完整发送流程添加附件支持功能实现htm

C#控制台程序同步调用WebApi实现方式

《C#控制台程序同步调用WebApi实现方式》控制台程序作为Job时,需同步调用WebApi以确保获取返回结果后执行后续操作,否则会引发TaskCanceledException异常,同步处理可避免异... 目录同步调用WebApi方法Cls001类里面的写法总结控制台程序一般当作Job使用,有时候需要控制