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的Eval函数
Jul 26 Javascript
JavaScript实现的链表数据结构实例
Apr 02 Javascript
在JavaScript中访问字符串的子串
Jul 07 Javascript
js创建jsonArray传输至后台及后台全面解析
Apr 11 Javascript
微信小程序网络请求wx.request详解及实例
May 18 Javascript
layui选项卡效果实现代码
May 19 Javascript
JS实现身份证输入框的输入效果
Aug 21 Javascript
thinkjs 文件上传功能实例代码
Nov 08 Javascript
Angular2.0/4.0 使用Echarts图表的示例代码
Dec 07 Javascript
jQuery实现ajax回调函数带入参数的方法示例
Jun 26 jQuery
JS数组reduce()方法原理及使用技巧解析
Jul 14 Javascript
在Vuex中Mutations修改状态操作
Jul 24 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生成缩略图的类代码
2008/10/02 PHP
PHP实现的回溯算法示例
2017/08/15 PHP
php抽象类和接口知识点整理总结
2019/08/02 PHP
php写app用的框架整理
2019/09/29 PHP
javascript中callee与caller的用法和应用场景
2010/12/08 Javascript
JS模拟面向对象全解(二、类型与赋值)
2011/07/13 Javascript
JS获取DropDownList的value值与text值的示例代码
2014/01/07 Javascript
JavaScript lastIndexOf方法入门实例(计算指定字符在字符串中最后一次出现的位置)
2014/10/17 Javascript
基于jQuery实现下拉框
2014/11/24 Javascript
分享两款带遮罩的jQuery弹出框
2015/12/30 Javascript
BootStrap智能表单实战系列(八)表单配置json详解
2016/06/13 Javascript
Js查找字符串中出现次数最多的字符及个数实例解析
2016/09/05 Javascript
详解Angular2组件之间如何通信
2017/06/22 Javascript
浅谈JS如何实现真正的对象常量
2017/06/25 Javascript
ES6之模版字符串的具体使用
2018/05/17 Javascript
Vue SSR 即时编译技术的实现
2020/05/06 Javascript
[40:05]DOTA2上海特级锦标赛A组小组赛#1 EHOME VS MVP.Phx第一局
2016/02/25 DOTA
python中的对象拷贝示例 python引用传递
2014/01/23 Python
解决Python中由于logging模块误用导致的内存泄露
2015/04/23 Python
python实现在windows下操作word的方法
2015/04/28 Python
详解python中xlrd包的安装与处理Excel表格
2016/12/16 Python
python实现最长公共子序列
2018/05/22 Python
Python设计模式之组合模式原理与用法实例分析
2019/01/11 Python
python安装pywin32clipboard的操作方法
2019/01/24 Python
pandas.DataFrame.drop_duplicates 用法介绍
2020/07/06 Python
Python Serial串口基本操作(收发数据)
2020/11/06 Python
加拿大百叶窗和窗帘定制网站:Blinds
2017/01/30 全球购物
意大利奢侈品牌在线精品店:Jole.it
2020/11/23 全球购物
PHP数据运算类型都有哪些
2013/11/05 面试题
枚举与#define宏的区别
2014/04/30 面试题
如何获得EntityManager
2014/02/09 面试题
2014年巴西世界杯口号
2014/06/05 职场文书
个人年终总结开头
2015/03/06 职场文书
php中配置文件保存修改操作 如config.php文件的读取修改等操作
2021/05/12 PHP
Python各协议下socket黏包问题原理
2022/04/12 Python
Golang 实现 WebSockets 之创建 WebSockets
2022/04/24 Golang