Fork me on GitHub

使用Node.js做爬虫小案例

可以进行爬取某个站点的指定内容。

初始化

新建个空目录,进入到cmd命令行

npm init -y
npm i axios jquery jsdom mongoose

注: mongoose 是案例中用来存储爬取的数据,非必须。爬取的内容也可以用fs存储到文件中,或者是其他数据库。

示例目标

爬取 轻松看小说 的所有小说标题。

示例代码

index.js

const axios = require('axios')
const jsdom = require("jsdom");
const mongoose = require('mongoose');
const { JSDOM } = jsdom;
const { window } = new JSDOM(`...`);
const $ = require("jquery")(window);
mongoose.connect('mongodb://localhost/test', { useNewUrlParser: true });
const Book = mongoose.model('Book', new mongoose.Schema({
  title: {
    type: String,
    unique: true
  }
}))

/** 启动函数 */
async function start(rootUrl) {
  /** 解析指定url页面的数据并保存 */
  async function parsePage(url) {
    let { data } = await axios.get(url)
    let page = $(data)
    let liArr = page.find('.pt-card.pt-card-7 > li')
    for (let i = 0; i < liArr.length; i++) {
      let ele = liArr[i]
      let book = new Book()
      // 获取到当前页面当前项的标题(小说标题)
      book.title = $(ele).find('.pt-novel a').html()
      try {
        // 保存数据到数据库
        await book.save()
      } catch (err) {
        if (err.code === 11000) {
          console.log(`该小说已存在:${err.keyValue.title}`)
        } else {
          console.error(err)
        }
      }
    }
    let last = page.find('.ptm-card-footer li:last a')
    if (last.length && last.html().trim() === '下一页 »') {
      let url = 'http://m.qskxs.com' + last.attr('href')
      console.log('下一页 ', url)
      // 递归进行下个页面的解析
      await parsePage(url)
    } else {
      console.log('无下一页, 结束')
    }
  }
  await parsePage(rootUrl)
}

(async function () {
  await start('http://m.qskxs.com/xiaoshuodaquan')
  console.log('爬取结束')
}())

结尾

学习使用,请勿将代码进行恶意操作。