美文网首页
Node.js爬虫初体验

Node.js爬虫初体验

作者: Srtian | 来源:发表于2018-07-26 16:22 被阅读28次

一、准备阶段

当我们需要使用Node.js进行爬虫爬取网页时,我们通常需要下载两个库request和cheerio来帮助我们队网页进行爬取:

cnpm i request cheerio

其中request帮助我们对网页进行加载,而cheerio则是为服务器特别定制的,快速、灵活、实施的jQuery核心实现。有了这两个库,爬取简单的网页就没有太大的问题了。

二、网页分析

本次我的目标是爬取豆瓣电影Top250的第一页,因此打开浏览器对其页面结构进行了一番分析,就比如第一步电影——《肖申克的救赎》:


输入图片说明

通过上面的页面结构,我们不难看出,每一部电影都是一个li,且li下面的class都是item,因此当我们需要爬取一部电影的数据时,可以先取得item,再对内部的数据进行获取。其次,每部电影的数据的class命名很明确,因此当我们获取数据时,直接可以根据页面的class命名进行数据获取。而根据对页面的分析,我打算爬取的数据如下:

  • 电影名称——name
  • 评分——score
  • 评语——quote
  • 排名——ranking
  • 封面地址——coverUrl

三、代码编写

既然确定所要获取的数据,我们就可以着手写代码了,首先我们需要引入上面我们下载好的两个包:

const request = require('request')
const cheerio = require('cheerio')

然后我们要创造一个类,用以保存我们想要获取的数据:

const Movie = function() {
    this.name = ''
    this.score = 0
    this.quote = ''
    this.ranking = 0
    this.coverUrl = ''
}

然后我们就能根据我们在上面所创造的类以及利用cheerio来定义一个函数,来通过传入的元素对数据进行获取:

const getMovieFromDiv = (div) => {
    const movie = new Movie()
    const load = cheerio.load(div)
    const pic = load('.pic')
    movie.name = load('.title').text()
    movie.score = load('.rating_num').text()
    movie.quote = load('.inq').text()
    movie.ranking = pic.find('em').text()
    movie.coverUrl = pic.find('img').attr('src')
    return movie
}

将数据获取到了后,当然就需要将其保存了,我们可以调用Node.js的fs模块来对数据进行保存。在这里我们同样也可以定义一个函数,用以保存数据,鉴于在前端界数据通常是JSON,因此在这里就将数据保存为JSON格式:

const saveMovie = (movies) => {
    const fs = require('fs')
    const path = 'DouBanTop25.json'
    const s = JSON.stringify(movies, null, 2)
    fs.writeFile(path, s, (error) => {
        if (error === null) {
            console.log('保存成功')
        } else {
            console.log('保存文件错误', error)
        }
    })
}

好了,上面两步主要为了处理数据以及保存数据。下面就是主要部分了,我们需要下载页面,并执行上面两个函数,已达到爬取网页数据并保存的目的:

const getMoviesFromUrl = (url) => {
    request(url, (error, response, body) => {
        if (error === null && response.statusCode == 200) {
            const load = cheerio.load(body)
            const movieDiv = load('.item')
            const movies = []
            for(let i = 0; i < movieDiv.length; i++) {
                let element = movieDiv[i]
                const div = load(element).html()
                const movie = getMovieFromDiv(div)
                movies.push(movie)
            }
            saveMovie(movies)
        } else {
            console.log('请求失败', error)
        }
    })
}

在上面,当我们下载好页面后,先利用cheerio.load解析页面,然后我们创建一个数组,用于保存电影的数据。再然后通for循环遍历页面的item,并通过getMovieFromDiv来对每个item内的数据进行获取,然后push到数组内。在循环结束后,使用saveMovie将存有数据的数组进行保存。

基本的爬取数据的代码完成了,现在让我们来启动这些函数进行页面爬取吧!

const getMovie = () =>{
    const url = 'https://movie.douban.com/top250'
    getMoviesFromUrl(url)
}

getMovie()

最后:

node doubantop25.js

相关文章

网友评论

      本文标题:Node.js爬虫初体验

      本文链接:https://www.haomeiwen.com/subject/lrbbmftx.html