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 相关文章推荐
建立良好体验度的Web注册系统ajax
Jul 09 Javascript
跨域请求之jQuery的ajax jsonp的使用解惑
Oct 09 Javascript
javascript实现滑动解锁功能
Dec 31 Javascript
用模版生成HTML的的框架jquery.tmpl使用详解
Jan 07 Javascript
javascript实现显示和隐藏div方法汇总
Aug 14 Javascript
JavaScript每天必学之基础知识
Sep 17 Javascript
微信小程序 slider的简单实例
Apr 19 Javascript
JS实现加载和读取XML文件的方法详解
Apr 24 Javascript
详解vue-cli开发环境跨域问题解决方案
Jun 06 Javascript
使用vue和datatables进行表格的服务器端分页实例代码
Jun 07 Javascript
手把手教你使用TypeScript开发Node.js应用
May 06 Javascript
JS图片懒加载的优点及实现原理
Jan 10 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中目录,文件操作详谈
2007/03/19 PHP
php实现阿拉伯数字和罗马数字相互转换的方法
2015/04/17 PHP
PHP堆栈调试操作简单示例
2018/06/15 PHP
由prototype_1.3.1进入javascript殿堂-类的初探
2006/11/06 Javascript
javascript 页面划词搜索JS
2009/09/28 Javascript
js word表格动态添加代码
2010/06/07 Javascript
js判断两个日期是否相等的方法
2013/09/10 Javascript
JavaScript中的apply和call函数详解
2014/07/20 Javascript
nodejs中操作mysql数据库示例
2014/12/20 NodeJs
深入理解JS函数的参数(arguments)的使用
2016/05/28 Javascript
浅谈js数组和splice的用法
2016/12/04 Javascript
jQuery实现的分页功能示例
2017/01/22 Javascript
使用Bootstrap美化按钮实例代码(demo)
2017/02/03 Javascript
jQuery实现鼠标响应式淘宝动画效果示例
2018/02/13 jQuery
js中时间格式化的几种方法
2018/07/22 Javascript
微信小程序scroll-view实现滚动穿透和阻止滚动的方法
2018/08/20 Javascript
Vue.js实现表格渲染的方法
2018/09/07 Javascript
vue在自定义组件中使用v-model进行数据绑定的方法
2019/03/25 Javascript
微信小程序canvas绘制圆角base64图片的实现
2019/08/18 Javascript
JavaScript装箱及拆箱boxing及unBoxing用法解析
2020/06/15 Javascript
VUE 单页面使用 echart 窗口变化时的用法
2020/07/30 Javascript
Python模拟登录验证码(代码简单)
2016/02/06 Python
Python面向对象之继承和组合用法实例分析
2018/08/27 Python
浅谈django2.0 ForeignKey参数的变化
2019/08/06 Python
python内存管理机制原理详解
2019/08/12 Python
给你一面国旗 教你用python画中国国旗
2019/09/24 Python
Python+Selenium随机生成手机验证码并检查页面上是否弹出重复手机号码提示框
2020/09/21 Python
Appium+Python实现简单的自动化登录测试的实现
2021/01/26 Python
10个顶级Python实用库推荐
2021/03/04 Python
SKECHERS斯凯奇中国官网:来自美国的运动休闲品牌
2018/11/14 全球购物
PatPat香港:婴童服饰和亲子全家装在线购物
2020/09/27 全球购物
新三好学生主要事迹
2014/01/23 职场文书
关于读书的演讲稿800字
2014/08/27 职场文书
迎新年主持词
2015/07/06 职场文书
MySQL分区表实现按月份归类
2021/11/01 MySQL
讲解MySQL增删改操作
2022/05/06 MySQL