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 相关文章推荐
JavaScript弹出窗口方法汇总
Aug 12 Javascript
jQuery中ready事件用法实例
Jan 19 Javascript
分步解析JavaScript实现tab选项卡自动切换功能
Jan 25 Javascript
深入浅析JS的数组遍历方法(推荐)
Jun 15 Javascript
js实现倒计时及时间对象
Nov 15 Javascript
微信小程序实战之自定义toast(6)
Apr 18 Javascript
Vue.js鼠标悬浮更换图片功能
May 17 Javascript
vue 纯js监听滚动条到底部的实例讲解
Sep 03 Javascript
深入浅析javascript函数中with
Oct 28 Javascript
JavaScript键盘事件响应顺序详解
Sep 30 Javascript
基于JavaScript实现简单抽奖功能代码实例
Oct 20 Javascript
Vue组件简易模拟实现购物车
Dec 21 Vue.js
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 文件上传源码分析(RFC1867)
2009/10/30 PHP
检测png图片是否完整的php代码
2010/09/06 PHP
PHP获取ip对应地区和使用网络类型的方法
2015/03/11 PHP
360搜索引擎自动收录php改写方案
2018/04/28 PHP
javascript代码编写需要注意的7个小细节小结
2011/09/21 Javascript
CSS3 media queries结合jQuery实现响应式导航
2016/09/30 Javascript
基于jquery实现的鼠标悬停提示案例
2016/12/11 Javascript
基于jQuery实现顶部导航栏功能
2016/12/27 Javascript
Bootstrap源码解读模态弹出框(11)
2016/12/28 Javascript
使用Bootstrap + Vue.js实现添加删除数据示例
2017/02/27 Javascript
基于ajax实现上传图片代码示例解析
2020/12/03 Javascript
[00:53]2015国际邀请赛 中国区预选赛一触即发
2015/05/14 DOTA
[01:54]TI珍贵瞬间系列(五):压力
2020/08/29 DOTA
python的描述符(descriptor)、装饰器(property)造成的一个无限递归问题分享
2014/07/09 Python
详解在Python中处理异常的教程
2015/05/24 Python
Python实现的下载网页源码功能示例
2017/06/13 Python
使用python实现BLAST
2018/02/12 Python
对numpy的array和python中自带的list之间相互转化详解
2018/04/13 Python
在pycharm中设置显示行数的方法
2019/01/16 Python
python中hasattr()、getattr()、setattr()函数的使用
2019/08/16 Python
Python3批量移动指定文件到指定文件夹方法示例
2019/09/02 Python
pycharm无法导入本地模块的解决方式
2020/02/12 Python
Python3基于plotly模块保存图片表格
2020/08/03 Python
Python 3.9的到来到底是意味着什么
2020/10/14 Python
CSS3 border-image详解、应用及jQuery插件
2011/08/29 HTML / CSS
描述RIP和OSPF区别以及特点
2015/01/17 面试题
会计助理岗位职责
2014/02/17 职场文书
小学安全教育材料
2014/02/17 职场文书
大学生社团活动总结
2014/04/26 职场文书
《山谷中的谜底》教学反思
2014/04/26 职场文书
团队精神的演讲稿
2014/05/14 职场文书
某某同志考察材料
2014/05/28 职场文书
财政局党的群众路线教育实践活动整改方案
2014/09/21 职场文书
担保书范文
2015/01/20 职场文书
人事聘任通知
2015/04/21 职场文书
党员转正申请报告
2015/05/15 职场文书