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 相关文章推荐
prototype1.4中文手册
Sep 22 Javascript
jquery的extend和fn.extend的使用说明
Jan 09 Javascript
根据表格中的某一列进行排序的javascript代码
Nov 29 Javascript
jQuery中attr()和prop()在修改checked属性时的区别
Jul 18 Javascript
mvc 、bootstrap 结合分布式图简单实现分页
Oct 10 Javascript
jQuery实现的手风琴侧边菜单效果
Mar 29 jQuery
js动态设置select下拉菜单的默认选中项实例
Aug 21 Javascript
Bootstrap Table 双击、单击行获取该行及全表内容
Aug 31 Javascript
详解微信小程序调用支付接口支付
Apr 28 Javascript
angular多语言配置详解
May 16 Javascript
VUE 项目在IE11白屏报错 SCRIPT1002: 语法错误的解决
Sep 27 Javascript
如何在JavaScript中等分数组的实现
Dec 13 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
DSP接收机前端设想
2021/03/02 无线电
ini_set的用法介绍
2014/01/07 PHP
smarty模板引擎使用内建函数foreach循环取出所有数组值的方法
2015/01/22 PHP
解决ThinkPHP关闭调试模式时报错的问题汇总
2015/04/22 PHP
遍历指定目录,并存储目录内所有文件属性信息的php代码
2016/10/28 PHP
FireFox与IE 下js兼容触发click事件的代码
2008/11/20 Javascript
JavaScript Cookie显示用户上次访问的时间和次数
2009/12/08 Javascript
setinterval()与clearInterval()JS函数的调用方法
2015/01/21 Javascript
Jquery时间轴特效(三种不同类型)
2015/11/02 Javascript
利用jQuery中的ajax分页实现代码
2016/02/25 Javascript
AngularJs学习第八篇 过滤器filter创建
2016/06/08 Javascript
js实现页面刷新滚动条位置不变
2016/11/27 Javascript
JavaScript运动框架 解决防抖动问题、悬浮对联(二)
2017/05/17 Javascript
详解angular ui-grid之过滤器设置
2017/06/07 Javascript
javascript实现数字配对游戏的实例讲解
2017/12/14 Javascript
Angular中sweetalert弹框的基本使用教程
2018/07/22 Javascript
angularjs使用div模拟textarea文本框的方法
2018/10/02 Javascript
解决使用layui的时候form表单中的select等不能渲染的问题
2019/09/18 Javascript
jQuery实现聊天对话框
2020/02/08 jQuery
ES6 Iterator遍历器原理,应用场景及相关常用知识拓展详解
2020/02/15 Javascript
[00:33]DOTA2上海特级锦标赛 CDEC战队宣传片
2016/03/04 DOTA
Python字符串和文件操作常用函数分析
2015/04/08 Python
答题辅助python代码实现
2018/01/16 Python
对Python3.6 IDLE常用快捷键介绍
2018/07/16 Python
python opencv minAreaRect 生成最小外接矩形的方法
2019/07/01 Python
python打印文件的前几行或最后几行教程
2020/02/13 Python
python基于openpyxl生成excel文件
2020/12/23 Python
CSS3制作3D立方体loading特效
2020/11/09 HTML / CSS
html5适合移动应用开发的12大特性
2014/03/19 HTML / CSS
WatchShop法国:英国排名第一的独立手表零售商
2020/02/17 全球购物
俄罗斯外国汽车和国产汽车配件网上商店:Движком
2020/04/19 全球购物
学校安全生产月活动总结
2014/07/05 职场文书
MySQL索引篇之千万级数据实战测试
2021/04/05 MySQL
MySQL 如何限制一张表的记录数
2021/09/14 MySQL
MYSQL优化之数据表碎片整理详解
2022/04/03 MySQL
Spring Boot项目如何优雅实现Excel导入与导出功能
2022/06/10 Java/Android