Puppeteer(小說爬取???)
今天上班有點空,就學了一下爬蟲,剛好想起昨天看的電視劇,就把他的小說爬下來了
選型
- 前端沒門檻
- 基於
DevTools
,同時擁有node
和chrome
的能力
實現
先做了一個截屏的版本,感覺圖片不太方便(
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(/( |<\/([^>]+)>)/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)
}