用node写爬虫系列一:小说下载器

在这个信息泛滥的互联网时代里,网络各处都遍布着爬虫的痕迹,大到搜索引擎比如百度蜘蛛,小到一些小的网站比如小新闻站,都有爬虫在背后的默默努力,从本节开始我们将通过一系列的爬虫例子带你用node来写爬虫,最终按照自己的需求自定义爬虫。

作为一个小说迷,我喜欢用手机去看各种类型的小说,相比于在线版的小说,我更喜欢下载小说的TXT版本,就算没网也能看,而且现在的阅读器进度都是实时更新,对于在线版的小说每一章都要用网络,网速慢的时候一章要加载好久,尤其是在看到精彩的地方,出现网速慢的情况,很是烦躁,而且进度也不好恢复,但是现在很多小说都不提供TXT版的,尤其是对于正在连载的小说来说,如果我们一章章然后保存TXT,对于一些动不动就几万章的小说来说完全是噩梦,所以本节的重点用爬虫实现一个小说下载器,方便快捷的帮我们下载各种在线小说。

本文的目标站点是笔趣阁:http://www.xbiquge.la/,我们从网站里面随便选一本小说,比如三寸人间

我们点击三寸人间,进入小说的目录列表页,

然后我们点进小说的第一章,并记录下链接:http://www.xbiquge.la/10/10489/4535761.html,我们需要抓取的是每一章的标题和每一章的内容,根据这个我们稍微分析就可以得到标题的选择器是.bookname h1,内容的选择器是#content,

这里,我们为了保留内容的换行信息,我们要取节点的HTML并需要将其中的
和 等转换为空白字符和换行符。

抓完了第一章的内容,我们怎么抓取第2章和后面每章的内容呢?在每一章下面都是有下一章的链接地址的,我们需要抓到下一章的地址,然后一直重复以上步骤直到最后一章就好了。

在正式开始编码之前我们先搭建好基本的项目架构,新建目录downloader,进入目录,并在当前目录打开命令行程序,运行命令:

npm init -y

这步主要初始化一个package.json,然后新建app.js最为我们程序的入口文件,最终的结构是这样的:

 - downloader
  - app.js
  - package.json

然后安装我们的项目依赖,

npm i request cheerio --save

如果你还不了解上面2个库,可以先去了解一下使用方式,request的github地址:https://github.com/request/request,cheerio的github地址:https://github.com/cheeriojs/cheerio。

打开app.js,编写代码:

const fs = require('fs');
const request = require('request');
const cheerio = require('cheerio');

const host = 'http://www.xbiquge.la';
const startPath = '/10/10489/4535761.html';

const distPath = 'book.txt';

// 删除上一次的文件 有可能不存在 所以try一下
try {
  fs.unlinkSync(distPath);
} catch(e) {

}
run();

function run(nextPath) {
  const url = `${host}${nextPath ? nextPath : startPath}`;
  request({
    url
  }, (err, response, body) => {
    if (!err) {
      const $ = cheerio.load(body);
      const title = $('.bookname h1').text();
      const content = $('#content').text().replace(/\s{4,}/g, '\r\n\r\n');
      fs.appendFile(distPath, `\r\n${title}\r\n${content}`, err => {
        console.log(`下载 ${title} 完成!`);
        const $next = $('.bottem2 a').eq(3);
        const path = $next.attr('href');
        if (/\.html/.test(path)) {
          run(path);
        }
      });
    }
  });
}

这里我们依次抓取每一章的标题和内容并将其追加到TXT中,最终完成整本小说的抓取,需要注意的是这个网站的最后一章也是有下一章的链接的,最后一章的下一章的链接跳转到了小说的目录页面,所以我们可以简单的判断链接是不是以.html结尾来区分是目录页还是内容页。

启动程序,在当前目录下运行命令:

node app.js

最终运行的效果:

系列文章导航:

第2节: 用node写爬虫系列二:纪念币预约提醒

第3节: 用node写爬虫系列三:代理IP池

  • 支付宝二维码 支付宝
  • 微信二维码 微信
相关文章