本脚本做用是抓取掌阅书城里男频女频各分类的已完结书籍信息,按好评排序只抓前三页。
这个页面没有任何反爬措施,适合做为简单例子。javascript
const fs = require("fs") const puppeteer = require('puppeteer'); const url = "http://www.ireader.com/index.php?ca=booksort.index&pca=booksort.index&pid=$pid&order=score&status=3&cid=$cid&page=$page" const pids = [10, 68]; // 男频,女频 const cids = [[11, 27, 19, 22, 16, 39, 42, 50, 54, 57, 60], [69, 74, 82, 86, 89, 90, 91, 723]]; // 频道中的分类ID (async () => { const browser = await puppeteer.launch({ // 启动chrome浏览器 // headless: false, // 是否无头模式,能够先在有头模式下调试,无误后切换成无头模式以提高效率 ignoreDefaultArgs: ["--enable-automation"], // 去掉chrome启动参数中的--enable-automation }); const page = await browser.newPage(); const f = () => { return Array.from($('.bookMation')).map(e => { const id = $('h3 a', e).attr('href').match(/bid=(\d+)/)[1] // 用正则提取连接中的bid const title = $('h3 a', e).text() const author = $('p.tryread', e).text().replace('试读', '').trim() const desc = $('p.introduce', e).text() return {id, title, author, desc} }) } let result = []; for (const i in pids) { const pid = pids[i] for (cid of cids[i]) { for (let pg = 1; pg < 4; pg++) { // 只抓前三页 const u = url.replace("$cid", cid).replace("$pid", pid).replace("$page", pg) await page.goto(u); const res = await page.evaluate(f) res.forEach(e => { e.cid = cid; e.pid = pid }) result = result.concat(res) console.log("page " + pg + " done") } console.log("cid " + cid + " done") } console.log("pid " + pid + " done") } fs.writeFileSync("d:/tmp/ireader_hot.json", JSON.stringify(result), {encoding: "utf-8"}) console.log("all done") await browser.close(); // 关闭浏览器 })();