Nodejs制作一只小爬虫

作者: liuuuuuu | 来源:发表于2018-03-20 23:07 被阅读10086次

    前言

      今天下午闲来无事,突然想学习一下爬虫技术了,就在网上看了点资料,然后自己亲手制作了一只小爬虫,在这里呢,我们主要用nodejs来写哦,为什么呢?因为我喜欢~哈哈哈,给大家开个小玩耍,别生气哦,接下来我们到底爬那个网站呢?恩,随便百度一个吧,好的,就是豆瓣电影了,希望豆瓣电影大大不要介意,因为毕竟我们也只是练习一下技术,为光大我中国努力呀,闲话少说,请看具体的网页。

    目标图

    解析及制作小爬虫

    • 解析
        首先,网页中有很多电影介绍,我们随便找了一个电影,这里就用水形物语做测试了,我们第一步需要分析,我们想要什么资料?
    1. 电影标题
    2. 电影头像
    3. 电影导演
    4. 电影编剧
      ......

    对于这么一抹多资料,凡是自己想要的,都可以得到~

    • 制作小爬虫

    第一步:对于nodejs来制作小爬虫,我们需要requestcheerioexpressfs这四种就完全足够了,对于原始自带的fs不用安装,其余的三个库都需要自行安装,不会安装的同学自行百度,这个我没法教。

    第二步:安装好了之后,根目录下新建一个movie目录和app.jsmovie目录主要存放我们爬过的数据,app.js中创建一个服务:

    const express = require("express");
    const request = require("request");
    const cheerio = require("cheerio");
    const fs = require("fs");
    
    let app = express();
    app.listen(80);
    

    第三步:开始编写爬虫代码,获取我们需要的信息,此处提一下,cheerio的用法和jQuery十分相似,大家可以自行去学习下,这里就不赘述了,代码如下:

    app.get('/', function(req, res) {
        request(`https://movie.douban.com/subject/26752852/?from=showing`, function(error, response, body) {
            if (!error && response.statusCode == 200) {
                let $ = cheerio.load(body,{ decodeEntities: false });
                let movie = {
                    title: $("#content span").eq(0).text() + $("#content span").eq(1).text(),// 电影名称
                    avatar: $("#mainpic img").attr("src"), // 电影头像,
                    mainpic: $("#info .attrs").eq(0).text(), // 导演
                    screenwriter: $("#info .attrs").eq(1).text(), // 编剧
                    Starring: $("#info .actor").find(".attrs").text(), // 主演
                    type: $("[property='v:genre']").text(), // 类型
                    releaseDate: $("[property='v:initialReleaseDate']").text(), // 上映时间
                    property: $("[property='v:runtime']").text(), // 时长
                    score: $("[property='v:average']").text() // 评分
                };
                console.log(movie);
            }
        })
    });
    
    日志打印

    第四步:获取信息后,开始写入文件

    fs.writeFile(`./movie/${movie.title}.txt`, `
        电影名称: ${movie.title}\r
        电影头像: ${movie.avatar}\r
        导演: ${movie.mainpic}\r
        编剧: ${movie.screenwriter}\r
        主演: ${movie.Starring}\r
        类型: ${movie.type}\r
        上映时间: ${movie.releaseDate}\r
        时长: ${movie.property}\r
        评分: ${movie.score}\r
    `, (err) => {
        if (err) throw err;
        console.log('introduce had been saved!');
    });
    request(movie.avatar).pipe(fs.createWriteStream(`./movie/${movie.title}.jpg`));
    

    最终项目结构图:


    image.png

    最终项目文件图:


    image.png
    实际效果图

    注意事项【2017.03.22补充】

      对于爬虫爬大量数据的时候,尤其是文字加内容,而且还要新建文件夹/文件的,请注意,for循环内部再嵌套各种fs操作,这真是一个很大的灾难!!!,fs自带同步功能,但是request没有,这里解决方案之一就是其中将request可以换成sync-request,将其转换成同步,否则可能导致爬下来的数据不全或没有图片。对于爬虫的技术还在研究,后期如果有更多有意义的收获,会来此继续补充内容。

    后言

      对于制作一只小爬虫,其实原理很简单,接下来关于怎么遍历所有电影,那就需要大家自己好好开动自己的小脑袋了,这里可以提示一下不懂得小伙伴,提示语:“网页url”。好了,今天花了几分钟学习了下nodejs小爬虫,实在是算不得入门,未来要走的路还很长,希望在自学的日子里,不是我一个人在前进,欢迎更多自学前端的小伙伴陪我一起成长,相互交流,当然我也欢迎大佬们可以指点一二,谢谢大家。

    说明

    原创作品,禁止转载和伪原创,违者必究!

    相关文章

      网友评论

      本文标题:Nodejs制作一只小爬虫

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