工具和资料
- QQ群 - Javascript高级爬虫 (832946826) - 作者自建群,欢迎加入!
- awesome-java-crawler - 作者收集的爬虫相关工具和资料
前言
本脚本作用是抓取掌阅书城里男频女频各分类的已完结书籍信息,按好评排序只抓前三页。
这个页面没有任何反爬措施,适合作为简单例子。
大概开发流程:
- 人工分析页面,解析URL和分页、分类等关键参数
- 人工分析页面内容,控制台验证数据提取方法
- 编码
代码说明:
- 前面的pids和cids这两个常数数组都是事先在页面上查看超链接收集的。
- 用来进行数据提取的f方法,实际上是转化为字符串后通过page.evaluate在浏览器中执行的,而不是在node环境中。但因为两侧语言一致,可以直接和node源码写在一起,从而获取IDE支持,而在其它语言中js代码只能以字符串形式存在
- puppeteer的page.evaluate可以直接将浏览器侧脚本返回的对象直接传递到node侧,非常方便
源码
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(); // 关闭浏览器
})();
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。