Node puppeteer 爬虫

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') // 继续下一页
        })
    })
});
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值