开始
// 设置国内源,否则下载puppeteer很慢
shell> npm config set registry http://registry.npm.taobao.org
shell> npm init -y
shell> npm i puppeteer@3.1.0
爬取豆瓣书籍列表
豆瓣读书 在这个页面输入javascript,然后爬取列表
案例特征:需要点击下一步才能获取数据
/*
1. 进入豆瓣读书首页,在输入框输入javascript,点击搜索
2. 抓取搜索列表的数据保存 data 变量
3. 将data 保存到 result.json 中,成功后继续点击下页
4. 重复运行 2,3步 */
const puppeteer = require('puppeteer');
let fs = require('fs')
let data = []; // 保存爬取到的数据
// 抓取每个页面的数据
async function getPageData(page) {
const result = await page.evaluate(() => {
let containers = document.querySelectorAll('.sc-bZQynM'); // 每条书籍的容器
let data = [];
[...containers].forEach((el,elI)=>{
let title = el.querySelector('.title').innerText; // 标题
let ratingNum = el.querySelector('.rating_nums'); // 评分
let readNum = el.querySelector('.pl').innerText;; // 评价人数
ratingNum = ratingNum ? ratingNum.innerText : '0';
data.push({
title,ratingNum,readNum,
})
})
return data
});
return result;
}
// 开始运行--------
puppeteer.launch({
headless: false, // 有界面运行
}).then(async browser => {
const page = await browser.newPage();
await page.setViewport({
width: 1800,
height: 900
})
console.log('Start...')
await page.goto('https://book.douban.com/');
await page.focus('#inp-query');
await page.keyboard.sendCharacter('javascript');
await page.click('.inp-btn')
console.log('Into page')
page.on('load',async ()=>{ // 每次新页面加载都会触发
console.log('Page loaded');
let result = await getPageData(page);
data.push(...result); // 将每个页面抓到的数据追加到 data ,直接写入文件
fs.writeFile('result.json',JSON.stringify(data),()=>{
console.log('The file is writed')
page.click('.paginator .next') // 继续下一页
})
})
});
网友评论