使用chrome-har导出浏览器HAR数据
这里使用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数据相关推荐
- JavaScript导出图片和数据到Excel
JavaScript导出图片和数据到Excel 以下方法可以利用json数据将图片地址生成图片导出到Excel,同样也可以将数据导出到Excel.解决网上许多方法关于导出图片到Excel却无法让图片在 ...
- 为什么Chrome比其他浏览器快?
为什么Chrome比其他浏览器快? Google Chrome的历史和指导性原则 Google Chrome最初是2008年下半年作为Windows平台上的一个beta版本发布的.Google还将自己 ...
- 为什么Chrome比其他浏览器快
为什么Chrome比其他浏览器快? Google Chrome的历史和指导性原则 Google Chrome最初是2008年下半年作为Windows平台上的一个beta版本发布的.Google还将自己 ...
- ie内核浏览器_[正式版下载] 微软全新 Chrome 内核 Edge 浏览器!原生支持 Chrome 插件扩展...
尽管微软的 Office 和 Windows 10 势头不错,但像 WP 手机.XBox 等方面似乎并未获得预期的成功.而先前为了替代老旧的 IE 浏览器,微软倾力开发的 Edge 也未见起色. 不过 ...
- ntko跨浏览器插件_继泄露版后,微软全新 Chrome 内核 Edge 浏览器你都测试过了吗?...
尽管微软的 Office 和 Windows 10 势头不错,但像 WP 手机.XBox 等方面似乎并未获得预期的成功.而先前为了替代老旧的 IE 浏览器,微软倾力开发的 Edge 也未见起色. 不过 ...
- 历史数据导出excel_在数据产品中对导出功能的思考
本篇文章:3993字 预计阅读:11分钟 前段时间,产品内上线了一个新的统计模块,出于上线时间的考虑,第一期没有提供"导出"功能,上线后不久就有用户向我反馈需求,产生了如下对话 用 ...
- 查看及修改微软Edge浏览器用户数据保存位置(包括详细历史记录(页面停留时间,页面访问次数,最后访问时间,下载历史等),Cookie,书签等)
文章目录 Edge浏览器的用户数据大部分存储在本地的数据库文件中,目录如下 打开目录后大概有一下内容 由于是数据文件,所以需要用数据库管理软件打开,我这里用的是Navicat,打开后大概下面这样子 下 ...
- poi导出Excel文件下载数据
poi导出Excel文件下载数据 poi上传Excel文件批量的添加数据 : https://blog.csdn.net/kangshifu007/article/details/103149764 ...
- 表格导出计算机,电脑怎么导出excel表格数据-如何将百度指数数据导出到Excel表格...
系统没有导出功能,电脑表格里的数据有什么方法拿... 将网页表格数据导入到Excel中的方法: 第一步,将包括所需表格的网页打开,并按CTRL C把网址复制到剪贴板,以备下一步使用. 第二步,打开运行 ...
- win10 1803版本Chrome(谷歌浏览器),360浏览器极速内核打不开https网站的解决方法
win10 1803版本Chrome(谷歌浏览器),360浏览器极速内核打不开https网站的,总是超时或者卡顿.1803的345版本是可以打开的,但是376版本就不行了.经过研究发现用以下方法可以解 ...
最新文章
- Java工具类之:包装类
- P1064 金明的预算方案(分组背包)
- 【数据结构与算法】之深入解析“平衡二叉树”的求解思路与算法示例
- beandefinition与beanfactory
- 【IneliJ 】使用IneliJ IDEA 2016将Java Web项目导出为War包
- Linux 软件包管理器的目的是什么,Linux软件包的管理--RPM包管理器
- leetcode--动态规划(Easy)
- SpringCloud工作笔记060---SpringBoot中使用WebSocket实现即时通讯_实现呼叫中心业务封装
- @Python 开发者,如何更加高效地编写代码?
- 交换机短路_交换机日常怎么运行维护?一文告诉你
- 图像加噪c语言,[转载]使用imnoise向图像中添加噪声
- 一种让你无法拒绝的浏览设置,CSDN浏览器
- 欺骗的艺术——第二部分(6)
- Math:泰勒(Taylor)公式
- 2021年全球社交应用支出排行榜TikTok列榜首;小猪佩奇和抖音推出防沉迷系列视频 | 美通社头条...
- PVE7更新AQC107网卡驱动,解决奇葩问题。
- 57 java编程思想 创建窗口和程序片 可视编程和Beans
- 360加固之libjiagu.so脱壳及dex dump
- IUV仿真IPTV配置
- 7-3 打印学生选课清单 (25分)
热门文章
- 【CodeForces】 106C Buns(多重背包)
- winpe修复计算机无法启动,巧用PE修复系统启动故障
- 海外网红营销是战略还是战术?从“PDCA循环”层面规划营销
- 锁存器和缓冲器的区别
- blob和clob类型数据怎么插入数据库
- Word文档人民币符号怎么打出来
- 程序员毕业五年他年薪百万,他月薪一万
- 原创|分享2个赚零花钱的小技巧
- mysql 左连接都是null_sql左连接有疑问,为什么查出来都是null,而不是没有数据?...
- 用户下订单之后15分钟支付实现_用户提交订单,30分钟后没付款取消订单功能分析...