最近因為劇荒,老大追了愛奇藝的一部網(wǎng)劇,由丁墨的同名小說《美人為餡》改編,目前已經(jīng)放出兩季,雖然整部劇槽點滿滿,但是老大看得不亦樂乎,并且在看完第二季之后跟我要小說資源,直接要奔原著去看結(jié)局……
隨手搜了下,都是在線資源,下載的話需要登錄,注冊登錄好麻煩,寫個爬蟲玩玩也好,于是動手用 node 寫了一個,這里做下筆記

工作流程

  • 獲取 URLs 列表(請求資源 request 模塊)
  • 根據(jù) URLs 列表獲取相關(guān)頁面源碼(可能遇到頁面編碼問題,iconv-lite 模塊)
  • 源碼解析,獲取小說信息( cheerio 模塊)
  • 保存小說信息到 Markdown 文件,并且加適當修飾以及章節(jié)信息(寫文件 fs、同步請求資源 sync-request 模塊)
  • Markdown 轉(zhuǎn) PDF (使用 Pandoc 或者 Chrome 的打印功能)

獲取 URLs

根據(jù)小說的導(dǎo)航頁,獲取小說所有章節(jié)的 URL,并且以 JSON 數(shù)組的方式存儲。

  • 首選通過 http.get() 方法獲取頁面源碼
  • 獲取到源碼,打印發(fā)現(xiàn)中文亂碼,查看發(fā)現(xiàn) charset = 'gbk',需要進行轉(zhuǎn)碼
  • 使用 iconv-lite 模塊進行轉(zhuǎn)碼,中文顯示正常后開始解析源碼,獲取需要的 URL,為了更方便地解析,需要引進 cheerio 模塊,cheerio 可以理解為運行在后臺的 jQuery,用法與 jQuery 也十分相似,熟悉 jQuery 的同學(xué)可以很快的上手
  • 將源碼加載進 cheerio,分析了源碼后得知所有章節(jié)信息都存于被 div 包裹的 a 標簽中,通過 cheerio 取出符合條件的 a 標簽組,進行遍歷,獲取章節(jié)的 title 和 URL,保存為對象,存進數(shù)組,(因為鏈接中存儲的 URL 不完整,所以存儲時需要補齊)
  • 將對象數(shù)組序列化,寫進 list.json 文件