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