Javascript编程实践

用nodejs抓取178小说

昨天熄灯之前在178网看轻小说,结果看到一半停电了。我一怒之下决定用nodejs写一段脚本把剩下的小说抓取到txt文档,这样就能在熄灯之前的十几秒钟把想看小说提前下载下来。代码如下:

var http = require('http');
var fs   = require('fs');
var $ = require('jquery');
var iconv = require('iconv-lite');
var wOpition = {
	flags:'w',
	encoding:'utf-8',
	mode:0666
}
var weburl = 'http://xs.dmzj.com';

var starturl = '/1224/4376/27626.shtml';

var fileWriteStream = fs.createWriteStream('novel2.txt',wOpition);

var savenovel = function(html){
	var $doc = $(html);
	var novel = $doc.find('div.novel_text').text();
	//还需加上换行
	fileWriteStream.write(novel);
}

var gethtml = function(url,callback){
	http.get(url,function(res){
		res.setEncoding('binary');
		var html = '';
		console.log('Get Response: ' + res.statusCode);
		res.on('data',function(data){
			html += data;
		}).on('end',function(){
			var buf = new Buffer(html,'binary');
			var str = iconv.decode(buf,'utf-8');
			console.log('Download: ' + url);
			callback(str.toString());
		});
	}).on('error',function(e){
		console.log('Get Error: ' + e.message)
	});
};


var get178text = function(url){
	gethtml(url,function(data){
		var $doc = $(data);
		savenovel(data);
		var pagenums = $doc.find('div.pages').find('span option').each(function(i,p){
			var $t = $(p);
			if (i != 0 && $t.length > 0) {
				gethtml(weburl + $t.attr('value'),function(data){
					savenovel(data);
				});
			};
		});
		var pages = $doc.find('div.pages_novel').find('a#next_chapter').attr('href');
		var cururl = weburl + pages;
		if(cururl.toString() == url.toString()){
			//console.log('Download Complete');
			return;
		}
		get178text(cururl);
	});
}

get178text(weburl + starturl);

nodejs写爬虫真是超方便。。。写代码只用几十分钟,windows下安装nodejs的jquery模块折腾了好久。

等我写完,发现178上的小说是直接可以下载的。。。

无所谓了,技术宅就该为自己所爱之物不断的发掘自己潜力。


等我有时间再改进一下,再顺便总结一下jquery中筛选器的用法:

1.把小说保存为html格式,让阅读体验更好

2.同时下载图片


网页源码中汉字的HTML编码和具体的汉字的互相转换

我们在查看html源码时经常会看到网页中一堆"计算机操作系统"这样的数字,但网页中显示的却是汉字。html中每个字符都有对应的编码。

可以使用var char = String.fromCharCode(code ),来把数字变成字符:
//JS中的汉字与HTML编码的互相转换
(function(){
	var str = "计算机操作系统";
	var pattern = /\d{1,}/g;
	var chars;
	chars = str.match(pattern);
	var cn = '';
	for(var i = 0; i < chars.length; ++i) {
		var s = chars[i];
		s = String.fromCharCode(s);
		cn += s;
	}
	console.log(cn);
}());

如果 regexp 具有标志 g,则 match() 方法将执行全局检索,找到 stringObject 中的所有匹配子字符串。JS正则表达式就是这么简单:

var fs = require('fs');

var fileWriteStream = fs.createWriteStream('NJSON.JS',{ 
	flags: 'w',
	encoding: 'utf-8',
	mode: 0666 });

var fileReadStream = fs.createReadStream("JSON.txt",{
	flags : 'r',
	encoding : 'utf-8',
	mode : 0666});
	
//fileReadStream.pipe(fileWriteStream);
	
fileReadStream.on('data',function(data){
	data =  data.toString().replace(/&#\d+;/g,function(word){
		return String.fromCharCode(word.substr(2,word.length - 3));
	});
	console.log(data);
	fileWriteStream.write(data);
});

使用var code = char.charCodeAt(),把字符转换成数字:
(function(){
	var cn = '计算机操作系统';
	var str = '';
	for(var i = 0; i < cn.length; ++i) {
		var code = cn[i].charCodeAt();
		str += '&#' + code + ';'
	}
	console.log(str);
}());
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值