Node puppeteer 爬虫

2020-05-19  本文已影响0人  visitor009

puppeteer 中文文档

开始

// 设置国内源,否则下载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') // 继续下一页
        })
    })
});
上一篇下一篇

猜你喜欢

热点阅读