Node.js之爬取点我达技术博客上的数据(二)

干玲昌
在上篇文章的结尾,说过要将点我达技术博客网站上面的文章内容以title+author+date.txt的格式保存起来。那就继续干完它。让我们先睹为快,看看完成的效果。

嗯,效果还不错!那一步一步的梳理整个过程。

分析问题

我们想要整篇文章的内容,这里只是针对文本内容,获取图片内容大同小异,这里不再赘述。首先进入到某一篇文章查看网页的代码。然后就能发现红色框框标出来的元素正包裹着我们想要的文章的内容。

上面的两张图片已经包含了文章的内容,标题,时间和作者。由此,我们可以简单的敲出以下代码。

var content = $(".post-content").text();  
            var title = $(".page-title").text();
            var author = $(".page-author a:first-child").text();
            var date = $(".post-date").attr("datetime");
数据我们已经拿到了,现在我们需要将数据存到本地,以txt的格式存储起来,这样,我们在项目的目录下增加一个data文件夹,这个文件夹用于存储txt文件。nodejs中的fs模块,可以非常简单的实现文件的读写,若是有兴趣的话,可以翻阅文档。实现代码如下:
//以标题,作者和时间作为文件名
 var fileName = title + "-" + author + "-" + date;

            fs.writeFile("./data/" + fileName + ".txt", content, "utf-8", function (err) {
                if (err) {
                    console.log("error");
                }
            })
这样,我们已经将一篇文章成功的写入了项目data文件夹中的txt中。同样的,一个网站会有多篇文章。且点我达技术博客网站上面是以文章列表的形式显示的,我们需要取出每一页网站中的文章url数组,遍历数组,进入到每一篇文章网页中读取数据。而且网站是分页的,采取我上一篇文章的思想,有下一页就递归下去,没有下一页就结束。这样一分析,编写代码就比较清晰了。
 var articleUrl = $(".post-title a:first-child");
            articleUrl.each(function () {
                var newUrl = url.substring(0, 24);
                saveContent(newUrl + $(this).attr("href"));
            })//将文章存到txt中的函数

            if ($(".older-posts").length > 0) {
                var nextUrl = $(".older-posts").attr("href");
                var newUrl = url.substring(0, 24);
                startSpider(newUrl + nextUrl);
            }
完整代码:
/**
 * Created by glc on 2017/9/24.
 */
var http = require("http");  
var fs = require("fs");  
var cheerio = require("cheerio");  
var url = "http://tech.dianwoda.com";  
function startSpider(url) {  
    http.get(url, function (res) {
        var html = "";
        res.setEncoding("utf-8");
        res.on("data", function (data) {
            html += data;
        })
        res.on("end", function () {
            var $ = cheerio.load(html);
            var articleUrl = $(".post-title a:first-child");
            articleUrl.each(function () {
                var newUrl = url.substring(0, 24);
                saveContent(newUrl + $(this).attr("href"));
            })

            if ($(".older-posts").length > 0) {
                var nextUrl = $(".older-posts").attr("href");
                var newUrl = url.substring(0, 24);
                startSpider(newUrl + nextUrl);
            }
        })
    })
}
startSpider(url);  
function saveContent(url) {  
    http.get(url, function (res) {
        var html = "";
        res.setEncoding("utf-8");
        res.on("data", function (data) {
            html += data;
        })
        res.on("end", function () {
            var $ = cheerio.load(html);
            var content = $(".post-content").text();
            var title = $(".page-title").text();
            var author = $(".page-author a:first-child").text();
            var date = $(".post-date").attr("datetime");
            var fileName = title + "-" + author + "-" + date;
            fs.writeFile("./data/" + fileName + ".txt", content, "utf-8", function (err) {
                if (err) {
                    console.log("error");
                }
            })
        })
    })
}
最后在命令行执行node命令,就可以在data文件夹中看到产生的全部文章的txt文件。

总结:

虽然项目非常简单,在通过这部分的联系,还是对于node.js中的fs模块和操作dom有了更好的掌握。下一篇文章见!