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 相关文章推荐
一个js导致的jquery失效问题的解决方法
Nov 27 Javascript
js获取form的方法
May 06 Javascript
使用Node.js实现HTTP 206内容分片的教程
Jun 23 Javascript
有关JavaScript中call()和apply() 的一些理解
May 20 Javascript
表单中单选框添加选项和移除选项
Jul 04 Javascript
JS控件bootstrap suggest plugin使用方法详解
Mar 25 Javascript
ES6入门教程之let和const命令详解
May 17 Javascript
vue-quill-editor实现图片上传功能
Aug 08 Javascript
浅谈Vue父子组件和非父子组件传值问题
Aug 22 Javascript
es6基础学习之解构赋值
Dec 10 Javascript
el-table表头根据内容自适应完美解决表头错位和固定列错位
Jan 07 Javascript
详解js创建对象的几种方式和对象方法
Mar 01 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 get_headers 判断URL是否有效的解决办法
2013/04/27 PHP
隐藏Nginx或Apache以及PHP的版本号的方法
2016/01/03 PHP
PHP查看SSL证书信息的方法
2016/09/22 PHP
详解PHP神奇又有用的Trait
2019/03/25 PHP
php并发加锁问题分析与设计代码实例讲解
2021/02/26 PHP
JS面向对象编程 for Cookie
2010/09/19 Javascript
Yii-自定义删除确认弹框(zyd)jquery实现代码
2013/03/04 Javascript
JavaScript按位运算符的应用简析
2014/02/04 Javascript
JS实现图片放大镜效果的方法
2015/02/27 Javascript
JavaScript 性能优化小结
2015/10/12 Javascript
Winform客户端向web地址传参接收参数的方法
2016/05/17 Javascript
jQuery查找dom的几种方法效率详解
2017/05/17 jQuery
微信小程序 页面滑动事件的实例详解
2017/10/12 Javascript
微信小程序wx.previewImage预览图片实例详解
2017/12/07 Javascript
简单的Vue异步组件实例Demo
2017/12/27 Javascript
Vue实现根据hash高亮选项卡
2019/05/27 Javascript
js贪心算法 钱币找零问题代码实例
2019/09/11 Javascript
jQuery实现全选按钮
2021/01/01 jQuery
[01:02]DOTA2辉夜杯决赛日 CDEC.Y对阵VG赛前花絮
2015/12/27 DOTA
python 解析XML python模块xml.dom解析xml实例代码
2014/02/07 Python
梯度下降法介绍及利用Python实现的方法示例
2017/07/12 Python
Python基于递归和非递归算法求两个数最大公约数、最小公倍数示例
2018/05/21 Python
Python3+Appium安装使用教程
2019/07/05 Python
Tensorflow 实现分批量读取数据
2020/01/04 Python
HTML5 body设置自适应全屏
2020/05/07 HTML / CSS
世界上最大的汽车共享网站:Zipcar
2017/01/14 全球购物
Electrolux伊莱克斯巴西商店:家用电器、小家电和配件
2018/05/23 全球购物
下面这个程序执行后会有什么错误或者效果
2014/11/03 面试题
经理任命书模板
2014/06/06 职场文书
小学社团活动总结
2014/06/27 职场文书
软件工程毕业生自荐信
2014/07/04 职场文书
公司离职证明范本(5篇)
2014/09/17 职场文书
2014年党风廉政建设工作总结
2014/11/19 职场文书
高考升学宴答谢词
2015/01/20 职场文书
驳回起诉裁定书
2015/05/19 职场文书
vue-router中hash模式与history模式的区别
2021/06/23 Vue.js