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