从基础到实践:掌握Node.js后端开发与实现豆瓣电影爬虫项目
前言
欢迎步入编程与技术探索的奇妙之旅!在这个数字时代,编程已成为解锁创新、解决复杂问题的关键。今天,我们将携手踏入Node.js的疆域,这一JavaScript的服务器端王者,不仅打破了前后端的界限,还以其轻盈高效的姿态,引领着现代Web开发的新潮流。紧接着,我们将搭乘“爬虫”号探险船,深入数据的海洋——以豆瓣电影为目的地,学习如何巧妙地自动化收集并分析互联网上的宝贵信息。这不仅是一次技术的磨练,更是一场对信息自由探索的激情之旅。准备好了吗?让我们一起启航,用代码编织梦想,揭开数据背后的秘密。
首先
了解相关知识
Node.js 与 NPM
- Node.js:它不仅让JavaScript能够运行在服务端,还因其非阻塞I/O和事件驱动的特性,非常适合构建高性能的网络应用。对于后端开发,特别是处理大量并发请求和实时数据交互的应用,Node.js是一个流行的选择。
- NPM (Node Package Manager) :它是随Node.js一起安装的包管理器,极大地便利了JavaScript开发者的包依赖管理和项目构建过程。通过
npm i
命令(或更现代的npm install
)可以安装项目所需的外部库或框架,如request-promise
和cheerio
,这些包能帮助开发者快速实现功能,无需从零开始编写所有代码。
首先打开代码相关路径的控制台,输入下方代码
npm i request-promise
npm i cheerio
这两个包的作用为:request-promise
负责网络请求部分,获取网页数据,而cheerio
则在数据到达后,扮演“数据挖掘工”的角色,高效地从HTML源码中筛选和提取出所需要的信息。
好了,一个简单爬虫项目的相关知识已经完毕,让我们来进入代码部分。
代码
先引入我们下载好的包
// 引入request-promise cheerio
const request = require('request-promise');
const cheerio = require('cheerio');
创建main
方法来解决我们的需求
// 定义一个异步主函数main,作为程序的入口
async function main(){
// 程序员思维的体现:将任务分解为小步骤
// 伪代码描述了整个逻辑流程
// 定义了目标URL,指向豆瓣电影排行榜页面
const URL = "https://movie.douban.com/chart";
// 使用request-promise(或类似库)发送HTTP GET 请求获取豆瓣电影排行榜页面的HTML内容
const html = await request({
url: URL
});
// 使用cheerio来解析HTML,模拟DOM操作
let $ = cheerio.load(html);
// 选取包含电影条目的CSS选择器
const movieNodes = $('#content .article .item');
// 初始化一个数组来存储解析后的电影信息
const movieList = [];
// 遍历每个电影节点,提取信息并加入到movieList
for(let i = 0; i < movieNodes.length; i++){
// 提取每个电影信息的函数getMovieInfo
movieList.push(getMovieInfo(movieNodes[i]));
}
// 输出最终解析得到的电影列表
console.log(movieList);
}
以上代码其实已经为我们爬取完了数据,但其实还是长篇大论,接下来要解析爬到的数据,获取关键要素,例如标题title
、图片pic
、详情info
及评分rating_nums
。而这部分由getMovieTnfo
函数完成
const getMovieInfo = function(node) {
let movieInfo = {}; // 初始化一个空对象用于存放电影信息
// 使用cheerio加载当前电影节点到内存中,以便进行DOM操作
let $$ = cheerio.load(node);
// 提取电影标题
let title = $$('.pl2 a').text(); // 获取包含在class为'pl2'的a标签内的文本
// 提取电影封面图片链接
let pic = $$('.nbg img').attr('src'); // 获取class为'nbg'的img标签的src属性,即图片链接
// 电影简介等附加信息
let info = $$(' .pl').text(); // 获取所有class为'pl'的元素的文本内容
// 评分
let rating_nums = $$('.rating_nums').text(); // 获取class为'rating_nums'的元素内的文本,通常是评分
// 将提取的信息填充到movieInfo对象中
movieInfo.title = title;
movieInfo.pic = pic;
movieInfo.info = info;
movieInfo.rating_nums = rating_nums;
// 返回整理好的电影信息对象
return movieInfo;
}
最后调用main
函数,输出以JSON数组格式的电影列表。
最后
在这个数字化旅程的探索中,我们不仅触及了Node.js后端开发的精髓,领略了异步编程的魅力,还深入实践了网络爬虫技术,亲手从浩瀚的互联网海洋中捕捞取了宝贵的数据珍珠——豆瓣电影信息。每一步都凝聚着技术的智慧,每一行代码都铺就了通向创新的道路。
如今,随着main
函数的圆满执行,电影列表的JSON跃然屏上,不仅展现了信息的组织之美,更是对技术应用的一次胜利礼赞歌。记住,每一次尝试与实践都是通往大师之路的坚实步伐,每一次解析与封装都是对复杂世界的优雅解读。
让我们以此为契机,继续在编程的世界里扬帆远航,不断深化对技术的理解,拓宽知识的边界。未来,不论是深化后端的逻辑,优化前端的体验,或是探索数据的深邃,愿我们都能以今日所学,筑基,创造更多价值,点亮数字世界的璀璨星光。
旅程至此,未完待续,期待在未来的代码行间,我们再次相逢,共赴技术的盛宴。编码不息,创新不止,我们同在。再见,为了下一场智慧的冒险,我们整装待发。
转载自:https://juejin.cn/post/7370993837303316518