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地址

nodejs安装及常用快捷键

安装nvm,nodejs版本管理工具

参考:https://github.com/creationix/nvm
参考:http://www.imooc.com/article/14617
参考:centOs中安装nodejs
1. 通过curl安装nvm
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.32.1/install.sh | bash
2. 设置环境变量
export NVM_DIR="$HOME/.nvm"
3. load nvm
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"

4. nvm命令行操作
1. 查看已经安装的nodejs版本
nvm list / nvm ls
2. 查看nvm版本
nvm --version
3. 切换版本,仅限下载过的node版本
nvm use <version>例:nvm use v4.7.0
4. 设定默认node版本
nvm alias default <version>例:nvm alias default v4.7.0

##

通过nvm安装nodejs

  1. 安装6.x版本
    nvm install 6
  2. 安装4.x版本
    nvm install 4
  3. 查看node所有版本
    nvm ls-remote
  4. 安装位置
    ~/.nvm/versions/node
    /Users/zhangshuang/.nvm/versions/node
    ##

npm淘宝镜像 cnpm

  1. 安装:
    npm install -g cnpm --registry=https://registry.npm.taobao.org
  2. 使用:
    cnpm install -g <packageName>例:cnpm install -g nodemon

  3. 设置:npm配置信息
    npm config list

  4. 设置:npm registry 设置镜像路径
    npm config set registry "https://registry.npmjs.org/"

设置别名

alias设置别名
1. 原因:简化命令行提交代码的复杂度
2. 方法:vim ~/.bashrc进入该文件
3. 新增:alias <name>='<yourcode>'例:alias myweb='ssh -p 3000 root@192.169.21.141'
4. 生效:source ~/.bashrc
5. 使用:myweb + Enter
6. 如果未生效,创建~/.bash_profile,该文件是用户登录终端时自动执行的文件,一般此文件中会调用.bashrc,在其中写入source ~/.bashrc
##

pm2 与 nodemon

nodemon,开发环境使用,检测script文件变化,自动重启服务器
  1. 安装:
    npm install -g nodemon
  2. 运行:
    nodemon <appName>例:nodemon app.js
  3. 更改默认端口
    nodemon <appName> localhost 8080
pm2,生产环境使用,服务器崩溃自动重启
  1. 安装:
    npm install -g pm2
  2. 运行
    pm2 start <appName>例:pm2 start server.js
    使用多核心pm2 start <appName> -i max
  3. 查看已启动的应用列表
    pm2 list
  4. 查看应用详情
    pm2 show <appName>例:pm2 show server.js
  5. 退出pm2
    pm2 kill
  6. 查看控制台输出
    pm2 logs <appName?>输入app名可查看单个输出
  7. 关闭某个进程
    pm2 stop <id>例:pm2 stop 0
  8. 重启应用
    pm2 restart <appName>例:pm2 restart server.js
  9. 重载应用
    pm2 reload <appName>例:pm2 reload server.js
  10. 停止应用
    pm2 stop <appName>例:pm2 stop server.js
  11. 将应用从pm2中删除
    pm2 delete <appName>例:pm2 delete server.js
  12. 命名应用
    pm2 start server.js --name game
  13. 复合运用,命名、最多核心运行
    pm2 start server.js --name game -i max
    pm2 start server.js --name localGameServer -i max --watch
  14. 监控
    pm2 monit

参考:PM2实用入门指南
参考:生产环境部署pm2

##

express web开发框架

  1. 安装express:
    sudo npm install -g express
  2. 安装express命令行工具:
    sudo npm install -g express-generator
  3. 启动:
    npm start
    ##

node

  1. 运行进程 node
  2. 退出进程 process.exit()
  3. 查看进程pid global.process.pid
  4. 设置作者 npm config get init-author-name