用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);
}());