最近因为剧荒,老大追了爱奇艺的一部网剧,由丁墨的同名小说《美人为馅》改编,目前已经放出两季,虽然整部剧槽点满满,但是老大看得不亦乐乎,并且在看完第二季之后跟我要小说资源,直接要奔原著去看结局……
随手搜了下,都是在线资源,下载的话需要登录,注册登录好麻烦,写个爬虫玩玩也好,于是动手用 node 写了一个,这里做下笔记

工作流程

  • 获取 URLs 列表(请求资源 request 模块)
  • 根据 URLs 列表获取相关页面源码(可能遇到页面编码问题,iconv-lite 模块)
  • 源码解析,获取小说信息( cheerio 模块)
  • 保存小说信息到 Markdown 文件,并且加适当修饰以及章节信息(写文件 fs、同步请求资源 sync-request 模块)
  • Markdown 转 PDF (使用 Pandoc 或者 Chrome 的打印功能)

获取 URLs

根据小说的导航页,获取小说所有章节的 URL,并且以 JSON 数组的方式存储。

  • 首选通过 http.get() 方法获取页面源码
  • 获取到源码,打印发现中文乱码,查看发现 charset = 'gbk',需要进行转码
  • 使用 iconv-lite 模块进行转码,中文显示正常后开始解析源码,获取需要的 URL,为了更方便地解析,需要引进 cheerio 模块,cheerio 可以理解为运行在后台的 jQuery,用法与 jQuery 也十分相似,熟悉 jQuery 的同学可以很快的上手
  • 将源码加载进 cheerio,分析了源码后得知所有章节信息都存于被 div 包裹的 a 标签中,通过 cheerio 取出符合条件的 a 标签组,进行遍历,获取章节的 title 和 URL,保存为对象,存进数组,(因为链接中存储的 URL 不完整,所以存储时需要补齐)
  • 将对象数组序列化,写进 list.json 文件