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)
}

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