使用NodeJS采集老黄历网(使用http按顺序采集)

使用NodeJS采集老黄历网,将网页保存到本地,使用了http。

因为目标网站是gbk编码,需要单独安装iconv-lite进行转换。

因为http.get是异步的,流程控制使用了之前写的PromiseDemo(http://www.miaoqiyuan.cn/p/promise),采集完一个才继续采集下一个。

日期返回使用了前几天下的date.js(http://www.miaoqiyuan.cn/p/date-range)

废话少说,直接上代码:

var http = require("http");
var fs = require("fs");
//需要【npm install iconv-lite】安装
var iconv= require("iconv-lite");
//PromiseDemo.js http://www.miaoqiyuan.cn/p/promise
var PromiseDemo = require("./src/PromiseDemo.js");
//date.js http://www.miaoqiyuan.cn/p/date-range
var date = require("./src/date.js");

//任务控制
var taskControl = new PromiseDemo(function(){
	var _date = date.next();
	if( !!_date ){
		/*
			采集页面规则
			http://www.laohuangli.net/2016/2016-1-1.html
		*/
		var url = "http://www.laohuangli.net/" + _date.year + "/" + _date.year + "-" + _date.month + "-" + _date.date + ".html";
		try{
			http.get(url, (function(res){
				var html = "";
				var index = 0;
				res.on('data', function(chunk){
					html += iconv.decode(chunk, 'gbk');
				});
				res.on('end', (function(){
					this.callback({
						status : 'success',
						url : url,
						html : html.replace('charset=gb2312', 'charset=utf-8'),
						file : _date.value
					});
				}).bind(this));
			}).bind(this));
		}catch(e){
			//失败
			this.callback({
				status : 'success',
				url : url,
				error : e
			});
		}
	}else{
		return {
			status : 'fail'
		};
	};
});

taskControl.then(function(){
	console.log("URL:" + this._result.url);
	if( !!this._result.html ){
		var savePath = "date/" + this._result.file + ".html";	//需要在当前目录创建 date/目录
		fs.writeFile(savePath, this._result.html, (function(err){
			if(err){
				throw err;
			}
			//下一天
			this.run();
		}).bind(this));
	}else{
		throw Error("采集失败\nURL:" + this._result.url + ";\n" + this._result.error);
	}
	
}).then(function(){
	//失败
	console.log("\nDownload All OK!");
}).run();

发表评论

电子邮件地址不会被公开。 必填项已用*标注