Puppeteer(小说爬取???)

Puppeteer(小说爬取???)

今天上班有点空,就学了一下爬虫,刚好想起昨天看的电视剧,就把他的小说爬下来了

选型

  • 前端没门槛
  • 基于DevTools,同时拥有nodechrome的能力

实现

先做了一个截屏的版本,感觉图片不太方便(kindle看起来费劲),就在在做了个简易的txt版本

  • 基于puppeteer-examples,快速上手
git clone https://github.com/checkly/puppeteer-examples
cd puppeteer-examples
npm i
node demo/novel
  • 简单实现

const puppeteer = require('puppeteer')
const fs = require('fs')
try {
  (async () => {
    const browser = await puppeteer.launch()
    const page = await browser.newPage()
    await page.tracing.start({
      path: 'trace.json',
      categories: ['devtools.timeline']
    })

    const getPage = async (i) => {
      return new Promise(async (resolve, reject) => {
        await browser.newPage().then(async page => {
          // await page.setViewport({
          //   width: 1920,
          //   height: 1080
          // });
          try {
            await page.goto(`https://www.idejian.com/book/12263732/${i + 1}.html`)
            // await page.screenshot({ path: `${i}.png`, fullPage: true }) 截屏版
            text = await page.$$eval('.h5_mainbody', value => value.map(u => u.innerHTML))

            resolve(
              (text[1] || text[0])
                .replace(/\s+/g, '  ')
                .replace(/[\n\r\t]/g, '')
                .replace(/(&nbsp;|<\/([^>]+)>)/ig, '\n')
                .replace(/(<([^>]+)>)/ig, ''))
          } catch (err) {
            console.log('error' + i)
          }

          return 1
        })
      })
    }

    const ans = await Promise.all([...new Array(97).keys()].map((_, i) => getPage(i)))
    const file = fs.createWriteStream('./传闻中的三公主.txt');
    ans.map(v => file.write(v))
    file.end();
    await page.tracing.stop();
    await browser.close()
  })()
} catch (err) {
  console.error(err)
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章