node.js抓取并分析网页内容有无特殊内容的js文件


Posted in Javascript onNovember 17, 2015

nodejs获取网页内容绑定data事件,获取到的数据会分几次相应,如果想全局内容匹配,需要等待请求结束,在end结束事件里把累积起来的全局数据进行操作!

举个例子,比如要在页面中找有没有www.baidu.com,不多说了,直接放代码:

//引入模块
var http = require("http"),
fs = require('fs'),
url = require('url');
//写入文件,把结果写入不同的文件
var writeRes = function(p, r) {
   fs.appendFile(p , r, function(err) {
    if(err)
       console.log(err);
    else
       console.log(r);
  });
},
//发请求,并验证内容,把结果写入文件
postHttp = function(arr, num) {
   console.log('第'+num+"条!")
   var a = arr[num].split(" - ");
   if(!a[0] || !a[1]) {
     return;
   }
   var address = url.parse(a[1]),
   options = {
     host : address.host,
     path: address.path,
     hostname : address.hostname,
     method: 'GET',
     headers: {
      'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36'
    }
   }
   var req = http.request(options, function(res) {
     if (res.statusCode == 200) {
        res.setEncoding('UTF-8');
        var data = '';
        res.on('data', function (rd) {  
          data += rd;
        });
        res.on('end', function(q) {
          if(!~data.indexOf("www.baidu.com")) {
             return writeRes('./no2.txt', a[0] + '--' + a[1] + '\n');            
          } else {
             return writeRes('./has2.txt', a[0] + '--' + a[1] + "\n");
          }
        })
     } else {
        writeRes('./error2.txt', a[0] + '--' + a[1] + '--' + res.statusCode + '\n');
     }
   });
   req.on('error', function(e) {
     writeRes('./error2.txt', a[0] + '--' + a[1] + '--' + e + '\n');
   })
   req.end();
},
//读取文件,获取需要抓取的页面
openFile = function(path, coding) {
   fs.readFile(path, coding, function(err, data) {
     var res = data.split("\n");  
     for (var i = 0, rl = res.length; i < rl; i++) {
        if(!res[i])
          continue;
        postHttp(res, i);  
     };  
   })
};
openFile('./sites.log', 'utf-8');

上面代码大家可以看的懂吧,有哪里不清楚的朋友欢迎给我留言,具体的还要靠大家发挥应用到实践当中。

下面给大家介绍Nodejs对于网页抓取的能力

首先PHP。先说优势:网上抓取和解析html的框架一抓一大把,各种工具直接拿来用就行了,比较省心。缺点:首先速度/效率很成问题,有一次下载电影海报的时候,由于是crontab定期执行,也没做优化,开的php进程太多,直接把内存撑爆了。然后语法方面也很拖沓,各种关键字 符号 太多,不够简洁,给人一种没有认真设计过的感觉,写起来很麻烦。

Node.js。优点是效率、效率还是效率,由于网络是异步的,所以基本如同几百个进程并发一样强大,内存和CPU占用非常小,如果没有对抓取来的数据进行复杂的运算加工,那么系统的瓶颈基本就在带宽和写入MySQL等数据库的I/O速度。当然,优点的反面也是缺点,异步网络代表你需要callback,这时候如果业务需求是线性了,比如必须等待上一个页面抓取完成后,拿到数据,才能进行下一个页面的抓取,甚至多层的依赖关系,那就会出现可怕的多层callback!基本这时候,代码结构和逻辑就会一团乱麻。当然可以用Step等流程控制工具解决这些问题。

最后说Python。如果你对效率没有极端的要求,那么推荐用Python!首先,Python的语法很简洁,同样的语句,可以少敲很多次键盘。然后,Python非常适合做数据的处理,比如函数参数的打包解包,列表解析,矩阵处理,非常方便。

Javascript 相关文章推荐
node.js中的fs.fchmod方法使用说明
Dec 16 Javascript
js实现仿百度风云榜可重复多次调用的TAB切换选项卡效果
Aug 31 Javascript
基于jQuery实现点击弹出层实例代码
Jan 01 Javascript
BootStrap 附加导航组件
Jul 22 Javascript
jquery实现折叠菜单效果【推荐】
Mar 08 Javascript
详解Vue监听数据变化原理
Mar 08 Javascript
JavaScript结合HTML DOM实现联动菜单
Apr 05 Javascript
详解React开发中使用require.ensure()按需加载ES6组件
May 12 Javascript
angular4 如何在全局设置路由跳转动画的方法
Aug 30 Javascript
angularjs 缓存的使用详解
Mar 19 Javascript
vue.js 实现点击按钮动态添加li的方法
Sep 07 Javascript
Nuxt项目支持eslint+pritter+typescript的实现
May 20 Javascript
js全选按钮的实现方法
Nov 17 #Javascript
javascript实现省市区三级联动下拉框菜单
Nov 17 #Javascript
javascript中return,return true,return false三者的用法及区别
Nov 17 #Javascript
jquery表单验证需要做些什么
Nov 17 #Javascript
今天抽时间给大家整理jquery和ajax的相关知识
Nov 17 #Javascript
jquery验证手机号是否正确实例讲解
Nov 17 #Javascript
跟我学习javascript的prototype使用注意事项
Nov 17 #Javascript
You might like
PHP strtotime函数详解
2009/12/18 PHP
CodeIgniter模板引擎使用实例
2014/07/15 PHP
smarty模板引擎中内建函数if、elseif和else的使用方法
2015/01/22 PHP
Javascript实现的分页函数
2006/12/22 Javascript
深入理解Javascript闭包 新手版
2010/12/28 Javascript
THREE.JS入门教程(3)着色器-下
2013/01/24 Javascript
处理及遍历XML文档DOM元素属性及方法整理
2013/08/23 Javascript
使用Chart.js图表库制作漂亮的响应式表单
2015/10/28 Javascript
jquery动态增加删减表格行特效
2015/11/20 Javascript
JavaScript通过使用onerror设置默认图像显示代替alt
2016/03/01 Javascript
jQuery ajax提交Form表单实例(附demo源码)
2016/04/06 Javascript
JS实现改变HTML上文字颜色和内容的方法
2016/12/30 Javascript
vue.js中v-on:textInput无法执行事件问题的解决过程
2017/07/12 Javascript
JS基于递归实现网页版计算器的方法分析
2017/12/20 Javascript
vue权限管理系统的实现代码
2019/01/17 Javascript
[36:33]Ti4 循环赛第四日 附加赛NEWBEE vs Mouz
2014/07/13 DOTA
[41:54]2018DOTA2亚洲邀请赛 4.1 小组赛A组加赛 TNC vs Liquid
2018/04/03 DOTA
Python语言实现获取主机名根据端口杀死进程
2016/03/31 Python
高效使用Python字典的清单
2018/04/04 Python
浅析python中numpy包中的argsort函数的使用
2018/08/30 Python
Python如何读写CSV文件
2020/08/13 Python
协程Python 中实现多任务耗资源最小的方式
2020/10/19 Python
领先的钻石和订婚戒指零售商:Diamonds-USA
2016/12/11 全球购物
日期和时间问题
2015/01/04 面试题
自我评价的范文
2014/02/02 职场文书
中国梦演讲稿教师篇
2014/04/23 职场文书
抗洪抢险事迹材料
2014/05/06 职场文书
新学期国旗下演讲稿
2014/05/08 职场文书
竞争与合作演讲稿
2014/05/12 职场文书
中国梦演讲稿开场白
2014/08/28 职场文书
4S店客服专员岗位职责
2015/04/07 职场文书
乡镇安全生产月活动总结
2015/05/08 职场文书
2016银行招聘自荐信
2016/01/28 职场文书
《观潮》教学反思
2016/02/17 职场文书
解决jupyter notebook启动后没有token的坑
2021/04/24 Python
Python测试框架pytest高阶用法全面详解
2022/06/01 Python