面向小白编程:初识 Node.js 之爬取豆瓣 Top250 电影信息

什么是Node?

官方描述:Node.js® is an open-source, cross-platform JavaScript runtime environment.

翻译过来就是:Node.js 是一个开源的、跨平台的 JavaScript 运行环境。

当我们谈论 Node.js 时,可以把它想象成一种能让你用 JavaScript 运行在服务器上的技术。这可能会让你感到奇怪,因为通常我们认为 JavaScript 是在网页上执行的脚本语言。

简而言之,Node.js 是一个让 JavaScript 能够在服务器端运行的平台。这给开发者提供了一个强大而灵活的工具,可以用同一种语言编写前端和后端的代码。

Node 优点总结如下:

  1. JavaScript 在服务器上运行: 以前,JavaScript 主要用于网页上的交互。但是,Node.js 让JavaScript可以在服务器上运行,执行像处理文件、连接数据库、发送电子邮件等服务器端任务。
  2. 事件驱动和非阻塞 I/O: Node.js 使用事件驱动和非阻塞I/O的方式来处理请求。这意味着它可以同时处理多个请求,而不必等待一个请求完成后再处理下一个。这使得 Node.js 非常高效。
  3. 构建可伸缩的网络应用: 由于其异步非阻塞的特性,Node.js 非常适合构建实时的、可伸缩的网络应用,比如聊天应用、在线游戏等。
  4. 包管理工具 npm: Node.js 附带了一个名为 npm 的包管理工具,它使得在项目中使用和分享代码变得非常容易。开发者可以轻松地安装、更新和分享代码包。
  5. 社区支持: Node.js 有一个庞大的开发者社区,这意味着你可以轻松地找到大量的开源代码、工具和资源,从而更快地构建你的应用。

总的来说,Node.js 是一个强大的工具,它使得用 JavaScript 构建全栈应用变得更加容易和高效。

Node.js 官方网站(中文版):www.nodejs.com.cn/

npm 包管理工具

npm 是 Node.js 自带的包管理工具,由于 Node 的内置模块仅提供了一些底层的 API,导致在基于内置模块进行项目开发时,效率太低,所以第三方模块(包)基于内置模块,封装出了更高级更方便的 API,极大提高了开发效率,npm 是世界上最大的开源库生态系统之一,拥有数以百万计的包,供我们程序员使用。

我们可以在浏览器打开 npm 官方网站 www.npmjs.com/

在搜索框中我们可以根据自己的需求,查找自己需要的包。

我们拿 glob 包做个演示:

这个页面会介绍这个包的功能以及代码实现样例。如果我们想使用这个包,应该先下载到自己的文件夹下,我们找到右边的 Install 窗口,复制这行代码,来到终端粘贴运行 npm i glob ,然后就能在文件夹下看到新增了两个 json 文件和一个 node_modules 文件夹,这里面存放了我们的包信息,然后就能在我们的入口文件(index.js)中导入包了。

如果下载包速度过慢,可能会导致超时下载失败,可以选择换源操作。下面我来介绍一种换源操作:

1. 查看源

首先我们先看看源指向哪里:

js 复制代码
npm config get registry

不出所料应该是默认是指向 https://registry.npmjs.org/ 即官方源。

2. 更换源

我们可以选择任意国内源即可(其中部分源可能已经失效)。

淘宝 NPM 镜像:registry.npm.taobao.org

阿里云 NPM 镜像:npm.aliyun.com

腾讯云 NPM 镜像:mirrors.cloud.tencent.com/npm/

华为云 NPM 镜像:mirrors.huaweicloud.com/repository/...

网易 NPM 镜像:mirrors.163.com/npm/

中科院大学开源镜像站:mirrors.ustc.edu.cn/

清华大学开源镜像站:mirrors.tuna.tsinghua.edu.cn/

换完源我们再进行 npm i glob 下包操作,应该就能够解决这个问题了。

Node 爬虫

步入正题。

今天我们爬取的是豆瓣的 Top250 电影信息,首先我们来到豆瓣电影Top250网页。

1.选择需要爬取的页面元素

我们可以根据自己的需求,在检查页面查找自己想要爬取的内容,这里我们用爬取电影名评分图片举例

2.导入模块

我们在一个空文件夹下创建一个 index.js 文件,这里我们需要导入三个模块:httpsfscheerio,其中httpsfs是 Node 内置模块,cheerio是第三方模块,需要手动从 npm 中导入。

https模块的主要作用是用于处理 HTTPS 请求,下图是 node 官方文档,详细介绍了用法及实现。(https 安全超文本传输协议 | Node.js API 文档

fs内置模块,用于读写文件,下图是 node 官方文档,详细介绍了用法及实现。(fs 文件系统 | Node.js API 文档

cheerio 模块用于在服务器端使用 jQuery 语法解析 HTML,下图是 nmp 官方文档,详细介绍了用法及实现。(cheerio - npm

3.代码实现:

js 复制代码
const https = require('https'); // 引入 https 模块
const cheerio = require('cheerio'); // 引入 cheerio 模块
const fs = require('fs'); //引入文件系统模块

// 发起 HTTPS 请求,获取豆瓣Top250电影页面的 HTML 内容
https.get('https://movie.douban.com/top250',(res)=>{
    let html = ''
    
    // 监听 'data' 事件,当接收到数据时触发,拼接数据到 html 变量
    res.on('data',(chunk)=>{
        html += chunk; //强行把十六进制转换成十进制页面代码
    })
    
    // 监听 'end' 事件,当数据接收完毕时触发
    res.on('end',()=>{
        
        // 使用 cheerio.load() 方法加载 HTML 内容,返回一个类似 jQuery 的对象
        const $ = cheerio.load(html);
        
        // 用于存储电影信息的数组
        const result = []
        
        // 使用 cheerio 选择器遍历每个电影条目
        $('li .item').each(function(){
        
            // 从当前电影条目中提取标题、评分和图片链接
            const title = $('.info .title',this).text() //标题
            const star = $('.info .bd .rating_num',this).text() //评分
            const pic = $('.pic img',this).attr('src') //图片
            
            // 将提取的信息组成对象并添加到结果数组中
            result.push(
                {
                    title,
                    star,
                    pic
                }
            )
        })
        
        // 将结果数组以 JSON 格式写入文件
        fs.writeFile('./list.json', JSON.stringify(result),(err,data)=>{
            if(err){
                throw err 
            }
            console.log('文件写入成功!');
        })
    })
})

4.成果展示

最后

当你成功运行这段 Node.js 代码时,你已经迈出了使用 JavaScript 后端应用的一大步。

希望这篇文章能够为你提供了一个简单而实用的入门指南,让你更了解 Node.js,并激发了你深入学习的兴趣。如果你有任何疑问或想要了解更多,不要犹豫,加入社区,查阅文档,与其他开发者交流,共同成长。

已将学习代码放入Gitee,欢迎大家学习指导!!!

技术小白记录学习过程,有错误或不解的地方还请评论区留言,如果这篇文章对你有所帮助请 "点赞 收藏+关注" ,感谢支持!!

相关推荐
new出一个对象25 分钟前
uniapp接入BMapGL百度地图
javascript·百度·uni-app
你挚爱的强哥1 小时前
✅✅✅【Vue.js】sd.js基于jQuery Ajax最新原生完整版for凯哥API版本
javascript·vue.js·jquery
前端Hardy2 小时前
纯HTML&CSS实现3D旋转地球
前端·javascript·css·3d·html
susu10830189112 小时前
vue3中父div设置display flex,2个子div重叠
前端·javascript·vue.js
数据小爬虫@4 小时前
如何利用java爬虫获得淘宝商品评论
java·开发语言·爬虫
小镇程序员5 小时前
vue2 src_Todolist全局总线事件版本
前端·javascript·vue.js
疯狂的沙粒5 小时前
对 TypeScript 中函数如何更好的理解及使用?与 JavaScript 函数有哪些区别?
前端·javascript·typescript
瑞雨溪5 小时前
AJAX的基本使用
前端·javascript·ajax
力透键背5 小时前
display: none和visibility: hidden的区别
开发语言·前端·javascript
程楠楠&M6 小时前
node.js第三方Express 框架
前端·javascript·node.js·express