nodejs定时抓取服务器文件并生成页面

最初觉得公司前端做的非产品提的需求的demo没有很好的利用起来,于是想能不能将前端组服务器中的所有demo自动抓取出来,并放置到一个页面中。这样一是有利于前端demo管理,二是其他部门用的时候找起来也比较方便。

遍历文件夹

首先就是要遍历文件夹,获取所有文件夹里面的文件信息

function geFileList(path) {
    var filesList = [];
    readFile(path,filesList);
    return filesList;
}

遍历读取文件

然后就需要将第一步中获取的文件信息读取出来

function readFile(path, filesList) {
    files = fs.readdirSync(path);//需要用到同步读取
    files.forEach(walk);
    function walk(file)
    {
        states = fs.statSync(path+'/'+file);
        if(states.isDirectory())
        {
            readFile(path+'/'+file,filesList);
        }
        else
        {
            //创建一个对象保存信息
            var obj = new Object();
            obj.size = states.size;//文件大小,以字节为单位
            obj.name = file;//文件名
            obj.path = path+'/'+file; //文件绝对路径
            filesList.push(obj);
        }
    }
}

生成的filesList为一个包含服务器下所有文件的数组,其中数组中的每一个元素都是一个对象,包含name、size、path属性。

匹配特定文件并生成包含title跟path的数组

var arr = [],str = '';
var regTitle = /<title>(.*?)<\/title>/i; //匹配文件的title
for(var i=0,len=filesList.length;i<len;i++){
    var item = filesList[i];
    if(item.name.indexOf("index.html") != -1){ //如果包含index.html
        var data = fs.readFileSync(item.path);
        var title = '"'+regTitle.exec(data)[1] +'"';
        arr.push(title);
        var url = '"www.zhangshuang.top/project' + item.path.slice(2) +'"';
        arr.push(url);
    }
}
str = 'arr = ['+arr+']';

写入文件

将内容用utf-8的格式写入文件,后续会有调用

function writeFile(fileName,data) {
    fs.writeFile(fileName,data,'utf-8',complete);
    function complete() {
        console.log("文件生成成功");
    }
}
writeFile("selfMotion_data.js",str); //第一个为自定义的生成的文件名,第二个为写入的数据

定时任务脚本

定时任务要感谢公司运维的小伙伴,之前在网上找了很多试了就是不行,结果是因为没有加执行的路径,现将shell脚本也贴出来:

/*bianli.sh*/

#!/bin/bash
cd /opt/node_server/public/project
/usr/bin/node /opt/node_server/public/project/bianli.js

记得一开始的cd进入项目目录一定要加上,要不然就不会执行。

启动定时任务

通过vim /etc/crontab命令进入并编辑定时任务。

 */1 * * * *     root   /bin/sh /opt/node_server/public/project/bianli.sh

前面部分是定时任务的频率,最后部分是要执行的脚本。

github地址

nodejs简易爬虫实现

通过nodejs抓取特定页面的特定内容,并且写入文件中。
demo很简单,注释也很完善,很好理解。

var request = require('request'); //请求模块,
var cheerio = require('cheerio'); //相当于jQuery
var fs = require('fs'); //nodejs的文件模块File System

function getHtml(url) {
    request(url, function (error, response, body) {
        if (!error && response.statusCode == 200) {
            var $ = cheerio.load(body,{ //加载html
                decodeEntities:false //禁止转码
            });
            $("div.arcBody>p").each(function () { //这个地方需要根据目标页面修改
                var content = $(this).text(); //获取抓取的信息
                fs.appendFileSync('yikedou.txt',content); //这里只是简单的添加进了txt文件中,需要样式的,直接加入标签在写入文件即可。
            });
            var prevArcLink = $("div.prevNextArc>span#prevArcLink>a").attr("href"); //获取地址
            var realPrevArcLink = site + prevArcLink; //因为该网站的地址不是带域名的绝对路径,所以这里要将网站的域名加上,应具体问题具体修改
            getHtml(realPrevArcLink); //递归,将真实路径传入,递归抓取
            // fs.appendFileSync('yikedou.txt',cnt)
        } else{
            console.log(error,response.statusCode);
        }
    });
}

var site = "http://www.yikedou.com"; //目标页面的域名
var firstUrl = 'http://www.yikedou.com/wenzi/201510/48767.html'; //第一次要抓取的页面

getHtml(firstUrl); //执行

github地址