前段时间两栖作战经验要北迁到https,须要摸查网页中须要加进的全数天然资源,我用nodejs+phantomjs做了两个手动搜集网页天然资源的流程,责任编辑撷取下他们的一点儿两栖作战经验,特别注意该文开头有蔬果
假如概要根本无法说一句话,那我想说的是,“很大要冲破另一方面不足之处,要踏进宽敞区,自认是后端无法被后端局限性住视线”,后端虽美,可千万别神智不清哦
考察
我种叠想不到的计划是全手动搜集倚赖,但此种形式显著不单单,但在几番坎坷后我辨认出了HAR此种奇妙的小东西,一句话归纳,HAR是一类统计数据库控制系统,对咱除了专门针对的组织机构表述规范化了,起促进作用是表述互联网允诺的统计数据规范化,以期在相同辅助工具中共享资源统计数据
钟爱的老师能他们求出统计数据看下文件格式,下面从chrome液晶求出统计数据,让后放在HAR Viewer辅助工具就能还原成了,似不似很奇妙,O(∩_∩)O呵呵~
小基本功:假如想搜集两个网页倚赖了什么样搜索引擎,能这种操作形式
最终目标是智能化,我急于用node来写方法论,几番考察后辨认出phantomjs是两个无头浏览器,能被node调用,真个流程的架构就清晰了,涉及node,phantomjs和HAR
理想很丰满,现实很骨感,我其实没用过phantomjs,也没写过node,o(╯□╰)o
phantomjs
phantomjs是两个没有界面的,可通过JavaScript api编程的Webkit,快速并且原生支持多种web标准:DOM处理,CSS选择器,JSON,Canvas和SVG,这是官网对phantomjs的介绍
phantomjs的整体架构如下,我们能调用phantomjs暴漏的api,从而同时实现他们想要的功能
phantomjs的主要功能有4大块,而互联网监控正是我须要的
headless website testing 无界面网站测试
screen capture 网页截图
page automation 网页智能化测试
network monitoring 互联网监控
互联网上关于phantom的教程要么停留在v1,从v2开始phantom有了独立的可执行流程,在windows下是exe,须要单独安装,能在这里下载对应的安装流程,安装好后还需添加到path路径,在node中也会调用这个可执行流程
在命令行输入phantomjs -v,验证是否安装成功
新建两个test.js
var page = require(webpage).create(); page.open(http://example.com, function(status) { console.log(“Status: ” + status); if(status === “success”) { page.render(example.png); } phantom.exit(); });然后用phantom运行这个js,就能得到对应页面的截图,是不是很简单,特别注意这个test.js是用phantom运行的
phantomjs ./test.jsnodejs
Node.js 是两个基于 Chrome V8 引擎的 JavaScript 运行环境,其架构如下
作为两个没怎么用过node的后端老司机,我给后端的建议是千万别怕,node其实并不难,或者说用node完成他们想做的事情并不难
学习node必须先了解这四个基本概念,commonjs、package、npm、package.json
由于js本身缺少模块的功能(es6已经有了原生支持),为解决这个问题,社区创造了commonjs,node中的模块都是commonjs模块,两个模块能暴漏接口供其他模块使用,也能引用其他模块暴漏的接口
var q = require(q); // 倚赖模块q exoprts.a = q; // 暴漏给其他模块使用有时候我们会想吧几个js文件给别人,让别人使用,这是package的概念,package是一堆功能类似的模块的集合,每个package的根目录都有两个package.json文件,用以记录一些他们的信息,比如名字,版本号等
我们自己的node项目也会有两个package.json文件,主要是用以记录倚赖了什么样第三方包
node的开源包一般都在npm这个社区上,npm同时能安装包的两个命令行辅助工具,比如我们再npm网站上找到了bootstrap这个包,就能在命令行用npm安装这个包,安装好后,能将这个倚赖写到package.json,方便以后安装
npm install bootstrapnode作为两个有了对控制系统完整操作形式的功能,所有有众多内置模块,带星号的是我加进的模块,看到这么多千万别慌,你可能只会加进20%
Buffer 二进制文件相关
*Child Processes 处理子进程的模块
*Console 控制台输出
Events 事件控制系统
*File System 文件控制系统
*Globals 全局变量
HTTP http允诺相关
Utilites 内置辅助工具函数
*URI URL相关操作形式
Stream 文件流相关
Query String
*Process 当前进程相关
*Path 文件路径相关
Modules 模块相关
技术细节
config.js是配置文件,我将配置做成网站加网页的维度,这种就能统计多个网站的多个网页了
get-website.js读取config.js,然后解析成网站和对应的网页
为要执行子进程,所以要加进execFile
parse-website.js负责将统计数据按照网页,网站搜集,分类,整理
print-website.js负责将统计数据打印输出,涉及文件读写
整个流程加进了child_process,调用phantom子进程
childProcess.execFile(binPath, childArgs, {maxBuffer: 1000*1024}, function(err, stdout, stderr) { if (err) { reject(stdout || stderr || err); return; } // handle results resolve(stdout); });process.cwd()path路径相关操作形式,如拼接读写文件的路径
var path = require(path) path.join(__dirname, phantomjs-script.js)fs读写文件,如将最终统计数据写入文件
fs.writeFile(filepath, content, function (err) { if (err) { reject(err); return; } resolve(name); });总结
整个控制系统能同时实现对配置文件中的网页倚赖的天然资源进行搜集整理和分析,终于把手工的工作变成了手动的,作为两个流程员很大要有智能化的意识,重复的工作让机器来做
此种脚本类型的任务,node的异步会让流程更复杂,o(╯□╰)o
假如然我推荐一篇学习nodejs的该文的话,那我推荐《七天学会nodejs》,假如让我推荐一本书的话,我推荐《nodejs两栖作战》