Nodejs中puppeteer抓取浏览器HAR数据

有这么一个需求,首先从csv文件中读取要解析的url数据,然后使用puppeteer和puppeteer-har来获取浏览器的HAR数据。在调试的过程中,发现在for循环中怎么操作都是异步的,最后找到了一个解决方案,也算在此记录。

har.js

const puppeteer = require(‘puppeteer‘);
const PuppeteerHar = require(‘puppeteer-har‘);

/*
(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();

  const har = new PuppeteerHar(page);
  await har.start({ path: ‘results.har‘ });

  await page.goto(‘http://example.com‘);

  await har.stop();
  await browser.close();
})();
*/

async function saveHarlog(url,filename){
  //启动浏览器实例 [puppeteer.createBrowserFetcher([options])]
  let browser = await puppeteer.launch({
    // 若是手动下载的chromium需要指定chromium地址, 默认引用地址为 /项目目录/node_modules/puppeteer/.local-chromium/
    //executablePath: ‘/Users/huqiyang/Documents/project/z/chromium/Chromium.app/Contents/MacOS/Chromium‘,
    //设置超时时间
    timeout: 15000,
    //如果是访问https页面 此属性会忽略https错误
    ignoreHTTPSErrors: true,
    // 关闭headless模式, 不会打开浏览器
    headless: false,
    args:["--disk-cache-size=0","--disable-cache",‘--disable-infobars‘],
    //是否为每个选项卡自动打开DevTools面板。 如果此选项为true,则headless选项将设置为false。
    devtools:false
  });
  //创建一个新页面
  let page = await browser.newPage();
  //Puppeteer 初始化的屏幕大小默认为 800px x 600px。但是这个尺寸可以通过 Page.setViewport() 设置。
  await page.setViewport({
        width: 800,
        height: 600
  });
  let har = new PuppeteerHar(page);
  await har.start({ path: (filename +‘.har‘) });
  await page.goto(url);

  // Get the "viewport" of the page, as reported by the page.
  let dimensions = await page.evaluate(() => {
    return {
      width: document.documentElement.clientWidth,
      height: document.documentElement.clientHeight,
      deviceScaleFactor: window.devicePixelRatio
    };
  });

  await har.stop();
  await browser.close();
}

exports.saveHarlog = saveHarlog;

cvsresovler.js

const fs = require("fs");
const path = require("path");
const csv =require(‘csv‘);
const parse = require(‘csv-parse/lib/sync‘)
const iconv = require(‘iconv-lite‘);   

/*
npm install iconv-lite
*/
function readUrlRecord(csvpath){
    console.log(‘开始解析文件:‘ + csvpath) ;

    //读取文件
    const input = fs.readFileSync(csvpath,‘utf8‘) ;

    /*
    解析文件,生成JSON格式

    { ‘   ‘: ‘142‘,
    AREA_NAME: ‘湖北‘,
    SITE_LINK: ‘www.banggo.com‘,
    BEARING_MODE: ‘移动接入‘,
    SITE_NAME: ‘邦购‘,
    MENU_TYPE: ‘二级‘ }

    */
    const records = parse(input, {
      columns: true,
      skip_empty_lines: true,
      delimiter: ‘,‘,
    }) ;

    return records ;
}

//readUrlRecord(‘../top300.csv‘) ;

exports.readUrlRecord = readUrlRecord;

main.js

const fs = require("fs");
const path = require("path");
const moment = require("moment");
const schedule = require(‘node-schedule‘);

const cvsresovler=require("./module/cvsresovler");
const mhar=require("./module/har");

/*
cnpm install --save moment
cnpm install --save csv
cnpm install --save node-schedule
cnpm install --save puppeteer
cnpm install --save puppeteer-har
cnpm install --save iconv-lite

*/
function init(){
        console.log(‘初始化调度器‘) ;
    //每分钟的第30秒定时执行一次:
    schedule.scheduleJob(‘0 21 * * * *‘,()=>{
        let ftime = moment().format(‘YYYYMMDDHHmm‘);
        console.log(‘当前调度时间为:‘ + ftime) ;
        let dirPath = path.join(__dirname,‘harlogs‘,ftime) ;
        console.log("创建目录:" + dirPath) ;

        let isExist = false ;
        if(fs.existsSync(dirPath)){
                //创建文件夹
                let stat = fs.lstatSync(dirPath);
                if(stats.isDirectory()){
                    isExist = false ;
                }
        }
        if(!isExist){
            //创建文件夹
            console.log("创建文件夹" + ftime) ;
                fs.mkdirSync(dirPath);
        }
        //开始解析需要处理的URL
        let dataArr = cvsresovler.readUrlRecord(path.join(__dirname,‘top300.csv‘)) ;
        console.log("解析出URL共计" + dataArr.length + "条") ;
        /*
            开始抓取HAR数据【同步的方式执行】。
            注意:如果这里直接通过for循环遍历dataArr并调用saveHarlog方法,那么这将是一个异步的过程。
        */
        (async function iterator(i){
            let data =  dataArr[i]
            let url = data[‘SITE_LINK‘] ;
            console.log("开始处理:" + url ) ;
            await mhar.saveHarlog(‘http://‘ + url,path.join(dirPath,url.replace(‘/‘,"-"))) ;
            if(i + 1 < dataArr.length){
                iterator(i+1) ;
            }
    })(0) ;
  });
  console.log(‘应用程序启动完成‘) ;
}
//执行
init();

原文地址:https://blog.51cto.com/dengshuangfu/2365190

时间: 2024-10-11 04:41:53

Nodejs中puppeteer抓取浏览器HAR数据的相关文章

Fiddler捕获抓取 App端数据包

最近项目设计到App抓包,所以采用Fiddler工具来采集获取APP数据包,但是fiddler对有些app是无法捕获到数据包的,以下是我的处理方法: 1. 我默认代理端口使用的是自定义的端口而不是默认的8888端口: 2. 手机端安装Fiddler证书,电脑端关闭防火墙 对我采集的app来说亲测有效能获取到数据包,记录一下操作过程: 以下是我对安卓App进行抓取的步骤: 1.   Fiddler下载地址(http://fiddler2.com/) 2.  安装到电脑,我的电脑系统是Win10 3

利用fiddler抓取Android app数据包

前言 做Android开发的朋友经常需要做网络数据的获取和提交表单数据等操作,然而对于调试程序而言,很难知道我们的数据到底是以怎样的形式发送的,是否发送成功,如果发送失败有是什么原因引起的.fiddler工具为我们提供了很方便的抓包操作,可以轻松抓取浏览器的发出的数据,不管是手机APP,还是web浏览器,都是可以的. 什么是fiddler 百度百科上是这样说的:Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯,设置断点,查看所有的"进出&quo

[python]利用selenium模拟用户操作抓取天猫评论数据

准备: python3.5 安装selenium包 第一种方法: cmd里输pip install selenium,但是经常报错 第二种方法: 下载安装包-cmd进入解压路径-python setup.py install-报错permission denied-右键安全更改报错文件夹权限为完全控制-再次安装成功unknown error: unable to discover open pages-下载chromedriver放在环境变量目录下测试自动打开百度时提示"您使用的是不受支持的命令

转 PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)

PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据) 通过curl_setopt()函数可以方便快捷的抓取网页(采集很方便),curl_setopt 是php的一个扩展库 使用条件:需要在php.ini 中配置开启.(PHP 4 >= 4.0.2)       //取消下面的注释 extension=php_curl.dll 在Linux下面,需要重新编译PHP了,编译时,你需要打开编译参数——在configure命令上加上“–with-curl” 参数. 1.

Python爬虫之抓取豆瓣影评数据

脚本功能: 1.访问豆瓣最受欢迎影评页面(http://movie.douban.com/review/best/?start=0),抓取所有影评数据中的标题.作者.影片以及影评信息 2.将抓取的信息写入excel中 页面信息如下: 一共5页,需要循环访问不同的页面 HTML源代码: <a class="" title="<权力的游戏>S5E8:凛冬已至,凡人皆死" href="http://movie.douban.com/review

微信好友大揭秘,使用Python抓取朋友圈数据,通过人脸识别全面分析好友,一起看透你的“朋友圈”

微信:一个提供即时通讯服务的应用程序,更是一种生活方式,超过数十亿的使用者,越来越多的人选择使用它来沟通交流. 不知从何时起,我们的生活离不开微信,每天睁开眼的第一件事就是打开微信,关注着朋友圈里好友的动态,而朋友圈中或虚或实的状态更新,似乎都在证明自己的"有趣",寻找那份或有或无的存在感. 有人选择在朋友圈记录生活的点滴,有人选择在朋友圈展示自己的观点.有时我们想去展示自己,有时又想去窥探着别人的生活,而有时又不想别人过多的了解自己的生活,或是屏蔽对方,或是不给对方看朋友圈,又或是不

使用Fiddler抓取手机APP数据包--360WIFI

使用Fiddler抓取手机APP流量--360WIFI 操作步骤:1.打开Fiddler,Tools-Fiddler Options-Connections,勾选Allow remote computers to connect,端口为8888:2.防火墙开放端口8888:2.在电脑上查看360wifi无线网卡IP地址,运行命令ipconfig /all,查看无线局域网适配器的IP信息192.168.1.100:3.手机wifi中设置代理为步骤2中的IP地址192.168.1.100,端口为步骤

手把手教你使用Python抓取QQ音乐数据!

[一.项目目标] 通过手把手教你使用Python抓取QQ音乐数据(第一弹)我们实现了获取 QQ 音乐指定歌手单曲排行指定页数的歌曲的歌名.专辑名.播放链接. 通过手把手教你使用Python抓取QQ音乐数据(第二弹)我们实现了获取 QQ 音乐指定歌曲的歌词和指定歌曲首页热评. 通过手把手教你使用Python抓取QQ音乐数据(第三弹)我们实现了获取更多评论并生成词云图. 此次我们将将三个项目封装在一起,通过菜单控制爬取不同数据. [二.需要的库] 主要涉及的库有:requests.openpyxl.

tcpdump教程 - 从命令行抓取和分析数据包

前言 在介绍和使用tcpdump之前,请确保您已经掌握或者了解如下几个关键概念,否则后面的内容让你有点痛苦. 能够在Linux命令行下工作 理解OSI七层网络协议的概念 熟悉各层的协议头部,重点是IP/TCP/UDP 交换机和路由器对应于OSI的协议层 另外还需要注意的是: tcpdump是基于Unix系统的命令行式的数据包嗅探工具.如果要使用tcpdump抓取其他主机MAC地址的数据包,必须开启网卡混杂模式,所谓混杂模式,用最简单的语言就是让网卡抓取任何经过它的数据包,不管这个数据包是不是发给