Node puppeteer 爬虫用法

    技术2022-07-10  137

    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') // 继续下一页 }) }) });
    Processed: 0.012, SQL: 9