1. 程式人生 > >一個簡單的小說爬蟲

一個簡單的小說爬蟲

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;

一個簡單的小說爬蟲