这里使用nodejs下的chrome-har库来导出浏览器的har数据,经验证效果不错,比较靠谱。

1,创建日志配置(ultra-harlog/module/log.js)

//cnpm install --save log4js
const log4js = require('log4js');const options = {appenders:{console:{type: "console"},"puppeteer-record":{type : 'dateFile',filename : 'logs/puppeteer/log',pattern : '-yyyy-MM-dd.log',alwaysIncludePattern : true,encoding : 'utf-8'},"puppeteer-har-record":{type : 'dateFile',filename : 'logs/puppeteerhar/log',pattern : '-yyyy-MM-dd.log',alwaysIncludePattern : true,encoding : 'utf-8'},"puppeteer-harevent-record":{type : 'dateFile',filename : 'logs/puppeteerharevent/log',pattern : '-yyyy-MM-dd.log',alwaysIncludePattern : true,encoding : 'utf-8'}}   ,"categories": {"default": { "appenders": ['console', "puppeteer-record", "puppeteer-har-record","puppeteer-harevent-record"], "level": "all" }}
}
log4js.configure(options);function getConsoleLogger(){let consoleLog = log4js.getLogger('console');   return consoleLog ;
}function getPuppeteerRecordLogger(){let consoleLog = log4js.getLogger('puppeteer-record');  return consoleLog ;
}function getPuppeteerHarRecordLogger(){let consoleLog = log4js.getLogger('puppeteer-har-record');  return consoleLog ;
}function getPuppeteerHarEventRecordLogger(){let consoleLog = log4js.getLogger('puppeteer-harevent-record'); return consoleLog ;
}exports.getConsoleLogger = getConsoleLogger;
exports.getPuppeteerRecordLogger = getPuppeteerRecordLogger;
exports.getPuppeteerHarRecordLogger = getPuppeteerHarRecordLogger;
exports.getPuppeteerHarEventRecordLogger = getPuppeteerHarEventRecordLogger;

创建抓取的代码(harlog/module/puppeteerhar.js)

const puppeteer = require('puppeteer');
const PuppeteerHar = require('puppeteer-har');
const path = require("path");const logger=require("./log");
const grpcclient=require("./grpcclient");const log = logger.getPuppeteerHarRecordLogger() ;/*启动浏览器
*/
async function launchBrowser(){//启动浏览器实例 [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',//如果是访问https页面 此属性会忽略https错误ignoreHTTPSErrors: true,// 关闭headless模式, 不会打开浏览器headless: true,//浏览器启动参数 https://peter.sh/experiments/chromium-command-line-switches/   --timeoutargs:['--disk-cache-size=0','--disable-cache','--disable-infobars','--window-size=800,600','--ignore-certificate-errors','--enable-feaures'],//是否为每个选项卡自动打开DevTools面板。 如果此选项为true,则headless选项将设置为false。devtools: false,//Defaults to 30000 (30 seconds). Pass 0 to disable timeout.timeout: 0//放慢puppeteer执行的动作,方便调试//slowMo: 250});return browser ;
}async function saveHarlog(url,dirPath,filename){let homesite = url ;//保存的文件路径let harFilePath = path.join(dirPath,filename) ;//处理URLif(!(url.startsWith('http://') || url.startsWith('https://'))){url = "http://" + url ;}//打开浏览器let browser = await launchBrowser() ;//Puppeteer 初始化的屏幕大小默认为 800px x 600px。但是这个尺寸可以通过 Page.setViewport() 设置。/*await page.setViewport({width: 800,height: 600});*///创建一个新页面//let page = await browser.newPage();const page = (await browser.pages())[0];await page.waitFor(1000); //delay 1 s//page.setDefaultTimeout(12000);//page.setJavaScriptEnabled(enabled)//事件监听轻松打出页面的log//page.on('console', msg => log.info('PAGE LOG:', msg.text()));let har = new PuppeteerHar(page);try{await har.start({ path:harFilePath});/*页面跳转相关函数:page.goto(url, options)  //相当于在浏览器中输入了地址,然后回车page.goBack(options)page.goForward(options)page.reload(options)*/await page.goto(url,{timeout:0});log.info(page.mainFrame().title());log.info(page.mainFrame().url());//返回HTML文档内容//const html = await page.$eval('html', e => e.outerHTML);//const html = await page.content() ;//通知JAVA解析HAR文件/*try{grpcclient.resovleHarLog({url:homesite,file_name:filename,file_dir:dirPath,context:''});}catch(err){log.error('发送RPC请求失败,' + err);}*/}catch(error){log.info('resovle error :' + url + ";  error message:" + error) ;}finally{if(har){await har.stop();       }if(browser){await browser.close();      }}
}
exports.launchBrowser = launchBrowser;
exports.saveHarlog = saveHarlog;

创建启动文件(ultra-harlog/puppeteerhar-app.js)

const fs = require("fs");
const path = require("path");
const moment = require("moment");
const schedule = require('node-schedule');const cvsresovler=require("./module/cvsresovle");
const mhar=require("./module/puppeteerhar");/*
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
cnpm install --save chrome-harcnpm install --save grpc*/
function init(){console.log('初始化调度器') ;//每分钟的第30秒定时执行一次:schedule.scheduleJob('0 14 10 * * *',()=>{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(stat.isDirectory()){isExist = true ;}}if(!isExist){//创建文件夹console.log("创建文件夹" + ftime) ;fs.mkdirSync(dirPath);}       //开始解析需要处理的URLlet 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'] ;url = url.trim() ;let filename = url.replace(/\//g,'-').replace(/\\/g,'-') + '.har' ;if(url){console.log((i+1) + "-starting to resovle url :" + url ) ;try{await mhar.saveHarlog(url,dirPath,"N" + "-" + filename) ;}catch(error){console.log(error) ;}}if(i + 1 < dataArr.length){iterator(i+1) ;}})(0) ;}); console.log('应用程序启动完成') ;
}
//执行
//init();/**用于测试的方法
*/
async function test(){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(stat.isDirectory()){isExist = true ;}}if(!isExist){//创建文件夹console.log("创建文件夹" + ftime) ;fs.mkdirSync(dirPath);}     //测试的URLlet url = "www.baidu.com" ; let arguments = process.argv.splice(2);if(arguments.length > 0 ){url = arguments[0] ;}url = url.trim() ;let filename = url.replace(/\//g,'-').replace(/\\/g,'-') + '.har' ;if(url){console.log("starting to resovle test url :" + url ) ;try{await mhar.saveHarlog(url,dirPath,"NT" + "-" + filename) ;}catch(error){console.log(error) ;}}
}
//运行测试
test() ;

关于GRPC部分的代码,请参考我另外一篇博文

参考地址:https://michaljanaszek.com/blog/generate-har-with-puppeteer

转载于:https://blog.51cto.com/dengshuangfu/2368587

使用chrome-har导出浏览器HAR数据相关推荐

  1. JavaScript导出图片和数据到Excel

    JavaScript导出图片和数据到Excel 以下方法可以利用json数据将图片地址生成图片导出到Excel,同样也可以将数据导出到Excel.解决网上许多方法关于导出图片到Excel却无法让图片在 ...

  2. 为什么Chrome比其他浏览器快?

    为什么Chrome比其他浏览器快? Google Chrome的历史和指导性原则 Google Chrome最初是2008年下半年作为Windows平台上的一个beta版本发布的.Google还将自己 ...

  3. 为什么Chrome比其他浏览器快

    为什么Chrome比其他浏览器快? Google Chrome的历史和指导性原则 Google Chrome最初是2008年下半年作为Windows平台上的一个beta版本发布的.Google还将自己 ...

  4. ie内核浏览器_[正式版下载] 微软全新 Chrome 内核 Edge 浏览器!原生支持 Chrome 插件扩展...

    尽管微软的 Office 和 Windows 10 势头不错,但像 WP 手机.XBox 等方面似乎并未获得预期的成功.而先前为了替代老旧的 IE 浏览器,微软倾力开发的 Edge 也未见起色. 不过 ...

  5. ntko跨浏览器插件_继泄露版后,微软全新 Chrome 内核 Edge 浏览器你都测试过了吗?...

    尽管微软的 Office 和 Windows 10 势头不错,但像 WP 手机.XBox 等方面似乎并未获得预期的成功.而先前为了替代老旧的 IE 浏览器,微软倾力开发的 Edge 也未见起色. 不过 ...

  6. 历史数据导出excel_在数据产品中对导出功能的思考

    本篇文章:3993字 预计阅读:11分钟 前段时间,产品内上线了一个新的统计模块,出于上线时间的考虑,第一期没有提供"导出"功能,上线后不久就有用户向我反馈需求,产生了如下对话 用 ...

  7. 查看及修改微软Edge浏览器用户数据保存位置(包括详细历史记录(页面停留时间,页面访问次数,最后访问时间,下载历史等),Cookie,书签等)

    文章目录 Edge浏览器的用户数据大部分存储在本地的数据库文件中,目录如下 打开目录后大概有一下内容 由于是数据文件,所以需要用数据库管理软件打开,我这里用的是Navicat,打开后大概下面这样子 下 ...

  8. poi导出Excel文件下载数据

    poi导出Excel文件下载数据 poi上传Excel文件批量的添加数据 : https://blog.csdn.net/kangshifu007/article/details/103149764 ...

  9. 表格导出计算机,电脑怎么导出excel表格数据-如何将百度指数数据导出到Excel表格...

    系统没有导出功能,电脑表格里的数据有什么方法拿... 将网页表格数据导入到Excel中的方法: 第一步,将包括所需表格的网页打开,并按CTRL C把网址复制到剪贴板,以备下一步使用. 第二步,打开运行 ...

  10. win10 1803版本Chrome(谷歌浏览器),360浏览器极速内核打不开https网站的解决方法

    win10 1803版本Chrome(谷歌浏览器),360浏览器极速内核打不开https网站的,总是超时或者卡顿.1803的345版本是可以打开的,但是376版本就不行了.经过研究发现用以下方法可以解 ...

最新文章

  1. Java工具类之:包装类
  2. P1064 金明的预算方案(分组背包)
  3. 【数据结构与算法】之深入解析“平衡二叉树”的求解思路与算法示例
  4. beandefinition与beanfactory
  5. 【IneliJ 】使用IneliJ IDEA 2016将Java Web项目导出为War包
  6. Linux 软件包管理器的目的是什么,Linux软件包的管理--RPM包管理器
  7. leetcode--动态规划(Easy)
  8. SpringCloud工作笔记060---SpringBoot中使用WebSocket实现即时通讯_实现呼叫中心业务封装
  9. @Python 开发者,如何更加高效地编写代码?
  10. 交换机短路_交换机日常怎么运行维护?一文告诉你
  11. 图像加噪c语言,[转载]使用imnoise向图像中添加噪声
  12. 一种让你无法拒绝的浏览设置,CSDN浏览器
  13. 欺骗的艺术——第二部分(6)
  14. Math:泰勒(Taylor)公式
  15. 2021年全球社交应用支出排行榜TikTok列榜首;小猪佩奇和抖音推出防沉迷系列视频 | 美通社头条...
  16. PVE7更新AQC107网卡驱动,解决奇葩问题。
  17. 57 java编程思想 创建窗口和程序片 可视编程和Beans
  18. 360加固之libjiagu.so脱壳及dex dump
  19. IUV仿真IPTV配置
  20. 7-3 打印学生选课清单 (25分)

热门文章

  1. 【CodeForces】 106C Buns(多重背包)
  2. winpe修复计算机无法启动,巧用PE修复系统启动故障
  3. 海外网红营销是战略还是战术?从“PDCA循环”层面规划营销
  4. 锁存器和缓冲器的区别
  5. blob和clob类型数据怎么插入数据库
  6. Word文档人民币符号怎么打出来
  7. 程序员毕业五年他年薪百万,他月薪一万
  8. 原创|分享2个赚零花钱的小技巧
  9. mysql 左连接都是null_sql左连接有疑问,为什么查出来都是null,而不是没有数据?...
  10. 用户下订单之后15分钟支付实现_用户提交订单,30分钟后没付款取消订单功能分析...