美文网首页
(Node mongo系列)Puppeteer爬取网页数据并写入

(Node mongo系列)Puppeteer爬取网页数据并写入

作者: 梦想成真213 | 来源:发表于2019-04-25 10:51 被阅读0次
    官方介绍

    在浏览器中手动执行的绝大多数操作都可以使用Puppeteer来完成! 下面是一些示例:

    • 生成页面 PDF。
    • 抓取 SPA(单页应用)并生成预渲染内容(即“SSR”(服务器端渲染))。
    • 自动提交表单,进行 UI 测试,键盘输入等。
    • 创建一个时时更新的自动化测试环境。 使用最新的 JavaScript 和浏览器功能直接在最新版本的Chrome中执行测试。
    • 捕获网站的 timeline trace,用来帮助分析性能问题。
    • 测试浏览器扩展。
    实践

    通过Puppeteerapi来实例化一个browser,然后新建一个page,打开一个url地址,渲染完成之后,模拟在console面板操作dom,来获取想要的数据。
    新建一个index.js文件,拿到数据之后讲数据写入文件curse-list.json文件中,代码如下:

    //index.js
    //用puppeteer来模拟浏览器操作拿到前端免费课程的列表,第一页
    const puppeteer = require('puppeteer');
    const fs = require('fs');
    const imoocUrl = 'https://www.imooc.com/course/list?c=fe';
    ;(async () => {
        const browser = await puppeteer.launch();
        const page = await browser.newPage();
        console.log('start open url:',imoocUrl);
        await page.goto(imoocUrl);
        
        //操作数据
        console.log('operate dom by console');
        const result = await page.evaluate(() => {
            let $ = window.$;
            let data = [];
            let courseList = $('.moco-course-list').find('.course-card-container');
            if(courseList.length > 1){
                courseList.each((index,item) => {
                    let item_a = $(item).find('a');
                    let tags = [];
                    let labels = item_a.find('.course-label label');
                    if(labels.length > 0){
                        labels.each((index,item) => {
                            tags.push($(item).text());
                        })
                    }
                    let content = item_a.find('.course-card-content');
                    let title = content.find('.course-card-name').text();
                    let card = content.find('.course-card-info span');
                    let level = $(card[0]).text();
                    let desc = content.find('.course-card-desc').text();
                    data.push({
                        title,
                        tags: tags.join(','),
                        level,
                        desc
                    });
                })
            }
            return data;
        });
    
        await browser.close();
        console.log('打印数据','\n',result);
    
        //将数据写入到文件中,通过fs模块
        let apiData = {
            data: result,
            code: 0,
            message: 'success'
        }
        fs.writeFile('course-list.json',JSON.stringify(apiData,null,'\t'));
    })();
    

    运行命令:
    node index.js
    然后打开json文件,数据已经被写入到文件中。

    注意:fs.writeFile()写入的数据类型必须是这几种

    本来不加\t直接写入的是没有格式化的数据,又看了JSON.stringify的参数JSON.stringify(value[, replacer [, space]])
    space用于美化输出。

    结语

    最后一个数据的爬取就完成了,也可以封装成一个函数,通过传入一个url,一个dom操作的回调函数,来获取想要的各种各样的数据,写入到文件中,在需要用到数据的时候,通过读取文件来mock数据,这样前端就可以专注于前端了。

    参考:
    https://github.com/GoogleChrome/puppeteer
    https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify

    相关文章

      网友评论

          本文标题:(Node mongo系列)Puppeteer爬取网页数据并写入

          本文链接:https://www.haomeiwen.com/subject/vvxcgqtx.html