一個簡單的小說爬蟲
阿新 • • 發佈:2018-01-19
filepath var exports ont 模塊加載 content utf 簡單的 style
前段時間,在學 node 的過程中突然想到,我可以用 node 去爬小說。
說來就來。
1、首先,要有一個能夠免費看小說的網站,找到小說的列表頁,分析其中每個章節的標簽,找到其中的規則,這樣可以在代碼中把重復的去掉。
2、通過 node 中的 http 模塊加載這個列表頁面,采用 cheerio 模塊解析加載回來的 html,取到一個沒有重復章節的列表。(列表中有章節名,章節的地址)。
3、分析章節頁面的標簽,掌握章節頁面的標簽規則。
4、加載章節頁面,解析 html ,取到章節的內容。
5、利用 node 的 file 模塊將取到的內容寫到電腦的硬盤上。
4,5 是根據 2 取回來的章節列表重復執行的。
好了,不說,上代碼
util.js
const path = require(‘path‘); const utils = { resolve: function(dir) { return path.join(__dirname, ‘../‘, dir) }, } module.exports = utils;
index.js
const getHttp = require(‘./request.js‘);
getHttp();
request.js
const http = require(‘http‘); const cheerio= require(‘cheerio‘); const config = require(‘./config.js‘); const file = require(‘./file.js‘); function getHttp(filePath, callback) { http.get(config.href + filePath, function(res) { var html = ‘‘; res.setEncoding(‘utf-8‘); res.on(‘data‘, function(data) { html+= data; }); res.on(‘end‘, function() { var $ = cheerio.load(html); //采用cheerio模塊解析html var font = $(‘#htmlContent‘).find(‘p‘); var j = -1; function fonts() { j++; if (j >= font.length) { callback(); return; } file.writeFile($(font[j]).text(), fonts); } fonts(); }); res.on(‘error‘, function(err) { console.log(err); }); }) } function getUrl() { http.get(config.href + ‘index.html‘, function(res) { var html = ‘‘; res.setEncoding(‘utf-8‘); res.on(‘data‘, function(data) { html += data; }); res.on(‘end‘, function() { var $ = cheerio.load(html); //采用cheerio模塊解析html var ul = $(‘.wrapper_list .booklist‘).find(‘ul‘); var a = $(ul).find(‘li>a‘); var i = 8; function wriert() { i++; console.log(i - 8); if (i >= a.length) { return; } file.writeFile($(a[i]).text().replace(‘正文‘, ‘‘)); getHttp($(a[i]).attr(‘href‘), wriert); } wriert(); }); res.on(‘error‘, function(err) { console.log(err); }); }) } module.exports = getUrl;
file.js
const utils = require(‘./utils.js‘); const config = require(‘./config.js‘); const cheerio = require(‘cheerio‘); const fs = require(‘fs‘); var file = {} file.writeFile = function(p, callback) { var folder = utils.resolve(config.folder); fs.access(folder, fs.constants.R_OK | fs.constants.W_OK, function(e) { if (e) { fs.mkdir(folder, function() { file.write(p, callback); }) } else { file.write(p, callback); } }); } file.write = function(p, callback) { var url = utils.resolve(config.folder + ‘/‘ + config.name + ‘.txt‘); if (fs.existsSync(url)) { fs.appendFileSync(url, ‘\r\n‘ + p + ‘\r\n‘); callback && callback(); } else { fs.writeFileSync(url, ‘\r\n‘ + p + ‘\r\n‘); callback && callback(); } } module.exports = file;
config.js
const config = { href: ‘http://www.qtshu.com/xinghedadi/‘, name: ‘星河大帝‘, folder: ‘novel‘, }; module.exports = config;
一個簡單的小說爬蟲