2015年9月21日 星期一

NodeJS 爬蟲練習



一切的源起,都來自於這套我想回味的武俠小說-大唐雙龍傳 XD
在網路上找到收錄著每個章節的網站,不過總共有800多個章節,每個都複製開新檔貼上也不是人在做的活...

突發奇想下決定寫一個爬蟲把這800多集全部爬下來,
觀察了一下每一集的url都是 domain/path/章節.htm 的形式,可行!

接下來決定用Node.js來寫,因為NPM上面的套件太豐富了,也找到用來做爬蟲的Node.js套件-Crawler
這個套件本身也包了Cheerio模組,可以用類似Jquery選擇器的方式對DOM做處理。

程式碼大概就是這樣,超短XD

var Crawler = require("crawler");
var fs = require("fs");

var c = new Crawler({
 maxConnections : 1,
 forceUTF8 : true, //小說網站大多編碼是big5,加上這個參數讓爬到的內容轉為utf8
});
var url_list = []; //要貯存800多個章節Url的陣列

//因為Callback不能放在迴圈內,所以把他另外寫成一個function,另外宣告一個counter等同於迴逡內的變數i
var counter = 1; 
function crawlerCallback(error, result, $){
 fs.writeFile("novels/Chapter"+counter+".txt", $('.tt2').text(), function(err){
  if (err){
   return console.log(err);
  }
  console.log("Chapter " + counter + " Saved");
  counter++;
 });
}
for (i = 1; i <= 809; i++){
 var chapter;
 if(i < 10){
  chapter = "00"+i;
 }else if(10 <= i && i < 100){
  chapter = "0"+i;
 }else{
  chapter = ""+i;
 }
 var url = {
  uri: 'http://www.novelscape.net/wxxs/h/huangyi/dtslz/' + chapter + '.htm',
  jQuery: 'cheerio',
  callback: crawlerCallback
 };
 url_list.push(url);
}
c.queue(url_list); //把網址全部塞進佇列內,開始爬囉

執行後,就會看到小說一章一章地存到本機啦!

附上Github連結:Novel-Crawler