2

今天来用Node.js做一个小小的爬虫项目

爬虫目标:http://songshuhui.net/(科学松鼠会)

  • 我们需要创建一个文件夹,自己命名就好,然后在文件夹里创建两个文件夹分别命名为data和img,进入到这个总文件夹的目录终端下。

  • 终端输入npm init,创建package.json配置文件,根据自己的实际情况填写,或者一路回车。

  • 再次输入npm install cheerio request --save,会下载好cheerio(用法几乎和Jquery一样),request依赖包。

  • 在总文件夹里再创建index.js,用来编写我们的主体逻辑代码。

下面就是代码

var http = require('http');
var fs = require('fs');

var cheerio = require('cheerio');
var request = require('request');

var i = 0;
var url = "http://songshuhui.net/archives/96881";//初始化的地址

function fetchPage(x){
    startFetch(x);
}//封装函数

function startFetch(x){
    //采用http模块向服务器发起一次get请求
    http.get(x,function(res){
        var html = ""; //用来储存整个页面的html内容
        res.setEncoding("utf-8");//防止中文乱码
        res.on('data',function(chunk){
            html  += chunk;
        });//监听data事件,每次取一块数据
        res.on('end',function(){
            var $ = cheerio.load(html);//用cheerio模块解析html

            var author = $(".metax_single a:first-child").text().trim();//获取文章的作者

            var title = $(".atrctitle .contenttitle a").text().trim();//获取文章的标题

            var link = $(".atrctitle .contenttitle a").attr("href");//获取文章的网页地址

            var new_item = {
                Title: title,
                Author: author,
                Link: link,
                i: i =i + 1//用来判断获取了多少文章
            };
            console.log(new_item);

            savedContent($,title);//储存文章的文字内容

            savedImg($,title);//储存文章的图片内容

            var nextLink = $(".navilinks .prevlink a").attr("href");

            var str = encodeURI(nextLink);

            if(i <= 500){
                fetchPage(str);
            }//通过控制i控制抓取的文章的数目
        });//监听end事件,如果整个网页内容都获取完毕,执行回调函数
    }).on('error',function (err) {
        console.log(err);
    });
}

function savedContent($,title){
    $(".entry p").each(function(index,item) {
        var x = $(this).text();

        x = x + "\n";

        fs.appendFile("./data/" + title + ".txt", x, "utf-8", function (err) {
            if (err) {
                console.log(err);
            }
        });
    });
}
//本地储存爬取的文字资源
function savedImg($,title){
    $(".entry .wp-caption img").each(function(index,item) {
        var img_title = $(this).attr("alt");

        var img_filename = img_title + ".jpg";

        var img_src = $(this).attr("src");

        request.head(img_src,function(err,res,body){
            if(err){
                console.log(err);
            }
        });

        request(img_src).pipe(fs.createWriteStream("./img/" + title + "--" + img_filename));
        //采取request模块向服务器发起一次请求,获取图片资源
    });
}
//本地储存爬取的图片资源
fetchPage(url);
  • 代码部分完成,在webstorm上运行index.js文件,直接选中index.js,点击右上角的绿色三角按钮。

  • 选取的这个网址,分析网站源代码,每个文章都有上一页或者下一页的内容,这样我们可以串联式的获取dom节点的不同url,因此获得每个url的内容。

控制台的输出

图片描述

获取的图片

图片描述

获取的文章

图片描述

爬虫成功!


刘雯
58 声望10 粉丝

爱前端的kcoder