Node.js爬虫初体验

一、准备阶段

当我们需要使用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
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,110评论 25 707
  • 2017.2.11刘晓瑞 四个力量累计1次 事件:陪妈妈按摩时,她唠叨哥哥对她态度不好,过去怎么惹她生气等等,我一...
    liuxiaorui阅读 128评论 0 0
  • 手指上的烟火阅读 261评论 0 0
  • 怕见客户,怕被拒绝。 一个“怕”字扼杀了销售人员的无限潜能。业务活动的快乐在于每天见不同的人,经历不同沟通场景,不...
    厂家网CJW_9188阅读 199评论 0 0
  • 夜久万物已寐,独倚亭台垂泪。 凄风兼冷雨,还似他年滋味。 无归,无归, 千里怎将相思废? 那时的自己并非心血来潮,...
    清夜独思阅读 194评论 0 2