小白 用node 制作简单爬虫爬取豆瓣电影Top250数据(超详细)

4,142 阅读4分钟

写在前面

学会如何从网上爬取数据是一项非常重要的技能,据统计,网络上百分之三四十都是爬虫获取的数据。
那么什么是爬虫呢? 简单来说就是通过网络上的一个链接 获取该链接(html)里面我们所需要的内容. 可以简单描述为:
node请求url - > 获取html(信息) -> 解析html

准备工作

以爬取豆瓣top250上的电影排行榜信息为一个小demo

  1. 使用的IDE为 vscode, 创建一个文件夹并创建一个index.js的文件
  2. 在该文件夹上单击右键选择在终端打开

3. 在终端输入命令: npm init -y ,回车,可以在你当前文件夹下面发现创建了一个 package.json 文件

  1. 继续在终端输入命令 npm install cheerio cheerio是jquery核心功能的一个快速灵活而又简洁的实现,主要是为了用在服务器端需要对DOM进行操作的地方,详细可以查看cheerio官方文档
  2. 找到豆瓣Top250网站上 需要爬取的数据. 为了简便,我们以爬取电影名字,评分,封面为例

6. 找到该网站之后右键检查网站的html,找到电影名称 评分 图片所在的地方,稍后会讲到如何找

详细代码

代码很少,但是要了解其中的原理

  1. 加载模块
//加载https模块, 只要是获取网站链接都需要的操作
const https = require('https')
//加载之前下载的cheerio,在后面会有作用
const cheerio = require('cheerio')
//文件读取系统  fileSystem, 对文件的操作模块
const fs = require('fs') 
  1. 找到 豆瓣Top250名字,评分,封面 三个元素所在的位置
    具体方法:第一步:右键单击检查,其他步骤如图

我们可以找到《肖申克的救赎》在<li>标签,item 标签 下的class = 'title' ,其他的电影名字同样在其他的<li>标签标签下面 找到了之后,可以执行下一步了。 3. 接下来就是获取html文件(在如下代码有详细介绍每一行代码)
当我们在终端执行这个代码时(执行 用 node xxx.js)可以看到如下效果

html 文件已经被我我们拿到了。然后我们提取我们需要的数据
4. 使用 cheerio 模块提取 数据 刚刚我已经演示了如何找到title,其他两个也是类似的操作 找到了之后放入数组
5. 将数组存为json文件,这时我们就用到了 fs(fileSystem)

6. 写入之后会在当前文件夹下产生一个files.json文件,打开 格式化 我们可以看到效果

至此我们把数据都拿到了! 这些数据可以存入数据库,成为自己的啦! 如果说担心如果有一天豆瓣Top250突然不同意我们使用链接的方式得到图片怎么办呢? 我们可以下载下来,至于如何下载下来,跟上面的步骤其实类似,就不重复了,当然如果有需要可以找我哦.

完整代码

//加载https模块, 只要是获取网站链接都需要的操作
const https = require('https')
//加载之前下载的cheerio,在后面会有作用
const cheerio = require('cheerio')
//文件读取系统  fileSystem, 对文件的操作模块
const fs = require('fs')
//通过https模块的get方法,请求 如下的网站链接,回调函数中 res就是请求所获取的资源
https.get('https://movie.douban.com/top250',function(res){
    // 由于获取的资源是分段返回的 我们需要自己拼接,因此创建一个空字符串用于拼接
    let html = ''
    // res.on类似于addEventListener,只不过这个监听的是data,
    //只要有数据产生就执行这个函数,chunk就是获取的数据,用html拼接
    res.on('data',function(chunk){
        html += chunk
    })
    // 监听只要res数据加载完成,那么我们就执行下面的回调函数
    res.on('end',function(){
        //这个时候就用到了cheerio,是我们可以使用dom操作
        const $ = cheerio.load(html)  //$是 cherrio 规定的
        //用该数组存放我们爬取的数据
        let allFilms = [] 
        
        $('li .item').each(function(){
            //this 循环时当前这个电影
            //当前这个电影下面的title
            const title = $('.title',this).text()
            const star = $('.rating_num',this).text()
            const pic = $('.pic img',this).attr('src')
            // 存成一个 json 文件 fs
            allFilms.push({title,star,pic})
        })
        fs.writeFile('./files.json',JSON.stringify(allFilms),function(err){
            if(!err){
                console.log('文件写入完毕')
            }
        })
    })
})

难点就是理解整个流程,流程理解了,再看代码会简单很多哦~
都看到这了,不点个赞吗🙃